プログラムが大きくなってきたので、分割します。
敵セット、enemy_type001~009まで。
/*************************************
* *
* 敵キャラプログラム *
* *
* Ver 1.12.01.21.07 *
* *
* *
* *
* *
* *
* *
* *
**************************************/
#include <math.h>
#include "DxLib.h"
#include "enemy.h"
#include "my_chr.h"
// x_hit y_hit x_graph y_graph anime atari next_shot hp score
ENEMY_DAT enemy_data[1000] = { { 0, 0, 0, 0, 0, 0, 100, 0, 0},//ダミー
{ 20, 20, 40, 40, 0, 1, 100, 1, 100},//直進する
{ 20, 20, 40, 40, 0, 1, 100, 1, 100},//直進する
{ 20, 20, 40, 40, 1, 1, 100, 1, 100},//サインカーブ
{ 20, 20, 40, 40, 11, 1, 100, 1, 100},//サインカーブ
{ 20, 20, 40, 40, 9, 1, 100, 1, 300},//追尾してくる敵
{ 20, 20, 40, 40, 19, 1, 100, 1, 300},//追尾してくる敵
{ 40, 40, 40, 40, 20, 1, 12, 10, 1000},//ハッチ下から上へ
{ 40, 40, 40, 40, 20, 1, 12, 10, 1000},//ハッチ上から下へ
{ 20, 20, 40, 40, 30, 1, 32, 1, 100},//ハッチの敵
{ 20, 20, 40, 40, 30, 1, 32, 1, 100},//ハッチの敵
{ 20, 20, 40, 40, 30, 1, 32, 1, 100 },//砲台下
{ 20, 20, 40, 40, 30, 1, 32, 1, 100 },//砲台上
{ 0,0,0,0,0,0,0 }};//終わりダミー
const double PI = 3.1415;
int enemy_index;
int enemy_num;
ENEMY_CHR enemy[ENEMY_MAX];
ENEMY_MAP enemy_map[1024];
void set_enemy(void);
void set_map_enemy(int,int,int);
void set1_enemy(ENEMY_CHR *ene,int, double);
void move_enemy(void);
void enemy_type001(ENEMY_CHR *ene);
void enemy_type002(ENEMY_CHR *ene);
void enemy_type003(ENEMY_CHR *ene);
void enemy_type007(ENEMY_CHR *ene);
void enemy_type008(ENEMY_CHR *ene);
void enemy_type009(ENEMY_CHR *ene);
void enemy_type010(ENEMY_CHR *ene);
void enemy_type011(ENEMY_CHR *ene);
void enemy_type012(ENEMY_CHR *ene);
void enemy_type1000(ENEMY_CHR *ene);
void enemy_explosion1(ENEMY_CHR *ene);
void enemy_generate(ENEMY_CHR *ene);
void enemy_map_generate(ENEMY_CHR *ene);
void power_up(ENEMY_CHR *ene);
void chr_hit(ENEMY_CHR *ene);
double enemy_dir(double, double, double, double);
double next_dir(ENEMY_CHR *ene, double);
extern int game_loop;
extern int scroll_wi;
extern int scroll_i;
extern int scroll_speed;
extern MY_CHR chr;
extern unsigned short map[60][1024];
extern int enemy_graph[100];
extern int explosion1_graph[8];
extern void sp_set(double cx, double cy, int gr_x_size, int gr_y_size, double sc_x, double sc_y, double ag, int g_han, int mir, int mo, int pr);
//----------敵セット--------------------------------------------------------
void set_enemy(void) {
while (game_loop == enemy_map[enemy_index].time) {
//敵テーブルの空きを探す
for (int i = 0; i < ENEMY_MAX; i++) {
ENEMY_CHR *ene = &enemy[i];
if (ene->code == 0) {
ene->code = 1100;
ene->generate_code = enemy_map[enemy_index].code;
ene->cx = enemy_map[enemy_index].cx;
ene->cy = enemy_map[enemy_index].cy;
ene->dir = enemy_map[enemy_index].dir*3.14/180;
ene->item = enemy_map[enemy_index].item;
ene->num = enemy_map[enemy_index].num;
ene->next_generate = enemy_map[enemy_index].next_gene;
ene->generate= 1;
ene->next_generate_c = 0;
ene->x_hit_size = enemy_data[ene->code].x_hit_size;
ene->y_hit_size = enemy_data[ene->code].y_hit_size;
ene->x_graph_size = enemy_data[ene->code].x_graph_size;
ene->y_graph_size = enemy_data[ene->code].y_graph_size;
ene->w_dir = 0;
ene->anime = enemy_data[ene->code].anime;
ene->anime_c = 0;
ene->atari = enemy_data[ene->code].atari;
ene->next_shot = enemy_data[ene->code].next_shot;
ene->next_shot_c = 0;
ene->hp = enemy_data[ene->code].hp;
break;
}
}
enemy_index++;
}
}
//----------敵セット1-------------------------------------------------------
void set1_enemy(ENEMY_CHR *ene,int code,double dir) {
//敵テーブルの空きを探す
for (int i = 0; i < ENEMY_MAX; i++) {
ENEMY_CHR *set_ene = &enemy[i];
if (set_ene->code == 0) {
set_ene->code = code;
set_ene->cx = ene->cx;
set_ene->cy = ene->cy;
set_ene->x_graph_size = enemy_data[set_ene->code].x_graph_size;
set_ene->y_graph_size = enemy_data[set_ene->code].y_graph_size;
set_ene->x_hit_size = enemy_data[set_ene->code].x_hit_size;
set_ene->y_hit_size = enemy_data[set_ene->code].y_hit_size;
set_ene->dir = dir;
set_ene->w_dir = 0;
set_ene->anime = enemy_data[set_ene->code].anime;
set_ene->anime_c = 0;
set_ene->atari = enemy_data[set_ene->code].atari;
set_ene->next_shot = enemy_data[set_ene->code].next_shot;
set_ene->next_shot_c = ene->next_shot;
ene->hp = enemy_data[ene->code].hp;
set_ene->item = ene->item;
ene->generate = 0;
break;
}
}
}
//----------マップ敵セット--------------------------------------------------------
void set_map_enemy(int cx,int cy,int code) {
//敵テーブルの空きを探す
for (int i = 0; i < ENEMY_MAX; i++) {
ENEMY_CHR *ene = &enemy[i];
if (ene->code == 0) {
ene->code = code;
ene->cx = cx;
ene->cy = cy;
ene->dir = 3.14;
ene->item = 0;
ene->num = 0;
ene->next_generate = 0;
ene->generate = 0;
ene->next_generate_c = 0;
ene->x_hit_size = enemy_data[ene->code].x_hit_size;
ene->y_hit_size = enemy_data[ene->code].y_hit_size;
ene->x_graph_size = enemy_data[ene->code].x_graph_size;
ene->y_graph_size = enemy_data[ene->code].y_graph_size;
ene->w_dir = 0;
ene->anime = enemy_data[ene->code].anime;
ene->anime_c = 0;
ene->atari = enemy_data[ene->code].atari;
ene->next_shot = enemy_data[ene->code].next_shot;
ene->next_shot_c = ene->next_shot;
break;
}
}
}
//----------敵動き-----------------------------------------------------------
void move_enemy(void) {
enemy_num = 0;
for (int i = 0; i < ENEMY_MAX; i++) {
ENEMY_CHR *ene = &enemy[i];
switch (ene->code){
case 1:
case 2:enemy_type001(ene); break;
case 3:
case 4:enemy_type002(ene); break;
case 5:
case 6:enemy_type003(ene); break;
case 7:enemy_type007(ene); break;
case 8:enemy_type008(ene); break;
case 9:enemy_type009(ene); break;
case 10:enemy_type010(ene); break;
case 11:enemy_type011(ene); break;
case 12:enemy_type011(ene); break;
case 900:enemy_explosion1(ene); break;
case 910:power_up(ene); break;
case 1000:enemy_type1000(ene); break;
case 1100:enemy_generate(ene); break;
case 1101:enemy_map_generate(ene); break;
}
if (ene->code > 0) {
enemy_num++;
}
}
}
//----------直進する---------------------------------------------------------
void enemy_type001(ENEMY_CHR *ene) {
ene->cx -= 3;
ene->dir += 8;
if (ene->dir > 360) {
ene->dir = 0;
}
if (ene->next_shot_c < 0) {
set1_enemy(ene, 1000, enemy_dir(chr.cx, chr.cy, ene->cx, ene->cy));
ene->next_shot_c = ene->next_shot;
}
ene->next_shot_c--;
sp_set(ene->cx, ene->cy, ene->x_graph_size, ene->y_graph_size,1,1,ene->dir*3.14/180,enemy_graph[ene->anime],0,0,2);
chr_hit(ene);
//画面から出たら消す
if (ene->cx < -80) {
ene->code = 0;
ene->atari = 0;
}
}
//----------サインカーブ-----------------------------------------------------
void enemy_type002(ENEMY_CHR *ene) {
ene->cx -= 3;
ene->dir += 4;
if (ene->dir > 360) {
ene->dir = 0;
}
ene->cy += sin(ene->dir*PI/180) * 5;
if (ene->anime_c >= 31) {
ene->anime_c = 0;
}
sp_set(ene->cx, ene->cy, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[ene->anime_c / 4 + ene->anime], 0, 0, 2);
ene->anime_c++;
chr_hit(ene);
//画面から出たら消す
if (ene->cx < -80) {
ene->code = 0;
}
}
//----------追尾してくる敵-----------------------------------------------------
void enemy_type003(ENEMY_CHR *ene) {
if (ene->anime_c < -60) {//初期移動までは直線に動きます
ene->w_dir = ene->dir;//前回の角度を保存
ene->dir = enemy_dir(chr.cx, chr.cy, ene->cx, ene->cy);//自機との角度を取得
ene->dir = next_dir(ene, 2);//新しい角度を更新
}
ene->anime_c--;
//三角関数で移動をさせる
ene->cx += cos(ene->dir)*3;
ene->cy += sin(ene->dir)*3;
chr_hit(ene);
sp_set(ene->cx, ene->cy, ene->x_graph_size, ene->y_graph_size, 1, 1,ene->dir, enemy_graph[ene->anime], 0, 0, 2);
}
//---------ハッチ下から上-------------------------------------------------------
void enemy_type007(ENEMY_CHR *ene) {
ene->cx -= scroll_speed;
if (ene->anime_c == 80) {
ene->anime = 21;
}
if (ene->anime_c == 90) {
ene->anime = 22;
}
if (ene->anime_c == 100) {
ene->anime = 23;
}
if (ene->anime_c == 110) {
ene->anime = 24;
}
if ((ene->anime_c >= 120) && (ene->anime_c <= 240)) {
if (ene->next_shot_c < 0) {
set1_enemy(ene, 9, 270 * PI / 180);
ene->next_shot_c = ene->next_shot;
}
ene->next_shot_c--;
}
if (ene->anime_c == 250) {
ene->anime = 23;
}
if (ene->anime_c == 260) {
ene->anime = 22;
}
if (ene->anime_c == 270) {
ene->anime = 21;
}
if (ene->anime_c == 280) {
ene->anime = 20;
ene->anime_c = 0;
}
ene->anime_c++;
sp_set(ene->cx - 20, ene->cy - 20, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[ene->anime], 0, 0, 2);
sp_set(ene->cx + 20, ene->cy - 20, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[ene->anime], 1, 0, 2);
sp_set(ene->cx - 20, ene->cy + 20, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[25], 0, 0, 2);
sp_set(ene->cx + 20, ene->cy + 20, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[25], 1, 0, 2);
chr_hit(ene);
//画面から出たら消す
if (ene->cx < -160) {
ene->code = 0;
ene->atari = 0;
}
}
//---------ハッチ上から下へ-----------------------------------------------------
void enemy_type008(ENEMY_CHR *ene) {
ene->cx -= scroll_speed;
if (ene->anime_c == 80) {
ene->anime = 21;
}
if (ene->anime_c == 90) {
ene->anime = 22;
}
if (ene->anime_c == 100) {
ene->anime = 23;
}
if (ene->anime_c == 110) {
ene->anime = 24;
}
if ((ene->anime_c >= 120) && (ene->anime_c <= 240)) {
if (ene->next_shot_c < 0) {
set1_enemy(ene, 10, 90 * PI / 180);
ene->next_shot_c = ene->next_shot;
}
ene->next_shot_c--;
}
if (ene->anime_c == 250) {
ene->anime = 23;
}
if (ene->anime_c == 260) {
ene->anime = 22;
}
if (ene->anime_c == 270) {
ene->anime = 21;
}
if (ene->anime_c == 280) {
ene->anime = 20;
ene->anime_c = 0;
}
ene->anime_c++;
sp_set(ene->cx + 20, ene->cy - 20, ene->x_graph_size, ene->y_graph_size, 1, 1, PI, enemy_graph[25], 0, 0, 2);
sp_set(ene->cx - 20, ene->cy - 20, ene->x_graph_size, ene->y_graph_size, 1, 1, PI, enemy_graph[25], 1, 0, 2);
sp_set(ene->cx + 20, ene->cy + 20, ene->x_graph_size, ene->y_graph_size, 1, 1, PI, enemy_graph[20], 0, 0, 2);
sp_set(ene->cx - 20, ene->cy + 20, ene->x_graph_size, ene->y_graph_size, 1, 1, PI, enemy_graph[20], 1, 0, 2);
chr_hit(ene);
//画面から出たら消す
if (ene->cx < -160) {
ene->code = 0;
ene->atari = 0;
}
}
//----------ハッチの敵下から上へ-----------------------------------------------
void enemy_type009(ENEMY_CHR *ene) {
ene->cx -= scroll_speed;
ene->cy -= 3;
if (ene->next_shot_c < 0) {
set1_enemy(ene, 1000, enemy_dir(chr.cx, chr.cy, ene->cx, ene->cy));
ene->next_shot_c = ene->next_shot;
}
ene->next_shot_c--;
if (ene->anime_c >= 31) {
ene->anime_c = 0;
}
sp_set(ene->cx, ene->cy, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[ene->anime_c/4+30], 0, 0, 3);
ene->anime_c++;
chr_hit(ene);
//画面から出たら消す
if ((ene->cx < -20) || (ene->cx > 820) || (ene->cy < -20) || (ene->cy > 620)) {
ene->code = 0;
ene->atari = 0;
}
}
//----------ハッチの敵上から下へ----------------------------------------------
void enemy_type010(ENEMY_CHR *ene) {
ene->cx -= scroll_speed;
ene->cy += 3;
if (ene->next_shot_c < 0) {
set1_enemy(ene, 1000, enemy_dir(chr.cx, chr.cy, ene->cx, ene->cy));
ene->next_shot_c = ene->next_shot;
}
ene->next_shot_c--;
if (ene->anime_c >= 31) {
ene->anime_c = 0;
}
sp_set(ene->cx, ene->cy, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[ene->anime_c / 4 + 30], 0, 0, 3);
ene->anime_c++;
chr_hit(ene);
//画面から出たら消す
if ((ene->cx < -20) || (ene->cx > 820) || (ene->cy < -20) || (ene->cy > 620)) {
ene->code = 0;
ene->atari = 0;
}
}
//----------砲台---11の時下 12の時上--------------------------------------------
void enemy_type011(ENEMY_CHR *ene) {
int kakudo;
ene->dir = enemy_dir(chr.cx, chr.cy, ene->cx, ene->cy);
kakudo = abs(int(ene->dir * 180 / PI));
ene->cx -= scroll_speed;
if (ene->next_shot_c < 0) {
set1_enemy(ene, 1000,ene->dir);
ene->next_shot_c = ene->next_shot;
}
ene->next_shot_c--;
if (ene->code == 11) {//下から上
switch ((kakudo) / 22) {
case 0:ene->anime = 48; break;
case 1:ene->anime = 47; break;
case 2:ene->anime = 46; break;
case 3:ene->anime = 45; break;
case 4:ene->anime = 44; break;
case 5:ene->anime = 43; break;
case 6:ene->anime = 42; break;
case 7:ene->anime = 41; break;
case 8:ene->anime = 40; break;
default:ene->anime = 44; break;
}
sp_set(ene->cx, ene->cy, ene->x_graph_size, ene->y_graph_size, 1, 1, 0, enemy_graph[ene->anime], 0, 0, 3);
}
else {//上から下
switch ((kakudo) / 22) {
case 0:ene->anime = 40; break;
case 1:ene->anime = 41; break;
case 2:ene->anime = 42; break;
case 3:ene->anime = 43; break;
case 4:ene->anime = 44; break;
case 5:ene->anime = 45; break;
case 6:ene->anime = 46; break;
case 7:ene->anime = 47; break;
case 8:ene->anime = 48; break;
default:ene->anime = 44; break;
}
sp_set(ene->cx, ene->cy, ene->x_graph_size, ene->y_graph_size, 1, 1,PI, enemy_graph[ene->anime], 0, 0, 3);
}
chr_hit(ene);
//画面から出たら消す
if (ene->cx < -20){
ene->code = 0;
ene->atari = 0;
}
}