ページ 1 / 1
龍神録プログラミングの館 11章
Posted: 2009年3月16日(月) 16:58
by ふぁんとむ
エクセルデータから敵キャラの移動制御を行う変更なのですが、サンプルプログラムをそのまま打ち込んでみても、サイトからコピペしてみても実行結果として表示されている動画と同じようには動きません
症状としてはビルド直後に1体が左端に出現、停滞、帰還をしその後に、6対が同じような動きをします
苦肉の策としてenemy_enter関数の落とすアイテムのforループの直後に『printfDx("enemy%d=%f stage_count=%d\n",i,enemy.x,stage_count);』を組み込んでみた結果を見てみると、最初に出現する1体は30体が重なっていて、その後に出現する6体のみにエクセルから読み込んだデータが反映しているようにも思えます
念のためにこの章で組みなおしたソースを、レスに貼り付けてみます
Re:龍神録プログラミングの館 11章
Posted: 2009年3月16日(月) 16:58
by ふぁんとむ
-- load.cpp --
#include "../include/GV.h"
//extern int img_ch[2][12];
void load()
{
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");
LoadDivGraph("../dat/img/char/0.png", 12 , 4, 3, 73, 73, img_ch[0]);
LoadDivGraph("../dat/img/enemy/0.png", 9, 3, 3, 32, 32, img_enemy[0]);
}
//敵の出現情報をエクセルから読み込んで格納する関数
void load_story()
{
int n,num,i,fp;
char fname[32]={"../dat/csv/storyH0.csv"};
int input[64];
char inputc[64];
fp = FileRead_open(fname); //ファイル読み込み
if(fp == NULL)
{
printfDx("read error\n(load_story)\n");
return;
}
for(i=0;i<2;i++) //最初の2行読み飛ばす
while(FileRead_getc(fp)!='\n');
n=0 , num=0;
while(1)
{
for(i=0;i<64;i++)
{
inputc=input=FileRead_getc(fp); //1文字取得する
if(inputc=='/') //スラッシュがあれば
{
while(FileRead_getc(fp)!='\n'); //改行までループ
i=-1; //カウンタを最初に戻して
continue;
}
if(input==',' || input=='\n') //カンマか改行なら
{
inputc='\0'; //そこまでを文字列とし
break;
}
if(input==EOF) //ファイルの終わりなら
{
goto EXFILE; //終了
}
}
switch(num)
{
case 0:
enemy_order[n].cnt =atoi(inputc); break;
case 1:
enemy_order[n].pattern =atoi(inputc); break;
case 2:
enemy_order[n].knd =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].col =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++;
}
}
EXFILE:
FileRead_close(fp);
}
Re:龍神録プログラミングの館 11章
Posted: 2009年3月16日(月) 16:59
by ふぁんとむ
-- enemy.cpp --
#include "../include/GV.h"
//敵の移動パターン0での移動制御
void enemy_pattern0(int i)
{
int t=enemy.cnt;
if (t==0) enemy.vy=2; //下がってくる
if (t==60) enemy.vy=0; //止まる
if (t==60+enemy.wait) //登録された時間だけ停滞して
enemy.vy=-2; //上がっていく
}
//空いている敵番号を検索
int enemy_num_search()
{
for (int i=0; i<ENEMY_MAX; i++) //フラグのたっていないenemyを探す
{
if (enemy.flag==0) return i; //使用可能番号を返す
}
return -1; //全て埋まっていたら、エラーを返す
}
//敵情報登録(敵の行動を登録・制御する関数)
void enemy_enter()
{
int i,j,t;
for(t=0;t<ENEMY_ORDER_MAX;t++)
{
if(enemy_order[t].cnt==stage_count) //現在の瞬間がオーダーの瞬間なら
{
if((i=enemy_num_search())!=-1)
{
enemy.flag =1; //フラグ
enemy.cnt =0; //カウンタ
enemy.pattern=enemy_order[t].pattern;//移動パターン
enemy.muki =1; //向き
enemy[i].knd =enemy_order[t].knd; //敵の種類
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].col =enemy_order[t].col; //色
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];
printfDx("enemy%d=%f stage_count=%d\n",i,enemy[i].x,stage_count);
}
}
}
}
//敵の行動制御
void enemy_act()
{
int i;
for (i=0; i<ENEMY_MAX; i++)
{
if (enemy[i].flag==1) //その敵のフラグがオンになってたら
{
enemy_pattern0(i);
enemy[i].x+=cos(enemy[i].ang)*enemy[i].sp;
enemy[i].y+=sin(enemy[i].ang)*enemy[i].sp;
enemy[i].x+=enemy[i].vx;
enemy[i].y+=enemy[i].vy;
enemy[i].cnt++;
enemy[i].img=enemy[i].muki*3+(enemy[i].cnt%18)/6;
//敵が画面から外れたら消す
if ( enemy[i].x<-20 || FIELD_MAX_X+20<enemy[i].x ||
enemy[i].y<-20 || FIELD_MAX_Y+20<enemy[i].y)
enemy[i].flag=0;
}
}
}
//敵処理メイン
void enemy_main()
{
enemy_enter();
enemy_act();
}
お力添えいただけますようお願いしますm(__)m
Re:龍神録プログラミングの館 11章
Posted: 2009年3月16日(月) 17:31
by Mist
規約を守ってソースコードはpreタグで囲んで字下げしてください。
すごく読みにくいです。
Re:龍神録プログラミングの館 11章
Posted: 2009年3月16日(月) 17:43
by fatens
ini.cppのini関数を確認してください。
stage_count=0となっていたら、stage_count=1にしてみてください。
11章の変更点にはなっていないので、忘れている可能性があります。
Re:龍神録プログラミングの館 11章
Posted: 2009年3月16日(月) 18:03
by ふぁんとむ
>Mistさん
左クリックしても開かなかったので、規約を読まずに読みにくい書き込みをしてしまって申しわけありませんでした
右クリックで別ウインドウで開いたら読めましたので、以後気をつけます
>fatensさん
仰るとおり、ini.cppを確認したところ、『stage_count=』そのものがなかったので、付け加えてビルドしたところ、正常に作動しました
有難うございました
これで次に進めます