キャラを[0][0]~[2][2]の配列の間を移動させるようにしたい

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

キャラを[0][0]~[2][2]の配列の間を移動させるようにしたい

#1

投稿記事 by Ouxiy » 1ヶ月前

コード:

#include "DxLib.h"



int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey() {
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
	for (int i = 0; i < 256; i++) {
		if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		}
		else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

	// プログラムは WinMain から始まります
	int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
	{
		SetGraphMode(1300, 680, 32); // ウィンドウの大きさを指定
		ChangeWindowMode(TRUE);

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


		//キー取得用配列
		//char key[256];
		//x座標
		int playerX = 0; // X座標
		int playerY = 300; // Y座表
		int a[2][2];//移動制限のための配列の変数
	    

		//グラフィックハンドル格納用配列
		int gh[12];
		LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);
		DrawGraph(playerX, playerY, gh[8], FALSE);// プレイヤーの画像を描画
		
		

		while (ScreenFlip() == 0 && ProcessMessage() == 0&& gpUpdateKey() == 0) {
		
				int 加算=70;
				int b = 70;
				
				
				// カーソルキーの右が押されている
				if (Key[KEY_INPUT_RIGHT] == 1) {

					
						
							playerX = playerX + 加算; // プレイヤーのX座標を加算//左だけplayerX2とするとfor文ではないので、一回しか起きない、playerXだとplayerX = playerX + 加算より、加算されたあとのplayerXが再び右辺のplayerXに入り加算されるを繰り返すため∞に右に行けるのだ
							// 画面に出力
							ScreenFlip();
							// 画面をクリア
							ClearDrawScreen();
							// プレイヤーの画像を描画
							DrawGraph(playerX, playerY, gh[2], true);//DrawGraphはLoadDivGraphにより12分割された配列の一つである、gh[8]を描画できる関数である。


				}
				else { while (DrawGraph(playerX, playerY, gh[8], true)); }//右を押されて加算されていく中で、もし加算されない間はキャラの描画はgh[8]にする。elseを付けることで条件を否定できる。
				
				if (Key[KEY_INPUT_UP] == 1) {
					playerY = playerY - b; // プレイヤーのY座標を加算

					// 画面に出力
					ScreenFlip();
					// 画面をクリア
					ClearDrawScreen();
					// プレイヤーの画像を描画
					DrawGraph(playerX, playerY, gh[5], true);
				}


					if (Key[KEY_INPUT_LEFT] == 1){
						playerX = playerX - 加算; // プレイヤーのX座標を加算


						// 画面をクリア
						ClearDrawScreen();
						// プレイヤーの画像を描画
						DrawGraph(playerX, playerY, gh[1], true);

					}

				
					if (Key[KEY_INPUT_DOWN] == 1) {
						playerY = playerY + b; // プレイヤーのY座標を加算

						// 画面に出力
						ScreenFlip();
						// 画面をクリア
						ClearDrawScreen();
						// プレイヤーの画像を描画
						DrawGraph(playerX, playerY, gh[11], true);
					}
			
		}

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

		return 0;                // ソフトの終了 

	}
配列int a[2][2]に関して4っつの(Key[KEY_INPUT_XXXX] == 1)によってキャラを[0][0]~[2][2]の配列の間を移動させるようにしたいのですが、これはfor文で解決できるでしょうか。できない場合はどんな風にプログラムを組めば良いでしょうか。
どうかお願いいたします

アバター
みけCAT
記事: 6216
登録日時: 8年前
住所: 千葉県
連絡を取る:

Re: キャラを[0][0]~[2][2]の配列の間を移動させるようにしたい

#2

投稿記事 by みけCAT » 1ヶ月前

「キャラを[0][0]~[2][2]の配列の間を移動させる」というのは意味がよくわからないですが、
for文で解決できそうだと思います。

そもそも、「for文で解決」の定義がよくわかりません。

コード:

for (;;) {
    解決するコード
    break;
}
とすれば「for文で解決」したことになるのでしょうか?
オフトピック
このコードには前の質問のコードと同様に
  • ScreenFlip();やClearDrawScreen();があちこちで呼ばれていてよくない
  • SetDrawScreen(DX_SCREEN_BACK); (など) で描画先を裏画面にしていないのにScreenFlip();を使っている
という問題がある上、

コード:

while (DrawGraph(playerX, playerY, gh[8], true));
の部分は、何らかの原因でDrawGraphが失敗する場合に
メッセージの処理をしない無限ループになってしまう可能性が高く、よくないでしょう。

さらに、インデントも乱れていてよくないですね。
(同じ論理階層でも幅が違う場所がある、1階層下がったときに増やす幅が統一されていない)

まあ、宗教上の理由などで直したくないのであれば、無理に直すことはないでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ouxiy
記事: 128
登録日時: 1ヶ月前

Re: キャラを[0][0]~[2][2]の配列の間を移動させるようにしたい

#3

投稿記事 by Ouxiy » 1ヶ月前

ありがとうございます。
宗教ではないですが、なんだかこだわりが合って、ですが、私のスキルを基準にしては伸びないので、みけさんのコードを読んでそこからスキルを磨きます。

返信

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