環境
- Windows10
- visual studio 2019
- DXライブラリ
行いたいこと
例えばプログラムに書いてある座標(nx,ny)=(2,2)に位置するキャラが右に動く際にnx=nx+1にnx=2を代入させて、idou[nx + 1][ny + 0] は
idou[3][2] となり、配列idou[5][5]よりidou[3][2] の座標の位置は0なので移動可能となり、キャラが描画できるというプログラムを作りたいです。
以上の説明はあくあで一例です。出来れば、以上をループのようにして、どの座標からでも右のキーを押すたびに配列idou[nx + 1][ny + 0]から右に移動可能か判断して右に一マス進むようにしたいです。
これは、自分なりに以下のようにプログラムを作りました。ですがうまく機能していません。
出来ればプログラムの原型を崩さずに右キーを押すたびに右に一マス動けるようにしたいです。
if (Key[KEY_INPUT_RIGHT] == 1) { if (idou[nx + 1][ny + 0] == idou[3][0]) {// 移動可能にして、その座標に移動する nx = nx + 1; nx == 3; idou[nx + 1][ny + 0] == idou[3][2]; playerphoto = gh[7]; }
そして、以下は全体のプログラムです。
#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(1600, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); int playerphoto; int nx=2, ny =2 ; // 最初のキャラのX座をdxとY座標をdyである。配列の真ん中の0を最初の座標としたため(2,2)となる if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } //1. 3x3マスの2次元配列 int idou[5][5] = { {1,1,1,1,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,1,1,1,1 }, }; //DrawGraph(dx, dy, playerphoto, FALSE); //グラフィックハンドル格納用配列 int gh[12]; LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);//画像読み込み SetDrawScreen(DX_SCREEN_BACK); while (ScreenFlip() == 0 && ProcessMessage() == 0 && gpUpdateKey() == 0) { DrawGraph(nx, ny, gh[5], FALSE);// プレイヤーの画像を描画 // カーソルキーの右が押されている if (Key[KEY_INPUT_RIGHT] == 1) { if (Key[KEY_INPUT_RIGHT] == 1) { if (idou[nx + 1][ny + 0] == idou[3][0]) {// 移動可能にして、その座標に移動する nx = nx + 1; nx == 3; idou[nx + 1][ny + 0] == idou[3][2]; playerphoto = gh[7]; } else if (nx == 1 && idou[nx + 1] == idou[2]) { // 移動不可能 playerphoto = gh[9]; } if (Key[KEY_INPUT_LEFT] == 1) { nx = nx - 1; playerphoto = gh[2]; } if (Key[KEY_INPUT_UP] == 1) { ny = ny + 1; playerphoto = gh[4]; } if (Key[KEY_INPUT_DOWN] == 1) { ny = ny - 1; playerphoto = gh[3]; } if (nx == 0 && ny == 0) { playerphoto = gh[7]; } ScreenFlip(); // 画面をクリア ClearDrawScreen(); DrawGraph(nx, ny, playerphoto, FALSE); } } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
編集が遅くなりました。すいません。jimbeさんのプログラムをそのまま入れてみました。ですが、思うように動きませんでした。もしかしたら組み込む場所が違ったのかもしれません。
#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(1600, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); int playerphoto; int nx=2, ny =2 ; // 最初のキャラのX座をdxとY座標をdyである。配列の真ん中の0を最初の座標としたため(2,2)となる if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } //1. 3x3マスの2次元配列 int idou[5][5] = { {1,1,1,1,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,0,0,0,1 }, {1,1,1,1,1 }, }; //DrawGraph(dx, dy, playerphoto, FALSE); //グラフィックハンドル格納用配列 int gh[12]; LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);//画像読み込み SetDrawScreen(DX_SCREEN_BACK); while (ScreenFlip() == 0 && ProcessMessage() == 0 && gpUpdateKey() == 0) { DrawGraph(nx, ny, gh[5], FALSE);// プレイヤーの画像を描画 // カーソルキーの右が押されている if (Key[KEY_INPUT_RIGHT] == 1) { //①if (idou[ny + 1][nx + 1]) {nx==0,}//紙を読む nx==0でidou[nx + 1]がidou[1]の時移動可能にして、その座標に移動する、nx==1でidou[nx + 1]がidou[2]の時移動不可能と //①のidou[ny + 1][nx + 1]を利用してif文で書きたいが、idou[ny + 1][nx + 1]を単体でidou[ny + 1]として使えるか? if (idou[nx + 1][ny + 0] == 0) { //移動しようとする先が空いていれば //移動可能 nx = nx + 1; //移動 playerphoto = gh[7]; } else { // 移動不可能 playerphoto = gh[9]; } if (Key[KEY_INPUT_LEFT] == 1) { nx = nx - 1; playerphoto = gh[2]; } if (Key[KEY_INPUT_UP] == 1) { ny = ny + 1; playerphoto = gh[4]; } if (Key[KEY_INPUT_DOWN] == 1) { ny = ny - 1; playerphoto = gh[3]; } if (nx == 0 && ny == 0) { playerphoto = gh[7]; } ScreenFlip(); // 画面をクリア ClearDrawScreen(); DrawGraph(nx, ny, playerphoto, FALSE); } } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
編集
入門書を見るなりしてjimbeさんから頂いたコードを正しく使おうとやっているのですが
どうもうまくいきません。
条件文としては正しいと思うのですが
右のキーが押される&右のマスが0という条件で
写真[7]を表示するプログラムとして
if (Key[KEY_INPUT_RIGHT] == 1) { if (idou[nx + 1][ny + 0] == 0) { //移動しようとする先が空いていれば //移動可能 nx = nx + 1; //移動 playerphoto = gh[7]; } else { // 移動不可能 playerphoto = gh[9]; } } と書いたんですが、うまくいきません。
jimbeさんのプログラム正しかったです。キャラの移動を50倍してみると正しく機能していることがわかりました。
回答4件
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2019/08/22 15:02