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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DXライブラリ

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

Q&A

0回答

1653閲覧

DXライブラリでの2Dゲーム開発の当たり判定処理について

YonggiCho

総合スコア13

DXライブラリ

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

0グッド

0クリップ

投稿2021/10/26 13:51

現在c++の基礎の勉強を一通り終え、DXライブラリでのゲーム2dゲームを練習がてら作成しています。
それで現在マップチップを使ってのマップの描画の勉強をした後、当たり判定の処理の練習をしています。
しかし、キャラがいつも動きません。
マップチップの配列の添え字10以上が壁となるため、その時にあったっているかどうかを判定するというコードを書きました。
下記にコードを貼りますので原因を教えてほしいです。
c++
コード
#include "DxLib.h"

//当たり判定関数
//マイキャラ 左 x1
//      上 y1
//      横 w1
//      縦 h1
//敵キャラ  左 x2
//      上 y2
//      横 w2
//      縦 h2

//当たり判定0→HITなし、1→HIT

int hitCheck(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {
int m_L = x1; //左
int m_R = x1 + w1; //右端(左+幅)
int e_L = x2; //敵左
int e_R = x2 + w2; //敵右

if (e_R < m_L) { return 0; } if (m_R < e_L) { return 0; } int m_U = y1; //上 int m_D = y1 + h1; //した(上+長さ) int e_U = y2; //敵上 int e_D = y2 + h2; //敵下 if (m_D < e_U) { return 0; } if (e_D < m_U) { return 0; } return 1;

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
const int SCREEN_WIDTH = 640;//画面幅
const int SCREEN_HEIGHT = 480;//画面高さ

ChangeWindowMode(TRUE); SetGraphMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32); if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } //ダブルバッファモード SetDrawScreen(DX_SCREEN_BACK); //ゲーム初期化 const int CHARA_WIDTH = 32; const int CHARA_HEIGHT = 32; //画面中心に設定するときの左上の座標(キャラは中心に来る) int mx = (SCREEN_WIDTH - CHARA_WIDTH) / 2; int my = (SCREEN_HEIGHT - CHARA_HEIGHT) / 2; //キャラロード int chara[12]; LoadDivGraph("pipo-charachip017c.png", 12, 3, 4, 32, 32, chara); //キャラアクション int chara_motion[] = { 0,1,2,1 };//動きの種類 int chara_index = 0;//添え字使用 int max_index = 4;//最大行動モーション数 //描画処理遅延用変数 const int motion_speed = 20; int speed = motion_speed; //キャラ方向指定 const int Slide = 3;//3つ次の添え字に動く → 次の列の動きに移る int dir = 0;//何列目か //マップロード //チップサイズ const int CHIP_X = 32; const int CHIP_Y = 32; //チップ種類 const int chipNum_X = 10; const int chipNum_Y = 4; const int chipAll = chipNum_X * chipNum_Y; //マップロード int chip[chipAll]; LoadDivGraph("mapchip.bmp", chipAll, chipNum_X, chipNum_Y, CHIP_X, CHIP_Y, chip); //背景 const int MAP_X = 20; const int MAP_Y = 15; int map[MAP_Y][MAP_X] = { {10, 10, 10, 10, 10,10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 }, {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, {10, 0, 0,10, 10,10, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10 }, {10, 0, 0,10, 0,10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 10, 0, 0, 10 }, {10, 0, 0,10, 10,10, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10 }, {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, {10, 0, 0,10, 10,10, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10 }, {10, 0, 0,10, 0,10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 0, 10, 0, 0, 10 }, {10, 0, 0,10, 10,10, 0, 0, 10, 10, 10, 10, 0, 0, 10, 10, 10, 0, 0, 10 }, {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, {10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 }, {10, 10, 10,10, 10,10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 } }; //メイン部分 while (ProcessMessage() == 0) { //裏画面クリア ClearDrawScreen(); //背景描画 for (int j = 0; j < MAP_Y; j++) { for (int i = 0; i < MAP_X; i++) { int NO = map[j][i]; DrawGraph(i * CHIP_X, j * CHIP_Y, chip[NO], FALSE); } } //キー情報取得 int input = GetJoypadInputState(DX_INPUT_KEY_PAD1); //変更前座標記憶 int oldx = mx; int oldy = my; //キー情報で移動 if (input & PAD_INPUT_RIGHT) { mx++; dir = 2; } if (input & PAD_INPUT_LEFT) { mx--; dir = 1; } if (input & PAD_INPUT_UP) { my--; dir = 3; } if (input & PAD_INPUT_DOWN) { my++; dir = 0; } //ブロック当たり判定 for (int j = 0; j < MAP_Y;j++) { for (int i = 0; i < MAP_X; i++) { int NO = map[j][i]; if (NO >= 10 && NO < 20) { int n = hitCheck(i * MAP_X, j * MAP_Y, CHIP_X, CHIP_Y, mx, my, CHARA_WIDTH, CHARA_HEIGHT); if (n == 1) { mx = oldx; my = oldy; } } } } if (--speed <= 0) { //モーション進行 chara_index++; chara_index %= max_index; //スピード初期化 speed = motion_speed; } int motion = chara_motion[chara_index]; //キャラ描画 DrawGraph(mx, my, chara[motion+dir*Slide ], TRUE); //裏画面を表に ScreenFlip(); } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了

}

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

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

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

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

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

AbeTakashi

2021/10/30 16:49

参考) https://teratail.com/help/question-tips 参考サイトを上から下まで全部読んで頂き、特に「3-3. 質問詳細の最初に実現したいことを書きましょう」「3-5. あなたが何をしたかを書きましょう」はしっかり対応した方が良いです。現状のソースコードではインデントも効いてないので、このコードを読み解いて回答したいという人は現れない気がします。 あと、タイトルは「当たり判定処理」の質問と書いていますが、「しかし、キャラがいつも動きません。」ということで、具体的に何に困っていて、何を聞きたいのかがよく分かりません。聞きたいことは要点を絞って端的に質問した方が回答が出やすいと思います。 キャラが動かないならまずは動くところまでを考えて、そのことに関して検証すべきでしょう。「ブロック当たり判定」は動く問題が解決してからではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問