Dxlibでブロック崩し

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ao213
記事: 3
登録日時: 7年前

Dxlibでブロック崩し

#1

投稿記事 by ao213 » 6年前

ブロック崩しを作っていたのですが、ボールのあたり判定のなかにラケットのあたり判定を入れたいのですがどうしたらいいですか??

コード:

#include "DxLib.h"
void b_move(int& bx, int& by, int& bsx, int& bsy)
{
	//ボールの移動
	bx = bx + bsx;
	by = by + bsy;
	//ボールのあたり判定
	if (bx < 5 || bx>640 - 5)
	{
		bsx *= -1;
	}
	if (by <= 0 || by > 480 - 5)
	{
		bsy *= -1;
	}
}



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	unsigned int Cr;
	int crx,cry,crz;//色用関数
	int bx, by, bsx, bsy;//ボール用関数
	char key[256];//キー配列
	int rx, ry, rlength, rheight,rsx;//ラケット用関数

	ChangeWindowMode(true);
	if (DxLib_Init() == 1)
	{
		return -1;
	}
		SetDrawScreen(DX_SCREEN_BACK);

		//色の数値
		crx = 255;
		cry = 0;
		crz = 255;

		//ラケットの数値
		rx = (640 / 2) - (100 / 2);
		ry = 460;
		rlength = 100;
		rheight = 10;
		rsx = 8;

		//ボールの数値
		bx = 640 / 2;
		by = ry / 2;
		bsx = -7;
		bsy = 7;

		//色の数値
		Cr = GetColor(crx, cry, crz);

		///メインループ///
		while (ProcessMessage() != -1)
		{
			ClearDrawScreen();
			GetHitKeyStateAll(key);

			//ラケットの移動
			if (key[KEY_INPUT_RIGHT])
			{
				rx = rx + rsx;
			}
			if (key[KEY_INPUT_LEFT])
			{
				rx = rx - rsx;
			}

			//ラケットの移動範囲
			if (rx > 640 - rlength)
			{
				rx = 640 - rlength;
			}
			if (rx < 0)
			{
				rx = 0;
			}
			b_move(bx, by, bsx, bsy);
			DrawCircle(bx, by, 5, Cr, TRUE);
			DrawBox(rx, ry, rx + rlength, ry + rheight, Cr, TRUE);
			ScreenFlip();

		}
		DxLib_End();

		return 0;
	
}

rdk_2017
記事: 1
登録日時: 7年前

Re: Dxlibでブロック崩し

#2

投稿記事 by rdk_2017 » 6年前

ラケットっていうのは跳ね返すやつの事で良いですか?(間違ってたらすみません)
それならまず、winmainでラケットの変数を定義する前にb_move関数を作っているため、ここでラケットの変数を扱えません。なのでラケットの変数をb_move関数より先に定義するとラケットの変数が扱えるので、そこでb_move関数内でラケットにあたった時の処理を入れれば良いです。
が、それだと変数が散らばってごちゃごちゃしてしまうので、プログラムの一番最初に変数を定義して、全ての変数をそこで管理するのが良いです。

変数宣言(このゲームで使う全て)

ボールとかの関数定義

メイン処理
という流れが良いと思います。また、変数も普通に宣言するのでなく、構造体にまとめた方が後々楽になります。
後半は私の持論ですので、気が向いたらやってみて下さい。

かずま

Re: Dxlibでブロック崩し

#3

投稿記事 by かずま » 6年前

ao213 さんが書きました:
6年前
ブロック崩しを作っていたのですが、ボールのあたり判定のなかにラケットのあたり判定を入れたいのですがどうしたらいいですか??
必要なデータを構造体にして、main でそれを保持し、
b_move では、ポインタを使ってその構造体のデータに
アクセスすればよいのではないでしょうか?

コード:

#include "DxLib.h"

struct Data {
	char key[256];  //キー配列

	int rx, ry;     // ラケットの位置
	int rlength;    // ラケットの幅
	int rheight;    // ラケットの高さ
	int rsx;        // ラケットの速度

	int bx, by;     // ボールの位置
	int bsx, bsy;   // ボールのスピード
};

void b_move(Data *p)
{
	//ボールの移動
	p->bx = p->bx + p->bsx;
	p->by = p->by + p->bsy;
	//ボールのあたり判定
	if (p->bx < 5 || p->bx> 640 - 5)
		p->bsx *= -1;
	if (p->by <= 0 || p->by > 480 - 5)
		p->bsy *= -1;
	if (p->bx + 5 >= p->rx && p->bx - 5 <= p->rx + p->rlength
			&& p->by + 5 >= p->ry) {
		if (p->bx >= p->rx && p->bx <= p->rx + p->rlength) {
			p->bsy *= -1;
			if (p->key[KEY_INPUT_RIGHT]) p->bsx++;
			if (p->key[KEY_INPUT_LEFT]) p->bsx--;
		}
		else {
			p->bsx *= -1;
		}
	}
}

int WINAPI WinMain(HINSTANCE hi, HINSTANCE pi, LPSTR cl, int cs)
{
	ChangeWindowMode(true);
	if (DxLib_Init() == 1) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	int red = 255, green = 0, blue = 255;
	unsigned int Cr = GetColor(red, green, blue);

	struct Data data;

	data.rx = (640 / 2) - (100 / 2);
	data.ry = 460;
	data.rlength = 100;
	data.rheight = 10;
	data.rsx = 8;

	data.bx = 640 / 2;
	data.by = data.ry / 2;
	data.bsx = -7;
	data.bsy = 7;

	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
		GetHitKeyStateAll(data.key);

		if (data.key[KEY_INPUT_RIGHT]) data.rx += data.rsx;
		if (data.key[KEY_INPUT_LEFT]) data.rx -= data.rsx;

		if (data.rx > 640 - data.rlength) data.rx = 640 - data.rlength;
		if (data.rx < 0) data.rx = 0;

		b_move(&data);

		DrawCircle(data.bx, data.by, 5, Cr, TRUE);
		DrawBox(data.rx, data.ry,
				data.rx + data.rlength, data.ry + data.rheight, Cr, TRUE);
	}
	DxLib_End();
	return 0;
}

かずま

Re: Dxlibでブロック崩し

#4

投稿記事 by かずま » 6年前

元のソースで int& bx のように参照を使っていたということは
言語は C++ なんだから、b_move をメンバ関数にすれば、
ポインタは明示しなくてもよくなりますね。

コード:

#include "DxLib.h"

struct Data {
	char key[256];  //キー配列

	int rx, ry;     // ラケットの位置
	int rlength;    // ラケットの幅
	int rheight;    // ラケットの高さ
	int rsx;        // ラケットの速度

	int bx, by;     // ボールの位置
	int bsx, bsy;   // ボールのスピード

	void b_move()
	{
		//ボールの移動
		bx = bx + bsx;
		by = by + bsy;
		//ボールのあたり判定
		if (bx < 5) bx = 5, bsx = -bsx;
		if (bx > 640 - 5) bx = 640 - 5, bsx = -bsx;
		if (by < 5) by = 5, bsy = -bsy;
		if (by > 480 - 5) by = 480 - 5, bsy = -bsy;
		if (bx + 5 >= rx && bx - 5 <= rx + rlength
				&& by + 5 >= ry) {
			if (bx >= rx && bx <= rx + rlength) {
				bsy = -bsy;
				if (key[KEY_INPUT_RIGHT]) bsx++;
				if (key[KEY_INPUT_LEFT]) bsx--;
			}
			else bsx = -bsx;
		}
	}
};

int WINAPI WinMain(HINSTANCE hi, HINSTANCE pi, LPSTR cl, int cs)
{
	ChangeWindowMode(true);
	if (DxLib_Init() == 1) return -1;
	SetDrawScreen(DX_SCREEN_BACK);

	int red = 255, green = 0, blue = 255;
	unsigned int Cr = GetColor(red, green, blue);

	Data data;

	data.rx = (640 / 2) - (100 / 2);
	data.ry = 460;
	data.rlength = 100;
	data.rheight = 10;
	data.rsx = 8;

	data.bx = 640 / 2;
	data.by = data.ry / 2;
	data.bsx = -7;
	data.bsy = 7;

	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) {
		GetHitKeyStateAll(data.key);

		if (data.key[KEY_INPUT_RIGHT]) data.rx += data.rsx;
		if (data.key[KEY_INPUT_LEFT]) data.rx -= data.rsx;

		if (data.rx > 640 - data.rlength) data.rx = 640 - data.rlength;
		if (data.rx < 0) data.rx = 0;

		data.b_move();

		DrawCircle(data.bx, data.by, 5, Cr, TRUE);
		DrawBox(data.rx, data.ry,
				data.rx + data.rlength, data.ry + data.rheight, Cr, TRUE);
	}
	DxLib_End();
	return 0;
}

返信

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