シューティングゲーム作ってます

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

シューティングゲーム作ってます

#1

投稿記事 by tutu » 13年前

龍神録プログラミングの館でプログラミングをしています。(http://dixq.net/rp/index.html)11を見たときその通りやっているのに敵が表示されません。
どうすればよいですか。(エクセルのデータもダウンロードしてプログラムのファイルに入れました。)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: シューティングゲーム作ってます

#2

投稿記事 by softya(ソフト屋) » 13年前

知恵袋の方はちゃんとベストアンサーを決めてあげてくださいね。
で、今回の問題ですが打ち込んだソースコードがないと何とも言えません。
codeタグを使って貼り付けてください。 http://dixq.net/board/board.html#k10

それとLog.txtにエラーが出ていないか確認してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tutu

Re: シューティングゲーム作ってます

#3

投稿記事 by tutu » 13年前

tutuです。分割コンパイルになっているため、敵の表示に関係あるところを貼り付けます。

enemy.cpp

コード:

#include "../include/GV.h"

//敵の移動パターン0での移動制御
void enemy_pattern0(int i){
	int t=enemy[i].cnt;
    if(t==0)
        enemy[i].vy=2;//下がってくる
	if(t==60)
		enemy[i].vy=0;//止まる
    if(t==60+enemy[i].wait)//登録された停滞時間だけして
        enemy[i].vy=-2;//上がっていく
}

//空いている敵番号を検索
int enemy_num_search(){
	for(int i=0;i<ENEMY_MAX;i++){//フラグのたって無いenemyを探す
		if(enemy[i].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[i].flag	=1;//フラグ
				enemy[i].cnt	=0;//カウンタ
				enemy[i].pattern=enemy_order[t].pattern;//移動パターン
				enemy[i].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];//落とすアイテム
			}
		}
	}
}

//敵の行動制御
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();
}

main.cpp

[code=cpp]define GLOBAL_INSTANCE 
#include "../include/GV.h"


//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    GetHitPadStateAll();  //現在のパッド入力処理を行う
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

    while(ProcessLoop()==0){//メインループ
        switch(func_state){
            case 0://初回のみ入る処理
                load();        //データロード
                first_ini();//初回の初期化
                func_state=99;
                break;
            case 99://STGを始める前に行う初期化
                ini();
                func_state=100;
                break;
            case 100://通常処理
                calc_ch();    //キャラクタ計算
                ch_move();    //キャラクタの移動制御
                enemy_main();//敵処理メイン
                graph_main();//描画メイン
                stage_count++;
                break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }
        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
    }
    DxLib_End();//DXライブラリ終了処理
    return 0;
}

GV.h(グローバル関数の定義のファイル)

[code=cpp]#include "../../../include/DxLib.h"
#include "define.h"
#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif

#include "function.h"           //関数宣言
#include "math.h"




//画像用変数宣言部
GLOBAL int img_ch[2][12];       //キャラクタ画像9枚分 X2(変身用)
GLOBAL int func_state;
GLOBAL int img_board[40];
GLOBAL int stage_count;
GLOBAL int img_enemy[3][9];//敵画像9枚分 X3体分
GLOBAL enemy_t enemy[ENEMY_MAX];
function.h

コード:

//graph.cpp
        //描画メイン
        GLOBAL void graph_main();

//key.cpp
        //現在のキー入力処理を行う
        GLOBAL int GetHitKeyStateAll_2();
        //受け取ったキー番号の現在の入力状態を返す
        GLOBAL int CheckStateKey(unsigned char Handle);

//laod.cpp
        //データのロード
        GLOBAL void load();

GLOBAL void first_ini();
GLOBAL void calc_ch();
GLOBAL void GetHitPadStateAll();
GLOBAL int CheckStatePad(unsigned int Handle);
GLOBAL void ch_move();
GLOBAL void enemy_main();
GLOBAL void ini();
GLOBAL void load_story();
load.cpp

コード:

#include "../include/GV.h"



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"};
	int input[64];
	char inputc[64];

	fp = FileRead_open(fname);//ファイル読み込み
	if(fp == NULL){
		printfDx("read error\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[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){//ファイルの終わりなら
				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);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: シューティングゲーム作ってます

#4

投稿記事 by softya(ソフト屋) » 13年前

デバッガのブレークポイントを使って確認して欲しいのですが、load_story()が呼び出されていないのでは無いでしょうか?
「太田研究室 > Visual C++ 2008 Express Edition プログラミング入門 プログラムのデバッグ実行」
http://cvwww.ee.ous.ac.jp/vc08prog.html#6
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: シューティングゲーム作ってます

#5

投稿記事 by Dixq (管理人) » 13年前

敵を登録する処理は通っていますか?
enemy_order
に正確な値が入っていないとenemy_enterで敵が登録されません。
まずsoftyaさんが仰る通り、呼び出されていることを確認の上、enemy_enterが呼ばれており、enemy_orderに値がきちんと入っていることをご確認ください。

tutu

シューティングゲーム作ってます

#6

投稿記事 by tutu » 13年前

皆さん回答ありがとうございます。
解決しました。ありがとうございました。

閉鎖

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