Dxlib 円運動の仕方がわからないです
Dxlib 円運動の仕方がわからないです
c言語 Dxlibにおいてある点を中心(Center)としてそこを軸に円運動をするプログラミングをしたいのですがどのようにすればよろしいのかが分からずてこずっています。よろしければコード等教えていただけると幸いです。初心者ですので難しいことはわからないです。申し訳ないです。
Re: Dxlib 円運動の仕方がわからないです
例えば敵キャラの挙動とした場合だと、敵キャラの構造体に半径(radius)と回転角(rotate)をメンバーに持たせます。
敵キャラを表示する位置はざっくり下記のような式になります。
時間経過でrotateを増やしていけばcenterx,yを中心に回転します。注意点はrotateは角度ではなくラジアンで管理することと、座標系によって sin/cos を入れ替えたり符号を反転させたりの調整が必要なことです。
時間経過でrotateを増やしていけばcenterx,yを中心に回転します。注意点はrotateは角度ではなくラジアンで管理することと、座標系によって sin/cos を入れ替えたり符号を反転させたりの調整が必要なことです。
Re: Dxlib 円運動の仕方がわからないです
様々なものを参考にして自分なりに書いてみたのですが、、全然動く気配がないです、、改善点など手直しなどしていただけると助かります。
#include "DxLib.h"
#include<math.h>
#include<time.h>
// ウィンドウのタイトルに表示する文字列
const char TITLE[] = "学籍番号 名前:タイトル";
// ウィンドウ横幅
const int WIN_WIDTH = 600;
// ウィンドウ縦幅
const int WIN_HEIGHT = 400;
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
// ウィンドウモードに設定
ChangeWindowMode(TRUE);
// ウィンドウサイズを手動では変更させず、
// かつウィンドウサイズに合わせて拡大できないようにする
SetWindowSizeChangeEnableFlag(FALSE, FALSE);
// タイトルを変更
SetMainWindowText(TITLE);
// 画面サイズの最大サイズ、カラービット数を設定(モニターの解像度に合わせる)
SetGraphMode(WIN_WIDTH, WIN_HEIGHT, 32);
// 画面サイズを設定(解像度との比率で設定)
SetWindowSizeExtendRate(1.0);
// 画面の背景色を設定する
SetBackgroundColor(0x00, 0x00, 0xFF);
// DXlibの初期化
if (DxLib_Init() == -1) { return -1; }
// (ダブルバッファ)描画先グラフィック領域は裏面を指定
SetDrawScreen(DX_SCREEN_BACK);
// 画像などのリソースデータの変数宣言と読み込み
// ゲームループで使う変数の宣言
float playerX = 0; //描画座標x
float playerY = 0; //描画座標y
float playerR = 10; //半径(描画用)
float centerX = 300; //中心座標x
float centerY = 200; //中心座標y
float playercenterAngle = 15; //角度
float playerLength = 60; //半径の長さ
int playerFlag = 0; //アイテム当たった時のフラグ1
int playerGraph = LoadGraph("player.png");
float radius = 0;
// 最新のキーボード情報用
char keys[256] = { 0 };
// 1ループ(フレーム)前のキーボード情報
char oldkeys[256] = { 0 };
// ゲームループ
while (1)
{
// 最新のキーボード情報だったものは1フレーム前のキーボード情報として保存
// 最新のキーボード情報を取得
GetHitKeyStateAll(keys);
// 画面クリア
ClearDrawScreen();
//--------- ここからプログラムを記述 ----------//
// 更新処理
radius = playercenterAngle * 3.14f / 180.0f; //度数法の角度を弧度法に変換
float addX = cos(radius) * playerLength; //三角関数を使用し、円の位置を割り出す。
float addY = sin(radius) * playerLength;
playerX = centerX + addX; //結果で出てきた位置を中心位置に加算し、それを描画位置とする
playerY = centerY + addY;
if (playerFlag == 0 ) { //フラグが0の時
playercenterAngle += 6.0f; //角度更新
}
// 描画処理
DrawGraph(centerX - 28, centerY - 28, playerGraph, TRUE);
//--------- ここまでにプログラムを記述 ---------//
// (ダブルバッファ)裏面
ScreenFlip();
// 20ミリ秒待機(疑似60FPS)
WaitTimer(20);
// Windowsシステムからくる情報を処理する
if (ProcessMessage() == -1)
{
break;
}
// ESCキーが押されたらループから抜ける
if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
{
break;
}
}
// Dxライブラリ終了処理
DxLib_End();
// 正常終了
return 0;
}