ゲーム数学、画面を時計回りに移動するプログラムを作りたい(dxライブラリ)
[////]コメント部にあるように"時計回りに円を描くように正確に回る"
プログラムを作りたいのですが画面中央から角度を指定して座標を計算して座標を算出すればいいのかな?と思うのですがspeedの部分を考えると実装の仕方がわかりません。
教えてくれますでしょうか?。
#include "DxLib.h"
#include "math.h"
//#include <iostream>
const double PI = 3.14159265359;
const double angle = PI / 180.0;
int hblock;
int color = GetColor(255, 255, 255);
//double angle_r[361];//角度の座標の計算結果
/*画面のサイズ 640,480*/
constexpr double screenmax_x = 640;
constexpr double screenmax_y = 480;
constexpr double playersize_x = 64;
constexpr double playersize_y = 64;
constexpr double screensize_x = 640 - playersize_x;//576
constexpr double screensize_y = 480 - playersize_y;//416
constexpr double centerpos_x = (640 / 2) - 32;
constexpr double centerpos_y = (480 / 2) - 32;
/*座標*/
typedef struct position_ {
double x;
double y;
}position;
position pos[361] = {0.0,0.0};//初期化
double pos_x = centerpos_x;
double pos_y = centerpos_y;
double speed = 1.0;
/*フラグ系*/
bool f_screenedge = false;//画面の端に到達したかどうかのを判定するフラグ変数
bool f = false;
/*一時的*/
double p = (screenmax_y / 4) - (playersize_y / 2);
void pos_f_screenedge() {//画面の端に到達しらtrue
if (pos_x >= 640 - 64 || pos_y >= 480 - 64 || pos_x <= 0 || pos_y <= 0) {
f_screenedge = true;
}
else {
f_screenedge = false;
}
}
/*座標を表示する関数*/
void Player_Log() {
DrawFormatString(0, 0, color, "pos_x:%lf", pos_x);
DrawFormatString(0, 15, color, "pos_y:%lf", pos_y);
DrawFormatString(0, 30, color, "f_screenedge:%d", f_screenedge);
}
/*操作関数*/
void Player_Control(){
if (CheckHitKey(KEY_INPUT_UP) >= 1 ) {
pos_y -= speed;
}
if (CheckHitKey(KEY_INPUT_DOWN) >= 1 ) {
pos_y += speed;
}
if (CheckHitKey(KEY_INPUT_LEFT) >= 1 ) {
pos_x -= speed;
}
if (CheckHitKey(KEY_INPUT_RIGHT) >= 1 ) {
pos_x += speed;
}
}
void pos_angle(const double &s) {//角度の座標を計算する関数
for (int i = 0; i < 361; i++) {
pos[i].x = s * cos(angle * i);
pos[i].y = s * sin(angle * i);
}
}
/*初期化*/
void Player_Initialization() {
pos_angle(speed);//角度を計算
hblock = LoadGraph("Block.png");
}
/*描画*/
void Player_Draw() {
DrawGraph(static_cast<int>(pos_x), static_cast<int>(pos_y), hblock, TRUE);
}
void outscreen() {//画面外に出たときに画面の外に出ないようにする処理
if (pos_x > screensize_x) {
pos_x = screensize_x;
}
if (pos_x < 0) {
pos_x = 0;
}
if (pos_y > screensize_y) {
pos_y = screensize_y;
}
if (pos_y < 0) {
pos_y = 0;
}
}
/*更新*/
//////////////////////////////////////////////
//double x = speed * cos(angle * 45);
//double y = speed * sin(angle * 45);
void Player_Update() {
Player_Control();//操作関数
pos_f_screenedge();//画面の判定関数
//pos_x += pos[90].x;
//pos_y -= pos[90].y;
// pos_x += pos[0].x;
// pos_y -= pos[0].y;
}
//////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstanve, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ ChangeWindowMode(true), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
Player_Initialization();//初期化
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
Player_Update();
outscreen();
Player_Draw();
Player_Log();//数値表示
if (CheckHitKey(KEY_INPUT_ESCAPE) == 1 || CheckHitKey(KEY_INPUT_RETURN) == 1) {
return -1;
}
}
WaitKey();
return 0;
}