ジャンプの描画について

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

ジャンプの描画について

#1

投稿記事 by おすし » 5年前

DXLibを使ってキャラをジャンプさせたり左右に動かしたりしていたのですが、他の部分を色々弄っているうちにジャンプの挙動がおかしくなってしまいました。
具体的に言うとジャンプ+方向キーで斜めにジャンプしていたのが物凄い勢いで真横に移動してしまうようになります。
初心者なので解りにくいところや変な書き方をしているところなど多々あると思いますが、どうかご教授お願いします。使用言語はC++です。

コード:


#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	ChangeWindowMode(TRUE);
	int kooraX, kooraY, kooraGraph;
	int tutiGraph, yamaGraph,capGraph;

	if (DxLib_Init() == -1)	// DXライブラリ初期化処理
	{
		return -1;				// エラーが起きたら直ちに終了
	}

	SetDrawScreen(DX_SCREEN_BACK);

	kooraGraph = LoadGraph("コーラ.png");
	capGraph = LoadGraph("キャップ.png");
	tutiGraph = LoadGraph("土.png");
	yamaGraph = LoadGraph("山.png");

	kooraX = 0; kooraY = 300;
	while (1)
	{

		ClearDrawScreen();
		{
			int i;

			if (CheckHitKey(KEY_INPUT_S) == 1) kooraX += 3;                  //右へ
			if (CheckHitKey(KEY_INPUT_A) == 1) kooraX -= 3;                  //左へ
			if (CheckHitKey(KEY_INPUT_W) == 1)                               //ジャンプ
			{


				for (i = 1; i <= 15; i++)
				{
					if (CheckHitKey(KEY_INPUT_S) == 1) kooraX += 3;
					if (CheckHitKey(KEY_INPUT_A) == 1) kooraX -= 3;
					kooraY = -3;
					DrawGraph(kooraX, kooraY, kooraGraph, TRUE);
					WaitTimer(1);
					ClearDrawScreen();
				}
				for (i = 1; i <= 15; i++)
				{
					if (CheckHitKey(KEY_INPUT_S) == 1) kooraX += 3;
					if (CheckHitKey(KEY_INPUT_A) == 1) kooraX -= 3;
					kooraY = -3;
					DrawGraph(kooraX, kooraY, kooraGraph, TRUE);
					WaitTimer(1);
					ClearDrawScreen();

				}


			}
			if (CheckHitKey(KEY_INPUT_D) == 1)                                  //球を打つ処理
			{
				int capX, capY;
				capX = kooraX + 30; capY = kooraY - 5;

				for (i = 1; i <= 100; i++)
				{

					DrawGraph(capX + i + 10, capY, capGraph, TRUE);
					DrawGraph(kooraX, kooraY, kooraGraph, TRUE);
					if (CheckHitKey(KEY_INPUT_A) == 1) kooraX -= 3;
					if (CheckHitKey(KEY_INPUT_S) == 1) kooraX += 3;

					ScreenFlip();
					WaitTimer(1);
					ClearDrawScreen();
					if ((CheckHitKey(KEY_INPUT_ESCAPE) == 1) || (CheckHitKey(KEY_INPUT_D) == 1)) break;
				}

			}
		}

		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) break;                         //escキーで終了

		DrawGraph(kooraX, kooraY, kooraGraph, TRUE);

		ScreenFlip();

	}
	

	DxLib_End();				// DXライブラリ使用の終了処理

	return 0;					// ソフトの終了
}


アバター
もるも
記事: 54
登録日時: 8年前
連絡を取る:

Re: ジャンプの描画について

#2

投稿記事 by もるも » 5年前

whileのループ内で、
一度のキー入力の左右移動判定で計算された後さらに

コード:

for (i = 1; i <= 15; i++)
				{
					if (CheckHitKey(KEY_INPUT_S) == 1) kooraX += 3;
					if (CheckHitKey(KEY_INPUT_A) == 1) kooraX -= 3;
					kooraY = -3;
					DrawGraph(kooraX, kooraY, kooraGraph, TRUE);
					WaitTimer(1);
					ClearDrawScreen();
				}
ここで一気に15回計算されていることになります。
処理が早すぎてWaitTimer()を使っているとお見受けしますが、for文は無くした方がいいでしょう。
↑のようなたった一つだけのループで時間制御する場合はWaitTimerを挟むのはアリですが、
分岐があるプログラムでWaitTimer()が乱立すると処理時間が安定しないので見直されることをおすすめします。

↓このページの2番目の項目よかったら見てみてください。
新・C言語ゲームプログラミング館 補足資料.11章 書いてはいけない4つの処理
https://dixq.net/g/h_11.html

おすし
記事: 9
登録日時: 5年前

Re: ジャンプの描画について

#3

投稿記事 by おすし » 5年前

了解しました。試してみます!

返信

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