ページ 11

敵を消す

Posted: 2008年1月27日(日) 20:32
by prg
ダンジョンゲームで、銃で敵をうっててきを消したいのですが、消し方がわかりません。
どなたか、教えてください。

Re:敵を消す

Posted: 2008年1月27日(日) 21:35
by バグ
質問があまりにも漠然とし過ぎです。もう少し具体的に書くべきですよ。
一番簡単な方法は背景グラフィックを上書きして、敵グラフィックを消してしまえばいいのではないでしょうか?

Re:敵を消す

Posted: 2008年1月27日(日) 23:07
by prg
しかし、敵の画像を消すだけだったら、x座標、y座標のデータがまだ存在してしまっているので、
画像もなしにダメージをうけてしまいます。敵のデータ自体をけしてしまう方法はないでしょうか?

Re:敵を消す

Posted: 2008年1月27日(日) 23:40
by tk-xleader
フラグの活用など、つまり、表示しているかしていないかを示す変数を用意するのです。

Re:敵を消す

Posted: 2008年1月28日(月) 04:21
by 管理人
作りかけているゲームで、何か詰まったときに人に聞くのは難しいですよね。
こちらはコードも解らないし、かといって、提示されるには長すぎるしと・・。

ダンジョンゲームだろうと、マリオのファイアーだろうと、やってることはシューティングと同じです。
シューティングと同じ要領でやってみましょう。

簡単にコードを紹介します。
typedef struct{
    int flag,cnt;
    double x,y;
}bullet_t;

で、弾の情報を持った構造体を用意します。
フラグ、出現してからのカウンタ、x,y座標
は最低必要でしょう。

bullet_t bullet[100];

で、100個まで画面に一度に表示できる弾を準備します。

今の瞬間、(x,y)=(100,200)の場所から弾を発射する必要があるとしましょう。その時、

    
for(i=0;i<100;i++){//一度に表示できる弾の数だけ
    if(bullt.flag==0){//使える弾があれば
        bullet.flag=1;//フラグをたてて
        bullet.cnt=0;//フラグをたてて
        bullet.x=100;//フラグをたてて
        bullet.y=200;//フラグをたてて
        break;
    }
}


これで弾情報の登録は終わりです。
他の関数で、常にこれを計算しましょう。
例えば、横に直線で飛んでいくなら、xを増やしていけばいいでしょう。

for(i=0;i<100;i++){//一度に表示できる弾の数だけ
    if(bullt.flag==1){//表示中の弾があれば
        bullet.cnt++;//出現してからのカウンタを増加
        bullet.x+=1;//x座標計算
        break;
    }
}

この時、一緒に「画面外にいったら削除(bullet.flag=0;)」と
「○○カウンタ以上になったら削除」も
計算してやりましょう。


後は描画部で、


for(i=0;i<100;i++){//一度に表示できる弾の数だけ
    if(bullt.flag==1){//表示中の弾があれば
        DrawGraph( bullet[i].x, bullet[i].y, .................);
    }
}


描画してやればOKです。
こうして、
「登録」「計算」「描画」を3つにわけてやりましょう。
ベクターとかご存知でしたらそちら使ったほうが効率的かもしれません。

 
難しく考えないで下さい。
ゲームを作るときのコツは、しっかり関数で仕事を分けてやることです。
それでは頑張ってください。

Re:敵を消す

Posted: 2008年1月28日(月) 06:00
by prg
ありがとうございます。
実はまだ、銃のシステムは完成していないんです。ダンジョンとモンスターはできました。

それで、また質問なのですが、モンスターと接触したときにダメージを受けるようにしたいのですが、
kyorifという差の絶対値を取る関数を作って、8ピクセル分重なったらダメージとし、new_atari_flagと
old_atari_flagをたて、old_atari_flag==0,new_atari_flag==1ならダメージ、old_atari_flag=new_atari_flag
とし、old_atari_flag==1,new_atari_flag==1ならば、ループを抜けるとしたい(ダメージなし)としたのですが、なぜかだぁーーとHPがへってしまいます。どうすればいいのでしょうか?

Re:敵を消す

Posted: 2008年1月28日(月) 06:38
by 管理人
敵との接触で一番大事なのが無敵時間です。
どんなゲームでも、何かにあたったら、

・あたったものが壊れて無くなる
・自分が死んでいなくなる
・無敵時間になる

のどれかになると思います。
何か障害物にあたってHPが減る機会があるなら一定の無敵時間というものを作ってみてはどうでしょうか。

無敵時間中は自機がピカピカ光ると思いますが、1/30秒消えて、1/30描いて、を繰り返すと丁度無敵時間にみえますよ。
もし、countというカウンタでループさせてるなら
if(count%2==0)
のとき、描画してやるといいと思います。

Re:敵を消す

Posted: 2008年1月28日(月) 07:09
by prg
とりあえず今はモンスターにあたったら、モンスターを死亡させているのですが、
おかしくはないでしょうか?

Re:敵を消す

Posted: 2008年1月28日(月) 07:59
by 管理人
prgさんも夜更かしなのやら早起きなのやら^^;
私は徹夜で研究室篭ってます(_ _|||)

さて、モンスターにあたったら、モンスターが死ぬのなら、無敵時間を作らなくても、モンスターがいないのにHPが減り続けるのでしょうか?
それではモンスターがいることになっているのでは・・。
ちょっとその辺はコードを見ないと解りません。
・・・と言っても、コードを読むの慣れて無いので、長いと見てもわからないかもしれませんが^^;

もしよかったら添付してもらえないでしょうか?
公開に差し支えるようなら直で私宛にメールで送ってもらってもいいですし。
もし自力で、とお思いでしたら、
もう少し詳細に教えてもらえると答えやすいです。

Re:敵を消す

Posted: 2008年1月28日(月) 17:46
by prg
いちおう送らせていただきました