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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

DXライブラリ

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

解決済

マップチップの当たり判定が反応しない

fkcz_yfm_carp
fkcz_yfm_carp

総合スコア4

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

DXライブラリ

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

1回答

0評価

0クリップ

921閲覧

投稿2021/09/03 09:19

前提・実現したいこと

DXライブラリを使用してアクションゲームを制作しています。
スクロールする背景を描画するためにマップチップを実装したところ問題が発生しました。

発生している問題・エラーメッセージ

プログラムは動いておりエラーメッセージも出ませんが、プレイヤー(player_t p1)がマップチップのブロック(Handle_mc[5])と接触しても当たり判定(bool coflag)がtrueになりません。

該当のソースコード

C++

// Main.cpp #include "DxLib.h" #include "Main.h" #include "Sound.h" #include "Player.h" extern int Handle_bgm; char Key[256]; bool initialize = true; bool finalize = false; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { if (ChangeWindowMode(TRUE) != 0) { return 0; } if (DxLib_Init() != 0) { return 0; } if (SetDrawScreen(DX_SCREEN_BACK) != 0) { return 0; } if (SetBackgroundColor(0, 0, 0) != 0) { return 0; } Sound_Initialize(); PlaySoundMem(Handle_bgm, DX_PLAYTYPE_LOOP); while (1) { if (ScreenFlip() != 0) { break; } if (ProcessMessage() != 0) { break; } if (ClearDrawScreen() != 0) { break; } if (GetHitKeyStateAll(Key) != 0) { break; } Player_Initialize(); Player_Update(); Player_Draw(); Player_Finalize(); } return 0; } //-------------------------------------------------- // Main.h #ifndef DEF_MAIN_H #define DEF_MAIN_H int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); #endif //-------------------------------------------------- // Player.cpp #include "DxLib.h" #include "Main.h" #include "Sound.h" #include "Player.h" extern char Key[256]; extern bool initialize; extern bool finalize; //マップチップ const int SIZE_MAP_X = 64; const int SIZE_MAP_Y = 64; const int NUM_MAP_X = 50; const int NUM_MAP_Y = 8; int data[NUM_MAP_Y][NUM_MAP_X] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 2, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 2, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 3, 4, 0, 5, 3, 4, 0, 0, 3, 4, 0, 0, 3, 4, 0, 0, 3, 4, 0, 0, 3, 4, 0, 5, 3, 4, 0, 0, 3, 4, 0, 0, 3, 4, 0, 0, 3, 4, 0, 0, 3, 4, 0, 5, 3, 4, 0, 0, 3}, {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}, }; //プレイヤー画像用 object_t fi; object_t mc; object_t cf; player_t p1; int Handle_fi[1]; int Handle_mc[6]; int Handle_cf[1]; int Handle_p1[16]; int p1count = 0; //プレイヤー用フラグ bool mflag = false; bool jflag = false; bool sqflag = false; bool jdflag = false; bool fip1flag = false; bool coflag = false; //プレイヤー用座標 int old_x = p1.x; int old_y = p1.y; int new_x = p1.x; int new_y = p1.y; int L_p1 = p1.x + 16; int R_p1 = p1.x + 48; int U_p1 = p1.y; int D_p1 = p1.y + 64; int L_block = p1.x * SIZE_MAP_X / 64; int R_block = p1.x * SIZE_MAP_X / 64 + 64; int U_block = p1.y * SIZE_MAP_Y / 64; int D_block = p1.y * SIZE_MAP_Y / 64 + 64; //フォントデータロード int Font = CreateFontToHandle("メイリオ", 32, 4, DX_FONTTYPE_ANTIALIASING_EDGE); //初期化 void Player_Initialize() { if (initialize == true) { //画像ファイルロード LoadDivGraph("./Image/field.png", 1, 1, 1, 3200, 480, Handle_fi); LoadDivGraph("./Image/mapchip.png", 6, 3, 2, SIZE_MAP_X, SIZE_MAP_Y, Handle_mc); LoadDivGraph("./Image/chequeredflag.png", 1, 1, 1, 64, 64, Handle_cf); LoadDivGraph("./Image/player1.png", 16, 4, 4, 64, 64, Handle_p1); //背景座標 fi.x = 0; fi.y = 0; fi.img = Handle_fi[0]; //ゴール座標 cf.x = 3072; cf.y = 64; cf.img = Handle_cf[0]; //プレイヤー座標 p1.x = 64 / 2; p1.y = 480 - (64 / 2); p1.y_prev = 0; p1.y_temp = 0; //フラグ p1.flag = 0; p1.fflag = 0; mflag = true; jflag = false; sqflag = false; jdflag = false; fip1flag = false; coflag = false; } initialize = false; } //計算 void Player_Update() { if (Key[KEY_INPUT_RETURN] == 1) { finalize = true; DxLib_End(); } for (new_y = 0; new_y < NUM_MAP_Y; new_y++) { for (new_x = 0; new_x < NUM_MAP_X; new_x++) { int no = data[new_y][new_x]; DrawGraph(new_x * SIZE_MAP_X + fi.x, new_y * SIZE_MAP_Y, Handle_mc[no], FALSE); } } if (data[U_p1 / SIZE_MAP_Y][L_p1 / SIZE_MAP_X] == 5) { coflag = true; } else { coflag = false; } if (mflag == true) { //プレイヤー移動制御 if (p1.x < (64 / 2)) { p1.x = (64 / 2); } if (p1.x + (64 / 2) > 640) { p1.x = 640 - (64 / 2); } if (p1.y < (64 / 2) - 480) { p1.y = (64 / 2) - 480; } if (p1.y + (64 / 2) > 448) { p1.y = 448 - (64 / 2); } //下キーが押下された場合 if (Key[KEY_INPUT_DOWN] == 1) { //しゃがみフラグ sqflag = true; } else { sqflag = false; } //上キーが押下され現在のy座標が448 - (64 / 2)でしゃがみフラグが立っていない場合 if (Key[KEY_INPUT_UP] == 1 && p1.y == 448 - (64 / 2) && sqflag == false) { //ジャンプフラグ jflag = true; //現在のy座標を前回分に保存 p1.y_prev = p1.y; //現在のy座標を20減らす p1.y = p1.y - 20; } //ジャンプフラグが立っている場合 if (jflag == true) { //現在のy座標を一時分に保存 p1.y_temp = p1.y; //現在y += (現在y - 前回y) + 3 / 2 p1.y += (p1.y - p1.y_prev) + 3 / 2; //一時保存のy座標を前回分に保存 p1.y_prev = p1.y_temp; //現在のy座標が前回分よりも大きい場合 if (p1.y - p1.y_prev > 0) { //下降フラグ jdflag = true; } else { jdflag = false; } //現在のy座標が448 - (64 / 2)の場合 if (p1.y == 448 - (64 / 2)) { //ジャンプフラグと下降フラグを元に戻す jflag = false; jdflag = false; } } //右キーが押下された場合 if (Key[KEY_INPUT_RIGHT] == 1) { //右フラグ p1.flag = 1; //左キーが押下された場合 } else if (Key[KEY_INPUT_LEFT] == 1) { //左フラグ p1.flag = 2; //押下されなかった場合 } else { //停止フラグ p1.flag = 0; } } if (p1.flag == 2) { if (sqflag == true) { p1.img = Handle_p1[13]; } else { if (fip1flag == false) { //p1.xを減らす p1.x--; } if (fip1flag == true) { //fi.xを増やす fi.x++; //cf.xを増やす cf.x++; } p1.fflag = 2; if (jflag == true) { p1.img = Handle_p1[12]; } else { //x座標に合わせた画像を指定 if (fip1flag == true) { p1.img = Handle_p1[(fi.x % 64) / 16 + 11]; } else { p1.img = Handle_p1[(p1.x % 64) / 16 + 8]; } } } } else if (p1.flag == 1) { if (sqflag == true) { p1.img = Handle_p1[5]; } else { if (fip1flag == false) { //p1.xを増やす p1.x++; } if (fip1flag == true) { //fi.xを減らす fi.x--; //cf.xを減らす cf.x--; } p1.fflag = 1; if (jflag == true) { p1.img = Handle_p1[4]; } else { //x座標に合わせた画像を指定 if (fip1flag == true) { p1.img = Handle_p1[(fi.x % 64) / 16 + 3]; } else { p1.img = Handle_p1[(p1.x % 64) / 16]; } } } } else if (p1.fflag == 2) { if (sqflag == true) { p1.img = Handle_p1[13]; } else if (jflag == true) { p1.img = Handle_p1[12]; } else { p1.img = Handle_p1[8]; } } else { if (sqflag == true) { p1.img = Handle_p1[5]; } else if (jflag == true) { p1.img = Handle_p1[4]; } else { p1.img = Handle_p1[0]; } } if (p1.flag == 1 && fip1flag == false && p1.x == 320) { fip1flag = true; } if (p1.flag == 2 && fip1flag == false && p1.x == 320) { fip1flag = true; } if (p1.flag == 1 && fip1flag == true && fi.x == 0 - 2560) { fip1flag = false; } if (p1.flag == 2 && fip1flag == true && fi.x == 0) { fip1flag = false; } } //描画 void Player_Draw() { //画像描画 DrawGraph(cf.x, cf.y, cf.img, TRUE); DrawGraph(p1.x - (64 / 2), p1.y - (64 / 2), p1.img, TRUE); DrawFormatString(20, 20, GetColor(0, 0, 0), "p1.x : %d", p1.x); DrawFormatString(20, 40, GetColor(0, 0, 0), "p1.y : %d", p1.y); DrawFormatString(20, 60, GetColor(0, 0, 0), "old_x : %d", old_x); DrawFormatString(20, 80, GetColor(0, 0, 0), "old_y : %d", old_y); DrawFormatString(20, 100, GetColor(0, 0, 0), "new_x : %d", new_x); DrawFormatString(20, 120, GetColor(0, 0, 0), "new_y : %d", new_y); DrawFormatString(20, 140, GetColor(0, 0, 0), "coflag : %d", coflag); DrawFormatString(20, 160, GetColor(0, 0, 0), "L_X : %d", L_p1 / SIZE_MAP_X); DrawFormatString(20, 180, GetColor(0, 0, 0), "U_Y : %d", U_p1 / SIZE_MAP_Y); } //終了処理 void Player_Finalize() { if (finalize == true) { DeleteGraph(fi.img); DeleteGraph(mc.img); DeleteGraph(cf.img); DeleteGraph(p1.img); DeleteFontToHandle(Font); } finalize = false; } //-------------------------------------------------- // Player.h #ifndef DEF_PLAYER_H #define DEF_PLAYER_H typedef struct { int x, y, img; } object_t; typedef struct { int x, y, y_prev, y_temp, flag, fflag, img; } player_t; typedef struct { int x, y; } Vec2; void Player_Initialize(); void Player_Update(); void Player_Draw(); void Player_Finalize(); #endif

試したこと

https://yttm-work.jp/collision/collision_0010.html を参考にしながらDXLibに落とし込もうとしていますが行き詰まってしまっています。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual C++ 2019
DXライブラリ Windows版 Visual C++用 Ver3.22c

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

DXライブラリ

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