#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;
}
Dxlibでブロック崩し
Dxlibでブロック崩し
ブロック崩しを作っていたのですが、ボールのあたり判定のなかにラケットのあたり判定を入れたいのですがどうしたらいいですか??
Re: Dxlibでブロック崩し
ラケットっていうのは跳ね返すやつの事で良いですか?(間違ってたらすみません)
それならまず、winmainでラケットの変数を定義する前にb_move関数を作っているため、ここでラケットの変数を扱えません。なのでラケットの変数をb_move関数より先に定義するとラケットの変数が扱えるので、そこでb_move関数内でラケットにあたった時の処理を入れれば良いです。
が、それだと変数が散らばってごちゃごちゃしてしまうので、プログラムの一番最初に変数を定義して、全ての変数をそこで管理するのが良いです。
例
変数宣言(このゲームで使う全て)
↓
ボールとかの関数定義
↓
メイン処理
という流れが良いと思います。また、変数も普通に宣言するのでなく、構造体にまとめた方が後々楽になります。
後半は私の持論ですので、気が向いたらやってみて下さい。
それならまず、winmainでラケットの変数を定義する前にb_move関数を作っているため、ここでラケットの変数を扱えません。なのでラケットの変数をb_move関数より先に定義するとラケットの変数が扱えるので、そこでb_move関数内でラケットにあたった時の処理を入れれば良いです。
が、それだと変数が散らばってごちゃごちゃしてしまうので、プログラムの一番最初に変数を定義して、全ての変数をそこで管理するのが良いです。
例
変数宣言(このゲームで使う全て)
↓
ボールとかの関数定義
↓
メイン処理
という流れが良いと思います。また、変数も普通に宣言するのでなく、構造体にまとめた方が後々楽になります。
後半は私の持論ですので、気が向いたらやってみて下さい。
Re: Dxlibでブロック崩し
必要なデータを構造体にして、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でブロック崩し
元のソースで int& bx のように参照を使っていたということは
言語は C++ なんだから、b_move をメンバ関数にすれば、
ポインタは明示しなくてもよくなりますね。
言語は 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;
}