画像のように3D っぽい2Dの9マスA~I上をキャラにキー入力で移動させたい
Posted: 2019年8月22日(木) 23:43
画像のように3D っぽい2Dの9マスA~I上をキャラにキー入力で移動させたいのですが、
今の(自分と何人かの方の協力で出来た)コードから展開するにはどうすればいいでしょうか。
個人的には、3D っぽくなるように座標を前もって指定して、その上だけを動くように
すればいいと考えました。ですが、どのサイトを見てもそのようなやり方が出来そうな方法が書いておらず、出来るとしても行う方法がわからずに止まっています。
座標Eに関しては真ん中をEとして表せていると思います。
あとの残りは斜線っぽい感じの座標で、座標を指定して、そこにキャラが移動する形になると考えています。

イメージとして以下のようにドットキャラを置きます。

以下は全体のコードです。初期値として座標nx,ny=(2,2)は中心Eを表しています。
今の(自分と何人かの方の協力で出来た)コードから展開するにはどうすればいいでしょうか。
個人的には、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; // ソフトの終了
}