行いたいこと
画像のように3D っぽい2Dの9マスA~I上をキャラにキー入力で移動させたいのですが、
今の(自分と何人かの方の協力で出来た)コードから展開するにはどうすればいいでしょうか。
どうすればできるか
個人的には、3D っぽくなるように座標を前もって指定して、その上だけを動くように
すればいいと考えました。ですが、どのサイトを見てもそのようなやり方が出来そうな方法が書いておらず、出来るとしても行う方法がわからずに止まっています。
座標Eに関しては真ん中をEとして表せていると思います。
あとの残りは斜線っぽい感じの座標で、座標を指定して、そこにキャラが移動する形になると考えています。
以下は全体のコードです。初期値として座標nx,ny=(2,2)は中心Eを表しています。
#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); 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 }, }; //グラフィックハンドル格納用配列 int gh[12]; LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh);//画像読み込み int nx = 2, ny = 2; // 最初のキャラのX座をdxとY座標をdyである。配列の真ん中の0を最初の座標としたため(2,2)となる SetDrawScreen(DX_SCREEN_BACK); while (ProcessMessage() == 0 && gpUpdateKey() == 0) { int playerphoto = gh[5];//ループに入れてしまうと移動した際もずっとそこにあるんでダメ。(2,2)から存在して、ずっとあるようにするためループ内に書いた。 //DrawGraph(50 * nx, 50 * ny, playerphoto, FALSE);//一瞬ではなくずっとあるようにするためにループに書いた。 // カーソルキーの右が押されている if (Key[KEY_INPUT_RIGHT] == 1) if (idou[ny + 0][nx + 1] == 0) { //移動しようとする先が空いていれば //移動可能 nx = nx + 1; //移動 playerphoto = gh[6]; } if (Key[KEY_INPUT_LEFT] == 1) if (idou[ny + 0][nx - 1] == 0) { //移動しようとする先が空いていれば //移動可能 nx = nx - 1; //移動 playerphoto = gh[4]; } if (Key[KEY_INPUT_UP] == 1) if (idou[ny - 1][nx + 0] == 0) { //移動しようとする先が空いていれば //移動可能 ny = ny - 1; //移動 playerphoto = gh[2]; } if (Key[KEY_INPUT_DOWN] == 1) if (idou[ny + 1][nx + 0] == 0) { //移動しようとする先が空いていれば //移動可能 ny = ny + 1; //移動 playerphoto = gh[8]; } //ScreenFlip(); // 画面をクリア ClearDrawScreen(); DrawGraph(50 * nx, 50 * ny, playerphoto, FALSE); ScreenFlip(); } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }
マルチポストをしていた質問です。
https://dixq.net/forum/viewtopic.php?p=154122#p154122
いろんな考えが見たかった故にマルチポストしました。
どうもすいませんでした、。
マルチポストをして、
得た回答でこちらのプログラムを回答にさせていただきました。
以下のコードを使い行いたいことを実行しました。
#include "DxLib.h" int Key[256]; int gpUpdateKey() { char tmpKey[256]; GetHitKeyStateAll(tmpKey); for (int i = 0; i < 256; i++) (tmpKey[i] == 0) ? (Key[i] = 0) : Key[i]++; return 0; } 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 }, }; int box[4][7][2], player[5][5][2]; void init_box() { for (int j = 0; j < 7; j++) { int w = (j - 3) * 100, h = 600; for (int i = 4; --i >= 0; ) { box[i][j][0] = w + 400, box[i][j][1] = h - 200; w = w * 9 / 10, h = h * 9 / 10; } } for (int i = 1; i <= 3; i++) for (int j = 1; j <= 3; j++) { player[i][j][0] = (box[i-1][j-1][0] + box[i][j][0])/2 - 25; player[i][j][1] = (box[i-1][j-1][1] + box[i][j][1])/2 - 66; } } int WINAPI WinMain(HINSTANCE hi, HINSTANCE hp, LPSTR cl, int cs) { SetGraphMode(1200, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 init_box(); int boxColor = GetColor(160, 64, 64); int nx = 2, ny = 2; // プレイヤーの初期位置 int px = player[ny][nx][0], py = player[ny][nx][1]; // 表示位置 int keep = 0; // 移動不可能状態継続カウンタ int gh[12]; //グラフィックハンドル格納用配列 // 5:正面、7:右向き、2:左向き、4:上向き、3:下向き、9:移動不可 LoadDivGraph("charall.png", 12, 3, 4, 49, 66, gh); //画像読み込み int playerphoto = gh[5]; while (ProcessMessage() == 0) { gpUpdateKey(); // キーの入力状態を取得 if (Key[KEY_INPUT_RIGHT] == 1) { // 右キーが押されている if (idou[nx + 1][ny] == 0) { // 移動先が空いていれば nx++; playerphoto = gh[7]; // 右向き } else { keep = 1; playerphoto = gh[9]; // 移動不可能 } } if (Key[KEY_INPUT_LEFT] == 1) { if (idou[nx - 1][ny] == 0) { // 移動先が空いていれば nx--; playerphoto = gh[2]; // 左向き } else { keep = 1; playerphoto = gh[9]; // 移動不可能 } } if (Key[KEY_INPUT_UP] == 1) { if (idou[nx][ny - 1] == 0) { // 移動先が空いていれば ny--; playerphoto = gh[4]; // 上向き } else { keep = 1; playerphoto = gh[9]; // 移動不可能 } } if (Key[KEY_INPUT_DOWN] == 1) { if (idou[nx][ny + 1] == 0) { // 移動先が空いていれば ny++; playerphoto = gh[3]; // 下向き } else { keep = 1; playerphoto = gh[9]; // 移動不可能 } } ClearDrawScreen(); // 裏画面をクリア for (int i = 0; i < 4; i++) DrawLine(box[i][0][0], box[i][0][1], box[i][6][0], box[i][6][1], boxColor); for (int j = 0; j < 7; j++) DrawLine(box[0][j][0], box[0][j][1], box[3][j][0], box[3][j][1], boxColor); int x = player[ny][nx][0], y = player[ny][nx][1]; // 表示位置に変換 if (x == px && y == py) { if (keep == 0 || ++keep == 10) { keep = 0; playerphoto = gh[5]; } } else { if (abs(x - px) < 8) px = x; else if (x > px) px += 8; else if (x < px) px -= 8; if (abs(y - py) < 6) py = y; else if (y > py) py += 6; else if (y < py) py -= 6; } DrawGraph(px, py, playerphoto, FALSE); // プレイヤーを裏画面に描画 ScreenFlip(); // 裏画面を表画面に反映 } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }

回答3件
あなたの回答
tips
プレビュー