コード:
/* 敵の縦と横の数 */
#define X_NUM 8
#define Y_NUM 4
#define ENEMY_NUM (X_NUM * Y_NUM)
/* 敵の情報 */
enemy_data enemies[ENEMY_NUM];
/* 敵の情報を表す構造体 */
typedef struct {
float x, y; /* 座標 */
int is_alive; /* 生きてるか */
} enemy_data;
float charax = 300.0f;
float charay = 350.0f;
int i;
int shot_flg[5] =
{
0, 0, 0, 0, 0
};
float shot_x[5] =
{
0.0f, 0.0f, 0.0f, 0.0f, 0.0f
};
float shot_y[5] =
{
0.0f, 0.0f, 0.0f, 0.0f, 0.0f
};
void tama() {
if (GetKeyboardPress(DIK_Z)){
if (shot_y[i] < 0){
shot_x[i] = charax + 21.f;
shot_y[i] = charay + 10.0f;
}
for (int i = 0; i < 5; i++)
{
shot_flg[i] = 1;
if (shot_flg[i] == 0)
{
shot_x[i] = charax + 21.f;
shot_y[i] = charay + 10.0f;
break;
}
}
}
for (int i = 0; i < 5; i++)
{
if (shot_flg[i]==1)
{
shot_y[i] -= 8;
}
if (shot_y[i] <0.0f)
{
shot_flg[i] = 0;
}
}
typedef struct {
float x, y, z;
float rhw;
D3DCOLOR cor;
float u, v;
}TAMA;
TAMA vertex[4];
for (int i = 0; i < 5; i++)
{
if (shot_flg[i] == 1)
{
vertex[0].x = shot_x[i];
vertex[0].y = shot_y[i];
vertex[0].z = 0.0f;
vertex[1].x = shot_x[i] + 5.0f;
vertex[1].y = shot_y[i];
vertex[1].z = 0.0f;
vertex[2].x = shot_x[i] + 5.0f;
vertex[2].y = shot_y[i] + 5.0f;
vertex[2].z = 0.0f;
vertex[3].x = shot_x[i];
vertex[3].y = shot_y[i] + 5.0f;
vertex[3].z = 0.0f;
vertex[0].rhw = 1.0f;
vertex[1].rhw = 1.0f;
vertex[2].rhw = 1.0f;
vertex[3].rhw = 1.0f;
vertex[0].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[1].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[2].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[3].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[0].u = 0.0f;
vertex[0].v = 0.0f;
vertex[1].u = 1.0f;
vertex[1].v = 0.0f;
vertex[2].u = 1.0f;
vertex[2].v = 1.0f;
vertex[3].u = 0.0f;
vertex[3].v = 1.0f;
}
g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(TAMA));
}
}
void ziki (void) {
typedef struct {
float x, y, z;
float rhw;
D3DCOLOR cor;
float u, v;
}ZIKI;
ZIKI vertex[4];
if (GetKeyboardPress(DIK_LEFT)) {
charax -= 4.0f;
}
if (GetKeyboardPress(DIK_RIGHT)) {
charax += 4.0f;
}
vertex[0].x = charax;
vertex[0].y = charay;
vertex[0].z = 0.0f;
vertex[1].x = charax + 50.0f;
vertex[1].y = charay;
vertex[1].z = 0.0f;
vertex[2].x = charax + 50.0f;
vertex[2].y = charay + 50.0f;
vertex[2].z = 0.0f;
vertex[3].x = charax;
vertex[3].y = charay + 50.0f;
vertex[3].z = 0.0f;
vertex[0].rhw = 1.0f;
vertex[1].rhw = 1.0f;
vertex[2].rhw = 1.0f;
vertex[3].rhw = 1.0f;
vertex[0].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[1].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[2].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[3].cor = D3DCOLOR_XRGB(255, 255, 255);
vertex[0].u = 0.0f;
vertex[0].v = 1.0f;
vertex[1].u = 0.0f;
vertex[1].v = 0.0f;
vertex[2].u = 1.0f;
vertex[2].v = 0.0f;
vertex[3].u = 1.0f;
vertex[3].v = 1.0f;
g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vertex, sizeof(ZIKI));
}
/* 敵を配置する */
void initEnemy(void) {
int x, y;
for (y = 0; y < Y_NUM; y++) {
for (x = 0; x < X_NUM; x++) {
enemies[y * X_NUM + x].x = 80.0f + 50.0f * x;
enemies[y * X_NUM + x].y = 50.0f + 50.0f * y;
enemies[y * X_NUM + x].is_alive = 1;
}
}
}
/* 敵1体を(pos, ypos)に描画する */
void drawOneEnemy(float pos, float ypos) {
typedef struct {
float x, y, z;
float rhw;
D3DCOLOR cor;
float u, v;
}Enemy;
Enemy v[4];
v[0].x = pos;
v[0].y = ypos;
v[0].z = 0.0f;
v[1].x = pos + 20.0f;
v[1].y = ypos;
v[1].z = 0.0f;
v[2].x = pos + 20.0f;
v[2].y = ypos + 20.0f;
v[2].z = 0.0f;
v[3].x = pos;
v[3].y = ypos + 20.0f;
v[3].z = 0.0f;
v[0].rhw = 1.0f;
v[1].rhw = 1.0f;
v[2].rhw = 1.0f;
v[3].rhw = 1.0f;
v[0].cor = D3DCOLOR_XRGB(255, 255, 255);
v[1].cor = D3DCOLOR_XRGB(255, 255, 255);
v[2].cor = D3DCOLOR_XRGB(255, 255, 255);
v[3].cor = D3DCOLOR_XRGB(255, 255, 255);
v[0].u = 0.0f;
v[0].v = 1.0f;
v[1].u = 0.0f;
v[1].v = 0.0f;
v[2].u = 1.0f;
v[2].v = 0.0f;
v[3].u = 1.0f;
v[3].v = 1.0f;
g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, v, sizeof(Enemy));
}
/* 敵の集団を描画する */
void drawEnemy(void) {
int i;
initEnemy();
/* 生きている敵のみ描画する */
for (i = 0; i < ENEMY_NUM; i++) {
if (enemies[i].is_alive) {
drawOneEnemy(enemies[i].x, enemies[i].y);
}
}
}
/* 当たり判定を計算させる */
void updateEnemy(void) {
int i;
for (i = 0; i < ENEMY_NUM; i++) {
if (enemies[i].is_alive) {
if (enemies[i].x+30 >= shot_x[i]+10 && enemies[i].x+30 <= shot_x[i]+10&& enemies[i].y+10 >= shot_y[i]+10 && enemies[i].y+30 <= shot_y[i]+10){
enemies[i].is_alive = 0;
}
}
}
}