変数の入れ物は必要なのか

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ととろ

変数の入れ物は必要なのか

#1

投稿記事 by ととろ » 16年前

すみません。csvファイルの読み込みが3日たってもうまくいかず、とりあえずenemy_enter()の中に
データの値を打ち込んでそのまま読み込ませることにしました。
そうすると敵も表示され、しかもちゃんと動きます。
しかし敵の何匹かが途中でいきなり自機の画像に入れ替わりました
例えは悪いですがポケモンのメタモンの「変身」のように。
このプログラムでは、龍神録のようにenemy_order[n]を用意してですが、データを読み取る場合
変数の入れ物は必要でしょうか?
処理が追いつかず入れ替わりが起こるのでしょうか?
#include "dxlibp.h"
#include "GV.h"

#define ENEMY_PATTERN_MAX 11

extern void enemy_pattern0(int);extern void enemy_pattern1(int);extern void enemy_pattern2(int);
extern void enemy_pattern3(int);extern void enemy_pattern4(int);extern void enemy_pattern5(int);
extern void enemy_pattern6(int);extern void enemy_pattern7(int);extern void enemy_pattern8(int);
extern void enemy_pattern9(int);extern void enemy_pattern10(int);

void (*enemy_pattern[ENEMY_PATTERN_MAX])(int) = {
    enemy_pattern0,    enemy_pattern1,    enemy_pattern2,    enemy_pattern3,    enemy_pattern4,
    enemy_pattern5,    enemy_pattern6,    enemy_pattern7,    enemy_pattern8,    enemy_pattern9,
    enemy_pattern10,
};




int  enemy_num_search(){
    int i;    
	for(i=0;i<ENEMY_MAX;i++){//フラグのたって無いenemyを探す
                if(enemy.flag==0){
                        return i;//使用可能番号を返す
                }
        }
        return -1;//全部埋まっていたらエラーを返す
}



//敵情報を登録
void enemy_enter(){//敵の行動を登録・制御する関
	int n,i;
	int cnt1[11]      ={100,180,260,340,420,500,580,660,740,820,900};
	int pattern1[11]  ={0,1,2,3,4,5,6,7,8,9,10};
	int knd1[11]      ={0,0,0,0,0,0,0,0,0,0,0};	
	int bltime1[11]   ={0,0,0,0,0,0,0,0,0,0,0};
	int blknd1[11]    ={0,0,0,0,0,0,0,0,0,0,0};
	int blknd21[11]   ={0,0,0,0,0,0,0,0,0,0,0};
	int col1[11]      ={0,0,0,0,0,0,0,0,0,0,0};
	int wait1[11]     ={120,120,120,120,120,120,120,120,120,120,350};
	int hp1[11]       ={100,100,100,100,100,100,100,100,100,100,100};
    double x1[11]     ={180,200,180,200,180,200,180,200,180,200,180};
	double y1[11]     ={-20,-20,-20,-20,-20,-20,-20,150,150,150,-20};	
	double sp1[11]    ={0,0,0,0,0,0,0,0,0,0,0};
	
	
	  
		for(n=0;n<11;n++){
		         if(cnt1[n]==stage_count){//現在の瞬間がオーダーの瞬間なら
           		 if((i=enemy_num_search())!=-1){								
                      enemy.flag   =1;
                                enemy.cnt    =0;
                                enemy.pattern=pattern1[n];
                                enemy.muki   =1;
                                enemy.knd    =knd1[n];
                                enemy.x      =x1[n];
                                enemy.y      =y1[n];
                                enemy.sp     =sp1[n];
                                enemy.bltime =bltime1[n];
                                enemy[i].blknd  =blknd1[n];
                                enemy[i].blknd2 =blknd21[n];
                                enemy[i].col    =col1[n];
                                enemy[i].wait   =wait1[n];
                                enemy[i].hp     =hp1[n];
                                enemy[i].hp_max =enemy[i].hp;
                                enemy[i].vx     =0;
                                enemy[i].vy     =0;
                                enemy[i].ang    =0;     
                         }
                  }	
         }
}



//敵の行動制御
void enemy_act(){    
	int i;
    for(i=0;i<ENEMY_MAX;i++){
        if(enemy[i].flag==1){//その敵のフラグがオンになってたら
            enemy_pattern[enemy[i].pattern](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%24)/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();
}

kazuoni

Re:変数の入れ物は必要なのか

#2

投稿記事 by kazuoni » 16年前

>しかし敵の何匹かが途中でいきなり自機の画像に入れ替わりました

大抵
・意図的にそのように表示している
・メモリアクセスしてはいけないところにアクセスしている
が原因かと思います。
配列で[11]と決めているのに、
-1
12
などと、配列範囲外にアクセスしていないか
今一度確認してみてください。

>データを読み取る場合変数の入れ物は必要でしょうか?

もちろん必要です。

>処理が追いつかず入れ替わりが起こるのでしょうか?

処理が追いつかないは「処理落ち」といって、
ゲームでは、画面がカクカクになることは頻繁に起こり得ますが、
それによって、変数の中身に影響することはないです。
プログラムは自分が書いたままの通り動きます。


恐らく、まだC言語の知識が固まってないのではないでしょうか?
正直なところ、龍神録はある程度のCの知識が必要かと思います。
入門書や入門ウェブページを一通り理解すると、
ものすごいはかどるかと思いますよ。

zwi

Re:変数の入れ物は必要なのか

#3

投稿記事 by zwi » 16年前

C言語の基本は、ちゃんと押さえておいた方が良いと思います。
それが出来ていないと余計な回り道をしてしまうことが多いです。
サイトを紹介しますので参考にしてください。

「C言語入門」
http://www5c.biglobe.ne.jp/~ecb/c/c00.html
「苦しんで覚えるC言語」
http://homepage3.nifty.com/mmgames/c_guide/

上記サイトにある全ての練習問題が解いてみてください。
弱点が見えてくると思います。

conio

Re:変数の入れ物は必要なのか

#4

投稿記事 by conio » 16年前

あれ、csvファイルの読み込みは正常に終了したのではないのですか?

まぁそれはともかく、ずっとデータの形式が固定であればこんな感じにしてはどうでしょうか。
--------------------------------------------------------------------------------------
#include<stdio.h>

void LoadFile(char* file_name)
{
	FILE* fp;
	int result = 0;
	char s[80];
	char* DATA_SCAN = "%[^,],%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d";
	char* DATA_PRINT = "%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %d\n";
	int cnt,pattern,knd,bltime,blknd,blknd2,coll,wait,hp,x,y,sp;//データ12個

	fp = fopen( file_name, "r" );
	if( fp == NULL ){
		printf( "%sファイルが開けません\n", file_name);
	}else{
		fscanf( fp,"%s",s);//最初の一行を飛ばす
		while( ( result = fscanf( fp, DATA_SCAN, s, &cnt,&pattern,&knd,&bltime,&blknd,&blknd2,&coll,&wait,&hp,&x,&y,&sp ) ) != EOF )
		{
			printf( DATA_PRINT, cnt,pattern,knd,bltime,blknd,blknd2,coll,wait,hp,x,y,sp );
		}
	 fclose( fp );
	}
}

int main(void)
{
	LoadFile("data.csv");
	return(0);
}
--------------------------------------------------------------------------------------
データも添付しておきました。
保存して"data.csv"に名前を変更し、プロジェクトのある場所にcsvファイルを
移動させてやれば動くはずです。

あと、このプログラムは変数をそれぞれ一つだけ用意し、上書きしながらprintf関数で表示するだけなので
適宜 データを保存する配列を用意し、代入するように書き換えればよいと思います。

ととろ

Re:変数の入れ物は必要なのか

#5

投稿記事 by ととろ » 16年前

解決しました。原因は龍神録の敵の画像は3×3。
自分らが使ってたのは1×8だったからです。
敵の画像表示計算を弄くって直せました。

それでもやはり思ったことは自分は用語とかまったく分かってませんね。
一応昔ゲームプログラミングは一通りやったのですが、全く頭に入っていませんね。
これを機に一冊本でも買って勉強しようと思います

閉鎖

“C言語何でも質問掲示板” へ戻る