[26章]ボスの移動について

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

[26章]ボスの移動について

#1

投稿記事 by whity » 14年前

26章を参考に、ボスを表示させてみたのですが、ボスがふわふわと移動しません。
ショットが当たると、hpが減っているようなので、当たり判定に問題はなさそうです。
弾幕もちゃんと撃てています。
心当たりがあるのは、メモリ節約のために構造体のデータ型を変更していたところぐらいです。
以下にsturuct.hの内容を示します。

コード:

//キャラクターショットに関する構造体
typedef struct{
        bool flag;
	unsigned short power,knd;//フラグ、パワー、カウンタ、種類
	unsigned int cnt;
        double x,y,angle,spd;//座標、角度、スピード
}cshot_t;

//キャラクターに関する構造体
struct ch_t{
        unsigned char flag;       //フラグ
        unsigned cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        unsigned score;      //スコア
        unsigned char num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        unsigned char shot_mode;  //ショットモード
        unsigned money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        double x,y;     //座標
	unsigned shot_cnt; //ショットのカウンタ
};


//パッドに関する構造体

typedef struct{
        int key[PAD_MAX];
}pad_t;

//コンフィグに関する構造体
typedef struct{
        int left,up,right,down,shot,bom,slow,start,change;
}configpad_t;

//敵構造体
typedef struct{
        //フラグ、カウンタ、移動パターン、向き、敵の種類、HP最大値、落とすアイテム、画像
        unsigned cnt,pattern,muki,knd,hp_max,item_n[6];
	unsigned char back_col;
	int img,hp;
	bool flag;
        //座標、速度x成分、速度y成分、スピード、角度
        double x,y,vx,vy,sp,ang;
        //弾幕開始時間、弾幕の種類、弾の種類、色、状態、待機時間、停滞時間

        unsigned  bltime,wtime,wait;
	unsigned short blknd,blknd2,col,state;
}enemy_t;

typedef struct{
        //カウンタ、移動パターン、敵の種類
        unsigned  cnt,pattern,knd;
        //初期座標と移動スピード
        double x,y,sp;
        //弾幕開始時間、弾幕の種類、色、体力、弾の種類、停滞時間、アイテム(6種類)
        unsigned bltime,wait,item_n[6];
	unsigned short blknd,col,hp,blknd2;
}enemy_order_t;

//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
	unsigned char flag;
        unsigned knd,cnt,col,state,till,eff;
//座標、角度、速度、ベースの角度、一時記憶スピード
        double x,y,angle,spd,base_angle[1],rem_spd[1];
}bullet_t;

//ショットに関する構造体
typedef struct{
//フラグ、種類、カウンタ、どの敵から発射されたかの番号
	unsigned char flag;
        unsigned knd,cnt,num;
//ベース角度、ベーススピード
        double base_angle[1],base_spd[1];
        bullet_t bullet[SHOT_BULLET_MAX];
}shot_t;


//エフェクト
typedef struct{
	unsigned char flag;
        int cnt,col,knd,img,eff,brt;
        double x,y,r,ang,spd,mvang;
}effect_t;

//消滅エフェクト
typedef struct{
        bool flag;
	int cnt,col;
        double x,y;
}del_effect_t;

typedef struct{
        int size_x,size_y,col_num;
        double range;
}bullet_info_t;

//ボムの情報
typedef struct{
        unsigned flag,cnt,knd;
        double x,y;
}bom_t;
//画面の明るさ情報
typedef struct{
        unsigned char brt;
}bright_set_t;
//ドン!と揺れる画面の情報
typedef struct{
        unsigned flag,cnt,time,size;
        int x,y;
}dn_t;

//ボスショットに関する構造体
typedef struct{
//フラグ、種類、カウンタ、どの敵から発射されたかの番号、色
        int flag,knd,cnt,num;
//ベース角度、ベーススピード
        double base_angle[1],base_spd[1];
        bullet_t bullet[BOSS_BULLET_MAX];
}boss_shot_t;

//物理的計算に使う構造体
typedef struct{
        int flag,cnt,set_t;
        double ax,v0x,ay,v0y,vx,vy,prex,prey;
}phy_t;

//ボスの情報
typedef struct{
        int flag,cnt,knd,wtime,state,endtime,hagoromo,graph_flag;
        int hp,hp_max;
        int appear_count[2],set_hp[DANMAKU_MAX],back_knd[DANMAKU_MAX];
        double x,y,dx,dy,ang,spd;
        phy_t phy;
}boss_t;

ちなみにch_tの構造体だけtypedef struct ~{};ではなくstruct {}ch_t;となっているのは前者の書き方だとコンパイルエラーが出たからです。
コンパイラはBorland C++ Compiler 、OSはwindows 7 64bit です。
初歩的な質問かも知れませんが、よろしくお願いします。

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

Re: [26章]ボスの移動について

#2

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

whity さんが書きました:26章を参考に、ボスを表示させてみたのですが、ボスがふわふわと移動しません。
whityさんが理解しているふわふわの処理を行っている変数とプログラムの部分を示してもらえますか?
どこまで理解しているかで話が変わってきますので。ただ動くだけで良いのならサンプルのソースコードをダウンロードすれば済みますし、ちゃんと理解したいのだと思いますので細かく部分まで理解してもらいたいと思います。

それと
whity さんが書きました:心当たりがあるのは、メモリ節約のために構造体のデータ型を変更していたところぐらいです。
との事ですが、なぜ変更されたのでしょうか?
パソコンで、そこまでメモリを気にすることはないと思います。
whity さんが書きました:ちなみにch_tの構造体だけtypedef struct ~{};ではなくstruct {}ch_t;となっているのは前者の書き方だとコンパイルエラーが出たからです。
これ自体が変です。他に間違いがあるんじゃないでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: [26章]ボスの移動について

#3

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

ふわふわというのは上下に振動する処理ですか?
あれはボス自体が動いているわけではなく、描画部で適当にsin波を使って上下に動かしているだけなので確認すべきは描画部かと思います。

そうではないのであれば配布しているプロジェクトのコードと比較して、異なるところを見ていけば良いと思います。
また、一つだけコンパイルエラーが出るというのはおかしいので、書き方がおかしいのだと思います。
ただ、無名構造体である必要はないので、普通に構造体を作って、C++であればコンストラクタで初期化するようにするという変更を加えるのであれば良いと思います。

whity

Re: [26章]ボスの移動について

#4

投稿記事 by whity » 14年前

描画部を確認してみたところ、void graph_bullet()に抜けている処理がありました。

コード:

	//ボス
	if(boss_shot.flag>0){//弾幕データがオンなら
		for(j=0;j<BOSS_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
			if(boss_shot.bullet[j].flag!=0){//弾データがオンなら
				if(boss_shot.bullet[j].eff==1)
					SetDrawBlendMode( DX_BLENDMODE_ADD, 255) ;
				if(bullet_info[boss_shot.bullet[j].knd].kaiten==1)
					disp_angle=PI2*(boss_shot.bullet[j].cnt%120)/120;
				else
					disp_angle=boss_shot.bullet[j].angle+PI/2;
				DrawRotaGraphF(
					boss_shot.bullet[j].x+FX+dn.x, boss_shot.bullet[j].y+FY+dn.y,
					1.0, disp_angle,
					img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);

				if(boss_shot.bullet[j].eff==1)
					SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
			}
		}
	}
となるべきところが

コード:

if(boss_shot.flag>0){//弾幕データがオンなら
                for(j=0;j<BOSS_BULLET_MAX;j++){//その弾幕が持つ弾の最大数分ループ
                        if(boss_shot.bullet[j].flag!=0){//弾データがオンなら
                                if(boss_shot.bullet[j].eff==1)
                                        SetDrawBlendMode( DX_BLENDMODE_ADD, 255) ;

                                DrawRotaGraphF(
                                        boss_shot.bullet[j].x+FIELD_X+dn.x, boss_shot.bullet[j].y+FIELD_Y+dn.y,
                                        1.0, boss_shot.bullet[j].angle+PI/2,
                                        img_bullet[boss_shot.bullet[j].knd][boss_shot.bullet[j].col],TRUE);

                                if(boss_shot.bullet[j].eff==1)
                                        SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0) ;
                        }
                }
        }
となっていました。修正をしたところ、ボスが移動するようになりました。
どうして変更し忘れていたのかわかりませんが、原因がわかりすっきりしました。
皆さんご回答ありがとうございました。
これで解決とさせていただきます。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: [26章]ボスの移動について

#5

投稿記事 by ISLe » 14年前

メモリを気にするなら詰め物ができないようにメンバの並びを気にしたほうが良いですよ。
intとintのあいだにchar1個とか無駄過ぎるでしょう。

閉鎖

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