当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aaa1458

当たり判定について

#1

投稿記事 by aaa1458 » 9年前

下記のプログラムに当たり判定を付けたいのですがどうすれば良いのか分かりません。
MapDataの1に当たった場合ボールが跳ね返るようにしたいです。
もしよかったら文章だけでなく、例も載せてください。
よろしくお願いします。

コード:

#include "DxLib.h"
#include <math.h>


#define SCREEN_WIDTH     (640)                         // 画面の横幅
#define SCREEN_HEIGHT    (480)                          // 画面の縦幅
#define MAP_PIXEL_WIDTH (1280)
#define MAP_PIXEL_HEIGHT (480)
#define CHIP_SIZE        (32)                           // 一つのチップのサイズ


#define MAP_WIDTH        ( MAP_PIXEL_WIDTH / CHIP_SIZE)     // マップの横幅
#define MAP_HEIGHT       (MAP_PIXEL_HEIGHT / CHIP_SIZE)    // マップの縦幅 


int DrawF(int x, int y, int color)
{
	DrawCircle(x, y, 10, color, TRUE);
	
	return 0;
}


char MapData[MAP_HEIGHT][MAP_WIDTH] =
{
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
};


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	int i, j;
	int x = 300, y = 0;
	int x_direction = 0;//x方向を表す変数
	int y_direction = 0;//y方向を表す変数
	
	//ウィンドウモードに設定
	ChangeWindowMode(TRUE);

	//背景の色を指定
	SetBackgroundColor(255, 255, 255);

	//DXライブラリを初期化
	DxLib_Init();

	//描画処理
	SetDrawScreen(DX_SCREEN_BACK);
	
	while (1)
	{
		ClsDrawScreen();
	
		if (x_direction == 0) {
			x = x + 3;
		}
		else {
			x = x - 3;
		}

		if (y_direction == 0) {
			y = y + 3;
		}
		else {
			y = y - 3;
		}


		if (x >= SCREEN_WIDTH) {
			x_direction = 1;
		}
		if (x <= 0) {
			x_direction = 0;
		}
		if (y >= SCREEN_HEIGHT) {
			y_direction = 1;
		}
		if (y <= 0) {
			y_direction = 0;
		}

		for (i = 0; i < MAP_HEIGHT; i++)
		{
			for (j = 0; j < MAP_WIDTH; j++)
			{
				// 1は当たり判定チップを表しているので1のところだけ描画
				if (MapData[i][j] == 1)
				{
					DrawBox(j * CHIP_SIZE, i * CHIP_SIZE,
						j * CHIP_SIZE + CHIP_SIZE, i * CHIP_SIZE + CHIP_SIZE,
						GetColor(0, 0, 0), TRUE);
				}

			}
		}


		//ランダムな位置,色で「F」を表示
		DrawF(x, y, GetColor(rand() % 255, rand() % 255, rand() % 255));

		//DrawF(x, y, GetColor(0, 255, 255));

		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
			break;
		ScreenFlip();
	}

	WaitKey();

	DxLib_End();
	return 0;
}

yuni

Re: 当たり判定について

#2

投稿記事 by yuni » 9年前

こんばんは。

コードを見る限りすでに答えが出ているようにも思いますが…。
これはどういう状況なんでしょうか…。

コード:

        // 94行目くらいに追加

        for (i = 0; i < MAP_HEIGHT; i++)
        {
            for (j = 0; j < MAP_WIDTH; j++)
            {
                // 1は当たり判定チップ  あたったら反転
                if (MapData[i][j] == 1)
                {
                    if( x_direction==0 ){ x_direction = 1; }
                    else{ x_direction = 0; }

                    if( y_direction==0 ){ y_direction = 1; }
                    else{ y_direction = 0; }
                }
 
            }
        }
オフトピック
値を直接使うのはお勧めしません。(パッと見て1が何で0が何、などとわからないため)
forループではきっちりdefineを使えているのにここに使えていないのがもったいないなぁと…。
#define DIRECTION_PLUS 0
#define DIRECTION_MINUS 1

とはいえ、進む種類が2つしかないのなら方向は 1 と -1 でいい気がします。
if (x_direction == 0) {
x = x + 3;
}
else {
x = x - 3;
}
この長い文章を
x = x + 3 * x_direction;// x_directionには1か-1が入る
1行にできます。

今回の当たり判定処理も
if( x_direction==0 ){ x_direction = 1; }
else{ x_direction = 0; }

x_direction *= -1;// x_directionには1か-1が入る
1行にできます。

閉鎖

“C言語何でも質問掲示板” へ戻る