私は現在、龍神録プログラミングの館を参考にしながら、自分なりにポインタを使ってグローバル変数を使わないようにしてプログラムを組んでおります
そこそこスムーズに進んでいたのですが、11章、エクセルを使って敵の出現データを作ってみよう(http://dixq.net/rp/11.html)で詰んでしまいました
具体的にはプログラムを実行すると、黒い画面が表示された数秒の後フリーズし、プログラムが停止しましたのウインドウが表示されます
以下ソースコードです 全てを貼ると非常に長くなってしまうため10章からの変更、追加点及びに関係しそうな部分のみ添付させていただきます
//main.cpp
#include "DxLib.h"
#include "struct.h"
#include "load.h"
#include "graph.h"
#include "player.h"
#include "define.h"
#include "enemy.h"
int key_update(int*);
int check_shift(int,int);
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen(DX_SCREEN_BACK);
int key[256],board,stage_count=0,fanction=0;
ch_t player;
enemy_t enemy[ENEMY_MAX];
enemy_t enemy_order[ENEMY_ORDER_MAX];
player.x = 160.0;
player.y = 300.0;
load_graph(&player.img,&board,enemy);
load_story(enemy_order);
while(ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0)
{
stage_count++;
graph_ch(&player);
graph_enemy(enemy);
graph_board(&board);
key_update(key);
if(key[KEY_INPUT_RSHIFT] > 0||key[KEY_INPUT_LSHIFT] > 0)
slow_move(&player,key);
else if(key[KEY_INPUT_UP]>0 || key[KEY_INPUT_RIGHT]>0 || key[KEY_INPUT_DOWN]>0 || key[KEY_INPUT_LEFT]>0)
quick_move(&player,key);
enemy_enter(enemy,&stage_count,enemy_order);
enemy_action(enemy,&stage_count);
}
DxLib_End();
return 0;
}
int key_update(int key[])
{
char all_key[256];
GetHitKeyStateAll(all_key);
int i;
for(i=0;i<256;i++)
{
if(all_key[i] != 0)
key[i]++;
else
key[i] = 0;
}
return 0;
}
//ここまでmain.cpp、ここから↓graph.cpp
#include "DxLib.h"
#include "struct.h"
#include "graph.h"
#include "define.h"
int graph_ch(ch_t *player)
{
DrawGraph(player->x,player->y,player->img,TRUE);
return 0;
}
int graph_board(int *board)
{
DrawGraph(0,0,*board,TRUE);
return 0;
}
int graph_enemy(enemy_t *enemy)
{
int i;
for(i=0;i<30;i++)
{
if(enemy[i].flag == 1)
{
DrawRotaGraph(enemy[i].x,enemy[i].y,0.5,0.0,enemy[i].img,TRUE);
}
}
return 0;
}
//ここまでgraph.cpp、ここから↓load.cpp
#include "DxLib.h"
#include "define.h"
#include "struct.h"
#include "load.h"
int load_graph(int *player,int *board,enemy_t *enemy)
{
*player = LoadGraph("画像/キャラクタ01.png");
*board = LoadGraph("画像/board.png");
int i;
for(i=0;i<ENEMY_MAX;i++)
{
enemy[i].img = LoadGraph("画像/雑魚.png");
}
return 0;
}
int load_story(enemy_t *enemy_order)
{
int n,num,i,fp;
int input[64];
char inputc[64];
fp = FileRead_open("date/storyH0.csv");
if(fp == NULL)
{
printfDx("error");
return -1;
}
for(i=0;i<2;i++)
{
while(FileRead_getc(fp)!='\n')
{
while(FileRead_getc(fp)!='\n');
}
}
n = 0,num = 0;
while(1)
{
for(i=0;i<64;i++)
{
inputc[i]=input[i]=FileRead_getc(fp);//1文字取得する
if(inputc[i]=='/')
{
while(FileRead_getc(fp)!='\n');//改行までループ
i=-1;//カウンタを最初に戻して
continue;
}
if(input[i]==',' || input[i]=='\n')
{
inputc[i]='\0';
break;
}
if(input[i]==EOF)
{
FileRead_close(fp);
return 0;
}
}
switch(num)
{
case 0: enemy_order[n].count =atoi(inputc);break;
case 1: enemy_order[n].pattern =atoi(inputc);break;
case 2: enemy_order[n].kind =atoi(inputc);break;
case 3: enemy_order[n].x =atof(inputc);break;
case 4: enemy_order[n].y =atof(inputc);break;
case 5: enemy_order[n].sp =atof(inputc);break;
case 6: enemy_order[n].bltime =atoi(inputc);break;
case 7: enemy_order[n].blknd =atoi(inputc);break;
case 8: enemy_order[n].color =atoi(inputc);break;
case 9: enemy_order[n].hp =atoi(inputc);break;
case 10:enemy_order[n].blknd2 =atoi(inputc);break;
case 11:enemy_order[n].wait =atoi(inputc);break;
case 12:enemy_order[n].item_n[0]=atoi(inputc);break;
case 13:enemy_order[n].item_n[1]=atoi(inputc);break;
case 14:enemy_order[n].item_n[2]=atoi(inputc);break;
case 15:enemy_order[n].item_n[3]=atoi(inputc);break;
case 16:enemy_order[n].item_n[4]=atoi(inputc);break;
case 17:enemy_order[n].item_n[5]=atoi(inputc);break;
}
num++;
if(num==18)
{
num=0;
n++;
}
}
return 0;
}
//ここまでload.cpp、ここから↓enemy.cpp
#include "DxLib.h"
#include "struct.h"
#include "enemy.h"
#include "define.h"
int enemy_pattern0(enemy_t **enemy,int *i)
{
if((*enemy[*i]).count == 0)
(*enemy[*i]).vy += 2;
if((*enemy[*i]).count == 60)
(*enemy[*i]).vy += 0;
if((*enemy[*i]).count == 60+(*enemy[*i]).wait)
(*enemy[*i]).vy -= 2;
return 0;
}
int enemy_flag_search(enemy_t **enemy)
{
int i;
for(i=0;i<ENEMY_MAX;i++)
{
if((*enemy[i]).flag == 0)
return i;
}
return -1;
}
int enemy_enter(enemy_t *enemy,int *stage_count,enemy_t *enemy_order)
{
int i,j,t;
for(t=0;t<ENEMY_ORDER_MAX;t++)
{
if(enemy_order[t].count == *stage_count)
{
if(i=enemy_flag_search(&enemy) != -1)
{
enemy[i].flag =1;//フラグ
enemy[i].count =0;//カウンタ
enemy[i].pattern=enemy_order[t].pattern;//移動パターン
enemy[i].muki =1;//向き
enemy[i].kind =enemy_order[t].kind;//敵の種類
enemy[i].x =enemy_order[t].x;//座標
enemy[i].y =enemy_order[t].y;
enemy[i].sp =enemy_order[t].sp;//スピード
enemy[i].bltime =enemy_order[t].bltime;//弾の発射時間
enemy[i].blknd =enemy_order[t].blknd;//弾幕の種類
enemy[i].blknd2 =enemy_order[t].blknd2;//弾の種類
enemy[i].color =enemy_order[t].color;//色
enemy[i].wait =enemy_order[t].wait;//停滞時間
enemy[i].hp =enemy_order[t].hp;//体力
enemy[i].hp_max =enemy[i].hp;//体力最大値
enemy[i].vx =0;//水平成分の速度
enemy[i].vy =0;//鉛直成分の速度
enemy[i].ang =0;//角度
for(j=0;j<6;j++)
{
enemy[i].item_n[j]=enemy_order[t].item_n[j];//落とすアイテム
}
}
}
}
return 0;
}
int enemy_action(enemy_t *enemy,int *stage_count)
{
int i;
for(i=0;i<ENEMY_MAX;i++)
{
if(enemy[i].flag == 1)
{
enemy_pattern0(&enemy,&i);
enemy[i].count++;
}
if(enemy[i].x < -30 || enemy[i].x > 500 || enemy[i].y < -30 || enemy[i].y > 500)
enemy[i].flag = 0;
}
return 0;
}
//ここまでenemy.cpp、ここからstruct.h
#ifndef INCLUDE_STRUCT
#define INCLUDE_STRUCT
struct ch_t
{
int flag; //フラグ
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int money; //お金
int img; //画像
int slow; //スローかどうか
double x,y; //座標
};
struct enemy_t
{
int flag; //フラグ
int count; //カウンタ
int pattern; //移動パターン
int muki; //向き
int kind; //種類
int hp; //体力
int hp_max; //最大体力
int item_n[6]; //アイテム
int img; //画像
double x; //座標x
double y; //座標y
double vx; //x速度
double vy; //y速度
double sp; //スピード
double ang; //角度
int bltime; //弾幕開始時間
int blknd; //弾幕の種類
int blknd2; //弾の種類
int color; //色
int state; //状態
int wtime; //待機時間
int wait; //停滞時間
};
#endif
//ここまでstruct.h,ここから↓define.h
#ifndef DEFINE_INCLUDE
#define DEFINE_INCLUDE
#define WHITE GetColor(255,255,255)
#define ENEMY_MAX 30
#define X_MIN -8
#define Y_MIN -37
#define X_MAX 351
#define Y_MAX 361
#define ENEMY_ORDER_MAX 500
#endif
ヒントだけでも教えていただけるとうれしいです
よろしくお願いします