現在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 ; // ソフトの終了
}
あなたの回答
tips
プレビュー