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

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

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

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

C++

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

DXライブラリ

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

Q&A

解決済

1回答

1709閲覧

特定の座標を取得する方法

maguro2020

総合スコア34

C

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

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2022/04/03 03:54

概要
現在、Dxライブラリを用いてゲームを制作しております。
ある地点に到着した際に、ゴールとしたいのですが、特定の地点の座標の取得がうまくできていない状況となっております。

コード

C/C++

1#include "gamemain.h" 2 3char g_mapdata[MAP_HEIGHT][MAP_WIDTH + 1]; 4StageData g_stagedata; 5char goal; 6 7 8void GameMain() { 9 // アニメーションカウンタ 10 g_stagedata.animcounter++; 11 g_stagedata.animcounter &= MAXINT; 12 int ac = g_stagedata.animcounter / ANIM_RATE; 13 int eac = g_stagedata.animcounter / ANIM_RATE_CANNON; 14 int bac = g_stagedata.animcounter / ANIM_RATE_BOSS1; 15                   ・ 16                   ・ 17                   ・ 18                  (中略) 19 // 次のステージへ 20 if (g_stagedata.hero.x >= (g_stagedata.mapwidth - 1) * IMG_CHIPSIZE) { 21 g_gamestate = NEXT_STAGE; 22 g_timerstart = g_lasttime; 23 } 24 25 // ゲームクリア判定(未完成) 26 // IMG_CHIPSIZEは定数の50 27 if (g_stagedata.hero.x >= (goal * IMG_CHIPSIZE)) { 28 g_gamestate = GAME_CLEAR; 29 g_timerstart = g_lasttime; // タイマーセット 30 } 31} 32 33void DrawMap() { 34 int sc = (int)(g_stagedata.scrollx / IMG_CHIPSIZE); 35 int shiftx = (int)g_stagedata.scrollx % IMG_CHIPSIZE; 36 for (int y = 0; y < MAP_HEIGHT; y++) { 37 for (int x = 0; x < SCR_WIDTH + 1; x++) { 38 if (x + sc >= g_stagedata.mapwidth) break; 39 // ブロック1 40 if (g_mapdata[y][x + sc] == '1') { 41 DrawGraph(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE, 42 g_imghandles.block, TRUE); 43                   ・ 44                   ・ 45                   ・ 46                  (中略) 47 // ブロック4(ゴール) 48 if (g_mapdata[y][x + sc] == '4') { 49 DrawGraph(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE, 50 g_imghandles.goal, TRUE); 51 goal = g_mapdata[y - 1][x + sc]; 52 } 53 } 54 } 55}

発生している問題
上記のコードより、「ブロック4」の上に操作キャラ(hero)が来た時、ゲームステータス(g_gamestate)をゲームクリア(GAME_CLEAR)としたい(ゲームクリア判定)のですが、なかなかうまくできません。次のステージへ行く処理はできているため、同じような処理でゲームクリアにできると考えていたのですが、うまくできませんでした。もし何かご存じのかたがいらっしゃいましたら、アドバイスなどでも構いませんので、ご助言いただけたら幸いです。

補足
ステージはテキストファイルにて、作成をしております。
値が「0」であれば何もない、「1」ならばブロック1を描画、そして「4」ならばブロック4(ゴール)を描画するような処理にしております。
ただ、ゴールといっても、ただ他のブロックと色が違うだけで、ブロック自体に特に処理は入れておりません。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2022/04/03 05:27

「なかなかうまくできません」を説明して。 ゴール判定のif 内には入るんですか? そしてそのとき何したいんですか?
maguro2020

2022/04/03 05:56

ご回答してくださりありがとうございます。 自分が行いたいことは、以下の流れになります。 1.DrawMapにて、マップデータを描画。 2.g_mapdata[y][x + sc] == '4'であったとき、ブロック4を描画し、かつそのときの座標を取得。 3.取得したデータをグローバル変数に格納する。(この処理がうまく描けません) 4.GameMain関数内のゲームクリアの処理にて、主人公の現在の位置と上記で格納したゴールの座標の位置を比較し、値が等しいもしくは以上であれば、gamestateをGAME_CLEARにする。 わかりづらい質問となってしまい、申し訳ありません。
guest

回答1

0

ベストアンサー

②のところでゲームクリア判定①に使用している変数goalに値を入れていますが、これではgoalの値は0,1,4にしかならず、 ①の判定式が意味をなさなくなります。

C++

1void GameMain() { 2 // ゲームクリア判定(未完成) 3 // IMG_CHIPSIZEは定数の50 4 if (g_stagedata.hero.x >= (goal * IMG_CHIPSIZE)) { //① 5 g_gamestate = GAME_CLEAR; 6 g_timerstart = g_lasttime; // タイマーセット 7 } 8} 9 10void DrawMap() { 11 // ブロック4(ゴール) 12 if (g_mapdata[y][x + sc] == '4') { 13 DrawGraph(x * IMG_CHIPSIZE - shiftx, y * IMG_CHIPSIZE, 14 g_imghandles.goal, TRUE); 15 goal = g_mapdata[y - 1][x + sc]; //② 16 } 17 } 18 } 19} 20コード

goalがどういった意図の変数なのかちょっと図りかねるので正確にお答えできないですが、ゴールの判定は直接g_mapdata[][]を参照すればよいので、おそらくgoal自体が不要かと思います。

C++

1void GameMain() { 2 // ゲームクリア判定 3 // IMG_CHIPSIZEは定数の50 4 const int hx = g_stagedata.hero.x/IMG_CHIPSIZE; 5 const int hy = g_stagedata.hero.y/IMG_CHIPSIZE; 6 7 if (g_mapdata[hy][hx] == 4)) { 8 g_gamestate = GAME_CLEAR; 9 g_timerstart = g_lasttime; // タイマーセット 10 } 11}

なお、'4'は文字の4を表すので、数値の判定では =='4'ではなく==4とする必要があります。
また、0,1,4などの数値はそのまま使わず、#defineやenumを用いて、意味のある名前を付けたほうがよいです。

C++

1#define MAPCHIP_BLANK 0 2#define MAPCHIP_BLOCK 1 3#define MAPCHIP_GOAL 4 4or 5enum { 6MAPCHIP_BLANK, // 何も指定しないと0から順番に1,2,3... となる 7MAPCHIP_BLOCK, 8MAPCHIP_GOAL = 4, 9};

投稿2022/04/03 05:27

Serbonis

総合スコア581

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maguro2020

2022/04/03 06:31

ご回答してくださりありがとうございます。 自分の質問が不適切であったために、わかりづらい説明となってしまい、申し訳ありません。 自分が行いたいことは、以下の流れになります。 1.DrawMapにて、マップデータを描画。 2.g_mapdata[y][x + sc] == '4'であったとき、ブロック4を描画し、かつそのときの座標を取得。 3.取得したデータをグローバル変数に格納する。(変数のgoalはこのために用意しました。知識不十分のため、用意したことが正しいのかはわかっておりません。) 4.GameMain関数内のゲームクリアの処理にて、主人公の現在の位置と上記で格納したゴールの座標の位置を比較し、値が等しいもしくは以上であれば、gamestateをGAME_CLEARにする。 先程、Serbonis様にご回答してくださったことを参考に描いてみましたが、うまくゲームクリアの処理になりませんでした。(バグやエラーなどは発生しておりません。) また、簡易的ではありますがゲームの画面のイメージを記載させていただきます。 以下はゲーム画面の例(テキストファイルより) 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 00000000000000000000000000000000000000000 0000A00000000000000000000000000000000☆00 11111111111111111111111111111111111111B11 0は何も無し 1はブロック1 Aは主人公(ヒーロー) Bはゴール 上記のようになっております。この場合、Bの一つ上のマス(☆の位置です)に来た時にgamestateをGAME_CLEARにしたいと考えております。 大変貴重なアドバイスをしてくださりありがとうございます。もう少し自分で考えてみたいと思います。
Serbonis

2022/04/03 06:54

>2.g_mapdata[y][x + sc] == '4'であったとき、ブロック4を描画し、かつそのときの座標を取得。 goal = g_mapdata[y - 1][x + sc]; これは座標を取得しているのではなく、描画するブロックの種類(0,1,4)を取得しています。 座標を取得するなら、単純に下記のとおりです。 goal = x;
Serbonis

2022/04/03 07:13 編集

DXライブラリならDrawFormatStringという関数で画面内に文字が表示できるので、変数が自分の想定している値になっているか、これで確認するとよいかと思います。 void DrawMap() { DrawFormatString( 0, 0, GetColor(255,255,255), "goal = %d", goal ); : }
maguro2020

2022/04/03 07:45

ご回答してくださりありがとうございます。 Serbonis様のおかげで、ゴールを実装することができました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問