質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

解決済

画像のように3D っぽい2Dの9マスA~I上をキャラにキー入力で移動させたい

carnage0216
carnage0216

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

3回答

1評価

0クリップ

2215閲覧

投稿2019/08/22 15:01

編集2022/01/12 10:58

行いたいこと
画像のように3D っぽい2Dの9マスA~I上をキャラにキー入力で移動させたいのですが、
今の(自分と何人かの方の協力で出来た)コードから展開するにはどうすればいいでしょうか。
どうすればできるか
個人的には、3D っぽくなるように座標を前もって指定して、その上だけを動くように
すればいいと考えました。ですが、どのサイトを見てもそのようなやり方が出来そうな方法が書いておらず、出来るとしても行う方法がわからずに止まっています。

座標Eに関しては真ん中をEとして表せていると思います。
あとの残りは斜線っぽい感じの座標で、座標を指定して、そこにキャラが移動する形になると考えています。
キャラの移動する9マスです

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

以下は全体のコードです。初期値として座標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; // ソフトの終了

}

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

can110
can110

2019/08/24 05:10

https://teratail\.com/help#posted-otherservice やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。
can110
can110

2019/08/24 05:49

「どのように解決したか」も記載してください。
carnage0216
carnage0216

2019/08/24 05:50

えと、回答者カズマ様のおかげ解決したという回答を両方に書けばよいでしょうか。
can110
can110

2019/08/24 05:52

「行いたいこと」が実現できたコードを記載ください。
carnage0216
carnage0216

2019/08/24 05:53

あの、それはベストアンサーに書いてあり、選ばせて頂いたのですが、それではダメなのですか?
can110
can110

2019/08/24 06:00 編集

回答者カズマ様とは誰でしょうか? また、どのベストアンサーに「コード」が記載しているのか私には分かりませんのでダメではないでしょうか? 「行いたいこと」が実現できた「コード」を記載ください。
can110
can110

2019/08/24 06:04

コードはコードブロック```で囲んでください。 提示コードは質問者の環境で動作ができたか確認したでしょうか? また、「行いたいこと」が実現できたでしょうか?
carnage0216
carnage0216

2019/08/24 06:06

すいません。スマホで、少し扱いにくく、 私の誤りがあり、ベストアンサーはfana様ですが、 行いたい事が出来たのはkazuma-sさんのコードです。
can110
can110

2019/08/24 06:11

なお「解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」 すなわちteratail以外のマルチポスト先にもどのように解決したかを記載しましたか? していなければ記載ください。
fana
fana

2019/08/24 06:18

以前ベストアンサーを付け替えてるのを見た記憶があるので,変えれるんじゃないでしょうか. 必要なら変えても構いませんよ.(私はベストアンサーとか+評価とかに特にこだわりませんで)
carnage0216
carnage0216

2019/08/24 06:24

いえ、最初にfanaさんが考案された考えが私は気に入り、 それをコードにしてくださったkazuma-sなので、出来ればお二方をベストアンサーにしたいですが、それが出来ないため、fanaさんをベストアンサーに、コードをkazuma-sさんから頂きました。 私ごとでご迷惑をおかけしてすいません。
carnage0216
carnage0216

2019/08/24 06:26

can110さん、ありがとうございます。 わかりました。 もう一つの方にも使うコードを貼ります。
fana
fana

2019/08/24 06:30

(第三者が自治行為に出ちゃうと,何というか,自分が発端でそういう流れ呼び寄せちゃった感じ?で申し訳ない気分.(アイコンがとてもこわい!))
carnage0216
carnage0216

2019/08/24 06:33

一番は自分の責任です。 fanaさん、ご迷惑をかけてしまいすいません。
carnage0216
carnage0216

2019/08/24 07:22

can110さん確認お願いいたします。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。