ロックマンエグゼのような3*3マスを移動できるようにしたい
環境
Visual Studio 2019
DXライブラリ
C言語、C++
#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];
//1. 3x3マスの2次元配列
int pos[][3] = {
{0, 0, 0 },
{0, 0, 0 },
{0, 0, 0 }
};
int playerX = 0; // キャラのX座標
int playerY = 300; // キャラのY座表
//double a[2][2];//移動制限のための配列の変数
int x = 0;
int y = 0;
//グラフィックハンドル格納用配列
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; // ソフトの終了
}
実行したいこと
ロックマンエグゼのようにキャラクターを3*3マスを自由に移動できるようなプログラムをfor (y = 0;y < 3; y++) {
for (x = 0; x < 3; x++) {を用いて可能にしようと思うのですが、どのようにして関数if (Key[KEY_INPUT_RIGHT]==1) {}に加えればよいか悩んでいます。
以下に間違ってはいますが、私なりに書いたプログラムを書かせて頂きます。
// カーソルキーの右が押されている
if (Key[KEY_INPUT_RIGHT]==1) {
playerX = playerX + 加算;
double[1][1]=playerX;
// 画面に出力
ScreenFlip();
// 画面をクリア
ClearDrawScreen();
// プレイヤーの画像を描画
DrawGraph(double[1][1], playerY, gh[2], true);
}
右キーによりキャラが座標[1][1]に移動して、座標[1][1]での描画される画像は gh[2]となる。ことを表したプログラムです。これにfor (y = 0;y < 3; y++) {
for (x = 0; x < 3; x++) {を加えれば、解決するのではないかと思っていたりします。
以上のプログラムにおいて、なぜそのように置けないのか、もしプログラムのまま置くとしたら何が必要かを是非教えてほしいです。というのも今後の自己解決力を高めるためです。ご協力お願いいたします。
もしforの文と配列で今回行いたいことを全コードを書いていただけるならば、なぜそのようにおけるのか引数を使う場合は()、どんな処理をさせたいかは{}を使うなどのように細かく解説して頂けると今後の自己解決力に繋がるのでよろしくお願いいたします。