敵に玉が当たった後の処理

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

敵に玉が当たった後の処理

#1

投稿記事 by ともこ » 15年前

初心者です。昨日に引き続き、2回目の投稿です。

インベーダーゲームのようなものを作ることに挑戦しています。

敵に玉が当たった後、敵のイメージ画を変える(敵を消す)ところまで進みましたが
玉が通り過ぎると元のイメージ(敵が復活する)に戻ってしまいます。
どうすればよいでしょうか?

アドバイスお願いいたします。


----------------------------------------------------------------

#include "DxLib.h"

#define PLAYER_Y 416

typedef struct{
int x,y,img,muki,walking_flag;
}Jiki;

struct shot{
int x,y;
int flag;
};
struct shot tama[10];

typedef struct{
int x,y,muki;
//,img,muki;
}Teki;

typedef struct{
int x,y;
}Atari;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

int image[16],counter=0;
char Key[256];

Jiki jiki;
jiki.x =320;
jiki.y =PLAYER_Y;
jiki.walking_flag=0;
jiki.muki=3;

Teki teki[2][2]={64,0,0,64,32,0,96,0,0,96,32,0};

for(int i=0;i<10;i++){
tama.x=320;
tama.y=PLAYER_Y-32;
tama.flag=0;
}

Atari atari;

if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 16 , 4 , 4 , 32 , 32 , image ) ;//画像を分割してimage配列に保存

while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されると終了

///////////////////////////////////////////////////////////////////////
////////////////////// 敵描画 ////////////////////////////
///////////////////////////////////////////////////////////////////////

for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
DrawGraph( teki[j].x , teki[j].y , image[6] , TRUE );//敵を描画
if(teki[j].muki==0) teki[j].x+=1;
else if(teki[j].muki==1) teki[j].x-=1;
if(teki[j].x>480){
teki[i][j].muki=1;
teki[i][j].y+=32;
}
else if(teki[i][j].x<32){
teki[i][j].muki=0;
teki[i][j].y+=32;
}
}
}

///////////////////////////////////////////////////////////////////////
////////////////////// プレイヤー位置操作 ////////////////////////////
///////////////////////////////////////////////////////////////////////

if(jiki.x%16==0 && jiki.y%16==0){ //座標が16で割り切れたら入力可能
jiki.walking_flag=1; //歩くフラグを立てる。
if( Key[ KEY_INPUT_LEFT ] == 1 ) //左ボタンが押されたら
jiki.muki=1; //左向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 ) //右ボタンが押されたら
jiki.muki=3; //右向きフラグを立てる
else //その他ボタンなら
jiki.walking_flag=0; //歩かないフラグを立てる
}

if(jiki.walking_flag==1){ //歩くフラグが立っていたら
if(jiki.muki==1) //左向きならjiki.x座標を減らす
jiki.x--;
if(jiki.x < 0) jiki.x=0; //もし画面外まで来たら
else if(jiki.muki==3) //右向きならjiki.x座標を増やす
jiki.x++;
if(jiki.x > 480-32) jiki.x=480-32; //もし画面外まで来たら
}

///////////////////////////////////////////////////////////////////////
////////////////////// 玉発射 ////////////////////////////
///////////////////////////////////////////////////////////////////////

if( ProcessMessage() == -1 ) break ; //異常がおきたら終了
if(counter<10) //前にエンターを押してから5カウント未満なら
counter++; //カウントアップ
else if( Key[ KEY_INPUT_RETURN ] == 1 ){//5カウント以上たっていたら
counter=0; //カウンターを戻す
for(int i=0;i<10;i++){
if(tama[i].flag==0) { //発射フラグを立てる
tama[i].x=jiki.x;
tama[i].flag=1;
break;
}
}
}
for(int i=0;i<10;i++){ //玉発射位置セット
if(tama[i].flag==1){
tama[i].y-=1; //座標を8減らす
DrawGraph( tama[i].x , tama[i].y , image[6] , TRUE );//玉を描画
// ScreenFlip();//裏画面を表画面に反映
if(tama[i].y < -32){ //もし画面外まで来たら
tama[i].y=PLAYER_Y-32; //初期値に戻し、
tama[i].flag=0; //発射フラグを戻す
}
}
}
DrawGraph( jiki.x , jiki.y , image[0] , TRUE ) ;
////////////////////////////////////////////////////////////////////////

/////////////////////////////当り判定//////////////////////////////////
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
for(int a=0;a<10;a++){
atari.x=tama[a].x-teki[i][j].x;
atari.y=tama[a].y-teki[i][j].y;
if(atari.x*atari.x+atari.y*atari.y<64*64){
DrawGraph( teki[i][j].x , teki[i][j].y , image[9] , TRUE );//敵を描画
}
}
}
}
////////////////////////////////////////////////////////////////////////

ScreenFlip();//裏画面を表画面に反映


}

DxLib_End();
return 0;
}

シエル

Re:敵に玉が当たった後の処理

#2

投稿記事 by シエル » 15年前

ざっと見ただけですが、
敵の描画のところで、敵の表示フラグのチェックが入ってないと思います。

基本として、

①表示フラグが立っている敵だけ描画



②あたり判定で当たった弾と当たった敵のフラグを消す。



この状態で①に戻ると、死んだ敵はフラグが消えてるので描画されない

というような状態になると思います。

それとあたり判定の部分でも、表示フラグが立っている敵と弾だけチェックすれば
いいので、すべての敵と弾までチェックする必要はありません。

他にも突っ込みどころがたくさんあるのですが、
以下のリンク先を参考にしてみてはいかがでしょうか?
http://dixq.net/s/19.html

閉鎖

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