なんというか、DXライブラリとCを触ってから何年もたつというのに、しっかりとした一つとしてのゲームを未だ
一人の力だけで作ったことがないという状況にあることを最近ふと気づきました。 マズい。
どんなに簡単なもんでもいいからとりあえず作らなければ...というわけで、ブロック崩しでも作ってみようかなぁと
考えて、2時間ほど書いているところです。
バーとボールのあたり判定で躓いてるあたりヤバいなぁと思います。バーとボールに関しては矩形対矩形でも問題ない
判定ですので(見た目は丸いけど)いいんですが、ブロック対ボールとなると円と矩形のあたり判定ですしなんか無理な感じが漂ってますが...
自分であたり判定実装するの面倒だからどっかから適当にソースコードコピペしちゃおうかな(殴)
んなことで、プログラミング歴4年にして、やっと一つのゲームを作ろうと、決心したところです。
つっても規模が規模なゲームですしとりあえずmain関数に全部書いてしまうところがヤバい、
ま、まぁゲームにスコア機能とかいろいろつけていったら大きくなるし、その時ちゃんとクラスで管理するし...(震え声
つーかいい加減C++の書き方に慣れていこうぜ俺... もっとスマートに書きたい。
► スポイラーを表示
CODE:
#include "../DxLib/DxLib.h"
#include "KeyBoard.h"
//バーの情報
typedef struct Bar{
int x; //座標
int y;
int rect_x; //サイズ
int rect_y;
int speed; //速度
bool flag; //何かに使うかもしれない
}Bar;
//ボールの情報
typedef struct Ball{
int x; //座標
int y;
int v_x; //軸の速度
int v_y;
int r;
bool flag; //何かに使うかもしれない
}Ball;
//ブロックの情報
typedef struct Block{
int x; //ブロックの座標
int y;
int rect_x; //ブロックの大きさ
int rect_y;
int hp; //ブロックの体力
bool flag; //ブロックが存在するか否か
}Block;
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
//SetFullSceneAntiAliasingMode(4,16);
ChangeWindowMode(TRUE);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
const int W_W = 640;
const int W_H = 480;
const int block_x = 16;
const int block_y = 16;
const int blocksize_x = 36;
const int blocksize_y = 12;
Bar m_bar;
Ball m_ball;
Block m_block[block_x][block_y];
m_bar.x = 320-96/2;
m_bar.y = 420;
m_bar.rect_x = 96;
m_bar.rect_y = 16;
m_bar.speed = 8;
m_ball.x = 320;
m_ball.y = 400;
m_ball.v_x = 4;
m_ball.v_y = -4;
m_ball.r = 8;
//ブロックを配列させる
for (int i = 0; i m_ball.x || W_W - m_ball.r m_ball.y || W_H - m_ball.r < m_ball.y) m_ball.v_y = -m_ball.v_y;
if (m_bar.y < m_ball.y+m_ball.r && m_ball.y-m_ball.r < m_bar.rect_y && m_bar.x < m_ball.x && m_ball.x < m_bar.x+m_bar.rect_x) m_ball.v_y = -m_ball.v_y; //ココ!(あたり判定について)
m_ball.x += m_ball.v_x;
m_ball.y += m_ball.v_y;
for (int i = 0; i < block_x; i++)
for (int k = 0; k < block_y; k++)
DrawBox(m_block[i][k].x, m_block[i][k].y, m_block[i][k].x + blocksize_x, m_block[i][k].y + blocksize_y, GetColor(255, 255, 255), true);
DrawCircle(m_ball.x, m_ball.y, m_ball.r, GetColor(255, 64, 128));
DrawBox(m_bar.x, m_bar.y, m_bar.rect_x + m_bar.x, m_bar.rect_y + m_bar.y, GetColor(255, 255, 255), true);
}
printfDx("メインループを抜けました。何かキーを押すと終了します。");
WaitKey();
DxLib_End();
return 0;
}