Dxlib 円運動の仕方がわからないです

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ゆーや
記事: 4
登録日時: 3年前

Dxlib 円運動の仕方がわからないです

#1

投稿記事 by ゆーや » 3年前

c言語 Dxlibにおいてある点を中心(Center)としてそこを軸に円運動をするプログラミングをしたいのですがどのようにすればよろしいのかが分からずてこずっています。よろしければコード等教えていただけると幸いです。初心者ですので難しいことはわからないです。申し訳ないです。


参照魚
記事: 109
登録日時: 6年前

Re: Dxlib 円運動の仕方がわからないです

#3

投稿記事 by 参照魚 » 3年前

例えば敵キャラの挙動とした場合だと、敵キャラの構造体に半径(radius)と回転角(rotate)をメンバーに持たせます。

コード:

struct ENEMY {
float centerx,centery;
float radius;
float rotate; 
};
敵キャラを表示する位置はざっくり下記のような式になります。

コード:

x = radius * cos( rotate ) + centerx;
y = radius * sin( rotate ) + centery;
時間経過でrotateを増やしていけばcenterx,yを中心に回転します。注意点はrotateは角度ではなくラジアンで管理することと、座標系によって sin/cos を入れ替えたり符号を反転させたりの調整が必要なことです。

ゆーや
記事: 4
登録日時: 3年前

Re: Dxlib 円運動の仕方がわからないです

#4

投稿記事 by ゆーや » 3年前

様々なものを参考にして自分なりに書いてみたのですが、、全然動く気配がないです、、改善点など手直しなどしていただけると助かります。

コード:

#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;
} 

ゆーや
記事: 4
登録日時: 3年前

Re: Dxlib 円運動の仕方がわからないです

#5

投稿記事 by ゆーや » 3年前

すみません描画の変数が間違えていました

返信

“C言語何でも質問掲示板” へ戻る