球に当たらずに何秒生き残れるかゲーム(超適当)を作ってみました(自キャラは赤い■)。複数インスタンスの一例はこんな感じですかね?
#include "DxLib.h"
#include <math.h>
#define SIZE_X 640
#define SIZE_Y 480
#define NUM_TEKI 128
class TEKI
{
int x, y, c, r;
public:
void Init(int my_x, int my_y) {
c = DxLib::GetColor(DxLib::GetRand(255), DxLib::GetRand(255), DxLib::GetRand(255)); r = 24 + DxLib::GetRand(16);
do
{
x = DxLib::GetRand(SIZE_X - 1); y = DxLib::GetRand(SIZE_Y - 1);
} while (Hantel(my_x, my_y, r*2) == FALSE);
};
void Move() {
int r = DxLib::GetRand(3), x1 = 0, y1 = 0;
int n = 2;
switch (r)
{
case 0: x1 = -n; break;
case 1: x1 = n; break;
case 2: y1 = -n; break;
case 3: y1 = n; break;
}
if (x + x1<0 || x + x1>SIZE_X) x1 = 0;
if (y + y1<0 || y + y1>SIZE_Y) y1 = 0;
x += x1; y += y1;
}
void Draw() { DxLib::DrawCircle(x, y, r, c, TRUE); }
BOOL Hantel(int my_x, int my_y, int r = -1) {
return sqrt(((my_x + 8) - x)*((my_x + 8) - x) + ((my_y + 8) - y)*((my_y + 8) - y)) > ((r == -1) ? this->r : r);
};
};
TEKI teki[NUM_TEKI];
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
int i, x=SIZE_X/2, y=SIZE_Y/2, x1=0, y1=0;
LONGLONG llTime;
BOOL bLOOP = TRUE;
DxLib::ChangeWindowMode(TRUE);
DxLib::SetGraphMode(SIZE_X, SIZE_Y, 32);
if (DxLib::DxLib_Init() == -1) return -1;
DxLib::SetDrawScreen(DX_SCREEN_BACK);
DxLib::SRand(DxLib::GetNowCount());
for (int i = 0; i < NUM_TEKI; i++) teki[i].Init(x, y);
llTime = DxLib::GetNowHiPerformanceCount();
while (DxLib::ProcessMessage() == 0 && bLOOP==TRUE)
{
DxLib::DrawBox(0, 0, SIZE_X, SIZE_Y, DxLib::GetColor(0, 128, 128), TRUE);
for (i = 0; i<NUM_TEKI; i++)
{
teki[i].Move();
teki[i].Draw();
}
x1 = y1 = 0;
char KeyBuf[256];
DxLib::GetHitKeyStateAll(KeyBuf);
if (KeyBuf[KEY_INPUT_UP] == 1) y1 = -4;
if (KeyBuf[KEY_INPUT_DOWN] == 1) y1 = 4;
if (KeyBuf[KEY_INPUT_LEFT] == 1) x1 = -4;
if (KeyBuf[KEY_INPUT_RIGHT] == 1) x1 = 4;
if (x + x1<0 || x + x1>SIZE_X-16) x1 = 0;
if (y + y1<0 || y + y1>SIZE_Y-16) y1 = 0;
x += x1; y += y1;
DxLib::DrawBox(x, y, x+16, y+16, DxLib::GetColor(255, 0, 0), TRUE);
for (i = 0; i<NUM_TEKI; i++)
{
if (teki[i].Hantel(x, y) == FALSE)
{
DxLib::ScreenFlip();
char buf[256];
DxLib::sprintfDx(buf, "TIME = %f 秒", (double)(DxLib::GetNowHiPerformanceCount() - llTime) / 1000000.0);
::MessageBox(NULL, buf, "Test", MB_OK);
bLOOP = FALSE;
break;
}
}
DxLib::ScreenFlip();
}
return DxLib::DxLib_End();
}