わかりません。 自分が作っているゲームは敵を数字で1、2と分かりやすく分けています。
ゲームプレイ画面に移動して敵1が普通に発生してくるところと、敵1がビームを発射するところまでは問題ありませんでした。衝突判定もここまでは問題ありません。後、プレイヤーが敵1と衝突したら残機が1減って、プレイヤーが敵1のビームと衝突したら残機は同じく1減ります。ここも一応問題ありません。
バグ発生は、プレイ中におこりました。存在していない敵2と衝突したみたいになっているんです。
しかもプレイヤーはダメージを受けていて、残機も2減ってしまっています。どこがおかしいのかよくわかりません。衝突判定がおかしいのではと思って、衝突処理をもう一度見直しましたが、特になかったです。
コード提示しますので訂正お願いします。
//*****************************************************************************
// 衝突判定の処理
//*****************************************************************************
#include <stdio.h> //C言語
#include "gs.h" //学内ライブラリィ
#include "def.h" //共通定義
#include "Collision.h" //衝突判定
#include "Graphics.h" //グラフィック処理
//変数宣言-----------------------------------
//変数参照-----------------------------------
extern OBJ gDragon; //ドラゴン
extern OBJ gDragonLife[DRAGONLIFE_MAX]; //ドラゴン残機
extern OBJ gFire[FIRE_MAX]; //炎
extern OBJ gEnemy1[ENEMY1_MAX]; //敵1
extern OBJ gEnemy1Beam[ENEMY1BEAM_MAX]; //敵1ビーム
extern OBJ gEnemy2[ENEMY2_MAX]; //敵2
extern gsSound sBombSE;
extern gsSound sDamageSE; //ドラゴンのダメージ
extern int gScore; //スコア
extern gsTexture sScoreText; //スコア文字
//開始------------------------------------------------------------------------
void CollisionStart(void)
{
gScore = 0; //スコアの初期化
}
//メイン処理------------------------------------------------------------------
void CollisionMain(void)
{
CollisionDragon(); //ドラゴンの衝突判定
CollisionFire(); //炎の衝突判定
}
//表示------------------------------------------------------------------------
void CollisionDraw(void)
{
char str[100];
gsDraw2D( sScoreText, 0, 30);
//スコアの数字の表示
sprintf( str, "%05d", gScore);
GraphicsDrawText( 60,30, str );
}
//ドラゴンの衝突判定----------------------------------------------------------
void CollisionDragon(void)
{
CollisionDragonEnemy1(); //ドラゴンと敵1の衝突判定
CollisionDragonEnemy1Beam(); //ドラゴンと敵1ビームの衝突判定
CollisionDragonEnemy2(); //ドラゴンと敵2の衝突判定
}
//ドラゴンと敵1の衝突判定------------------------------------------------------
void CollisionDragonEnemy1(void)
{
int i;
//敵の数ループ
for(i=0; i<ENEMY1_MAX; i++)
{
//敵が存在すれば
if( gEnemy1[i].flg == ON)
{
CollisionDragonEnemy1One(i); //ドラゴンと敵1の衝突判定の実施
}
}
}
//ドラゴンと敵1の衝突判定の実施------------------------------------------------
void CollisionDragonEnemy1One(int i)
{
if( gDragon.x+DRAGON_XSIZE > gEnemy1[i].x && //ドラゴンの右>敵の左
gDragon.x < gEnemy1[i].x+ENEMY1_XSIZE && //ドラゴンの左<敵の右
gDragon.y+DRAGON_YSIZE > gEnemy1[i].y && //ドラゴンの下>敵の上
gDragon.y < gEnemy1[i].y+ENEMY1_YSIZE) //ドラゴンの上<敵の下
{
gDragon.timer = 1; //ダメージ中にする
gEnemy1[i].flg = OFF; //敵が存在しない
gsPlaySound( sDamageSE, LOOP_OFF); //ドラゴンのダメージSE
gDragon.HP -= 1; //ドラゴンのダメージ
}
}
//ドラゴンと敵1ビームの衝突判定-----------------------------------------------
void CollisionDragonEnemy1Beam(void)
{
//変数iを宣言
int i;
//敵1ビームの数ループ
for( i=0; i<ENEMY1BEAM_MAX; i++)
{
//敵1が存在していれば
if( gEnemy1Beam[i].flg == ON)
{
CollisionDragonEnemy1BeamOne(i); //ドラゴンと敵1ビームの衝突判定の実施
}
}
}
//ドラゴンと敵1ビームの衝突判定の実施---------------------------------------------------
void CollisionDragonEnemy1BeamOne(int i)
{
if( gDragon.x+DRAGON_XSIZE > gEnemy1Beam[i].x && //ドラゴンの右>敵1ビームの左
gDragon.x < gEnemy1Beam[i].x+ENEMY1BEAM_XSIZE && //ドラゴンの左<敵1ビームの右
gDragon.y+DRAGON_YSIZE > gEnemy1Beam[i].y && //ドラゴンの下>敵1ビームの上
gDragon.y < gEnemy1Beam[i].y+ENEMY1BEAM_YSIZE) //ドラゴンの上<敵1ビームの下
{
gDragon.timer = 1; //ダメージ中にする
gEnemy1Beam[i].flg = OFF; //敵1ビームを存在しなくする
gsPlaySound( sDamageSE, LOOP_OFF); //ダメージSE
gDragon.HP -= 1;
}
}
//ドラゴンと敵2の衝突判定--------------------------------------------------------------
void CollisionDragonEnemy2(void)
{
int i;
for(i=0; i<ENEMY2_MAX; i++)
{
//敵2が存在していれば
if( gEnemy2[i].flg == ON)
{
CollisionDragonEnemy2One(i); //ドラゴンと敵2の衝突判定の実施
}
}
}
//ドラゴンと敵2の衝突判定の実施-------------------------------------------------------
void CollisionDragonEnemy2One(int i)
{
if( gDragon.x+DRAGON_XSIZE > gEnemy2[i].x-20 && //ドラゴンの右>敵2の左
gDragon.x+30 < gEnemy2[i].x+ENEMY2_XSIZE && //ドラゴンの左<敵2の右
gDragon.y+DRAGON_YSIZE > gEnemy2[i].y-40 && //ドラゴンの下>敵2の上
gDragon.y+20 < gEnemy2[i].y+ENEMY2_YSIZE) //ドラゴンの上<敵2の下
{
gDragon.timer = 1; //ダメージ中にする
gEnemy2[i].flg = OFF; //敵2を存在させない
gsPlaySound( sDamageSE, LOOP_OFF); //ドラゴンのダメージSE
gDragon.HP -= 2; //ドラゴンのダメージ
}
}
//炎の衝突判定-------------------------------------------------------------------------
void CollisionFire(void)
{
int i;
//炎の数ループ
for(i=0; i<FIRE_MAX; i++)
{
//炎が存在すれば
if( gFire[i].flg == ON)
{
CollisionFireEnemy1(i); //炎と敵1の衝突判定
}
}
//炎の数ループ
for(i=0; i<FIRE_MAX; i++)
{
//炎が存在すれば
if( gFire[i].flg == ON)
{
CollisionFireEnemy2(i); //炎と敵2の衝突判定
}
}
//炎の数ループ
for(i=0; i<FIRE_MAX; i++)
{
//炎が存在すれば
if( gFire[i].flg == ON)
{
CollisionFireEnemy1Beam(i); //炎と敵1ビームの衝突判定
}
}
}
//炎と敵1の衝突判定----------------------------------------------------------------------
void CollisionFireEnemy1(int f)
{
int i;
//敵1の数ループ
for(i=0; i<ENEMY1_MAX; i++)
{
//敵が存在すれば
if( gEnemy1[i].flg == ON)
{
CollisionFireEnemy1One(f,i); //炎と敵の衝突判定の実施
}
}
}
//炎と敵1の衝突判定の実施----------------------------------------------------------------
void CollisionFireEnemy1One(int f, int i)
{
if( gFire[f].x+FIRE_XSIZE > gEnemy1[i].x && //炎の右>敵の左
gFire[f].x < gEnemy1[i].x+ENEMY1_XSIZE && //炎の左<敵の右
gFire[f].y+FIRE_YSIZE > gEnemy1[i].y && //炎の下>敵の上
gFire[f].y < gEnemy1[i].y+ENEMY1_YSIZE ) //炎の上<敵の下
{
gFire[f].flg = OFF; //炎が存在していない
gEnemy1[i].flg = OFF; //敵が存在していない
gsPlaySound( sBombSE, LOOP_OFF); //敵のダメージBGM
gScore += 30; //敵1のスコア30点
}
}
//炎と敵1ビームの衝突判定---------------------------------------------------------------
void CollisionFireEnemy1Beam(int f)
{
int i;
//敵1ビームの数ループ
for( i=0; i<ENEMY1BEAM_MAX; i++)
{
if( gEnemy1Beam[i].flg == ON)
{
CollisionFireEnemy1BeamOne(f,i); //炎と敵1ビームの衝突判定の実施
}
}
}
//炎と敵1ビームの衝突判定の実施----------------------------------------------------------
void CollisionFireEnemy1BeamOne(int f, int i)
{
if( gFire[f].x+FIRE_XSIZE > gEnemy1Beam[i].x && //炎の右>敵1ビームの左
gFire[f].x < gEnemy1Beam[i].x+ENEMY1BEAM_XSIZE && //炎の左<敵1ビームの右
gFire[f].y+FIRE_YSIZE > gEnemy1Beam[i].y && //炎の下>敵1ビームの上
gFire[f].y < gEnemy1Beam[i].y+ENEMY1BEAM_YSIZE) //炎の上<敵1ビームの下
{
gEnemy1Beam[i].flg = OFF; //敵1ビームが存在しない
gFire[f].flg = OFF; //炎が存在しない
if( gDragon.HP < 12)
{
gDragon.HP += 1; //残機回復
}
}
}
//炎と敵2の衝突判定----------------------------------------------------------------------
void CollisionFireEnemy2(int f)
{
int i;
//敵2の数ループ
for(i=0; i<ENEMY2_MAX; i++)
{
//敵2が存在すれば
if( gEnemy2[i].flg == ON)
{
CollisionFireEnemy2One(f, i); //炎と敵2の衝突判定の実施を行う
}
}
}
//炎と敵2の衝突判定の実施----------------------------------------------------------------
void CollisionFireEnemy2One(int f, int i)
{
if( gFire[f].x+FIRE_XSIZE > gEnemy2[i].x-20 && //炎の右>敵2の左
gFire[f].x+20 < gEnemy2[i].x+ENEMY2_XSIZE && //炎の左<敵2の右
gFire[f].y+FIRE_YSIZE > gEnemy2[i].y-20 && //炎の下>敵2の上
gFire[f].y+20 < gEnemy2[i].y+ENEMY2_YSIZE) //炎の上<敵2の下
{
gFire[f].flg = OFF; //炎を存在させない
gEnemy2[i].flg = OFF; //敵2を存在させない
gsPlaySound( sBombSE, LOOP_OFF); //敵ダメージSE
gScore += 40; //スコアを40点加算する
}
}
//*******************************************************************************************
// 敵2の処理
//*******************************************************************************************
#include <stdio.h> //C言語
#include "gs.h" //学内ライブラリィ
#include "def.h" //共通定義
#include "Enemy2.h" //敵2
#include "Graphics.h" //グラフィック処理
#include "Enemy2Beam.h" //敵2ビーム
//変数宣言-------------------------------------------------------
OBJ gEnemy2[ENEMY2_MAX]; //敵2の構造体
//変数参照-------------------------------------------------------
extern gsTexture sEnemy2; //敵2
extern int gScore; //スコア
//敵2の開始---------------------------------------------------------------------------------
void Enemy2Start(void)
{
//変数 iを宣言
int i;
for(i=0; i<ENEMY2_MAX; i++)
{
gEnemy2[i].flg = OFF; //敵2を存在させない
}
}
//敵2のメイン処理----------------------------------------------------------------------------
void Enemy2Main(void)
{
Enemy2Set(); //敵2の発生
Enemy2Move(); //敵2の移動
Enemy2InScreen(); //敵2の移動範囲の制限
//Enemy2Shot(); //敵2がビームを発射
}
//敵2の表示-----------------------------------------------------------------------------------
void Enemy2Draw(void)
{
//変数 i, x, y, w, h, tx, ty, tw, th, angleを宣言
int i;
int x=0,y=0,w=0,h=0, tx=0, ty=0, tw=0, th=0;
float angle=0;
//敵2の数ループ
for(i=0; i<ENEMY2_MAX; i++)
{
//敵2が存在すれば
if( gEnemy2[i].flg == ON)
{
Enemy2DrawOne(i,x,y,w,h,tx,ty,tw,th,angle); //敵2の表示の実施を行う
}
}
}
//敵2の表示の実施------------------------------------------------------------------------------
void Enemy2DrawOne(int i, int x, int y, int w, int h, int tx, int ty, int tw,int th, float rotate)
{
//タイプを2に設定
if( gEnemy2[i].type == TYPE2)
{
//敵2の回転角度
gsDraw2DPartEx( sEnemy2, (int)gEnemy2[i].x, (int)gEnemy2[i].y,
(int)gEnemy2[i].w, (int)gEnemy2[i].h, (int)gEnemy2[i].tx,
(int)gEnemy2[i].ty, (int)gEnemy2[i].tw, (int)gEnemy2[i].th,
(float)gEnemy2[i].rotate, 0x80ffffffff );
}
}
//敵2の発生------------------------------------------------------------------------------------
void Enemy2Set(void)
{
//変数 iを宣言
int i;
//敵2の数をループ
for(i=0; i<ENEMY2_MAX; i++)
{
//敵2が存在しなければ
if( gEnemy2[i].flg == OFF)
{
Enemy2SetOne(i); //敵2の発生の実施を行う
}
}
}
//敵2の発生の実施-------------------------------------------------------------------------------
void Enemy2SetOne(int i)
{
//1/300の確率
if(rand()%300 == 0)
{
gEnemy2[i].flg = ON; //敵2が存在している
gEnemy2[i].x = (float)(rand()%1010); //敵2のX座標をランダムに設定
gEnemy2[i].y = -100; //敵2のY座標をランダムに設定
gEnemy2[i].w = 60; //敵2の幅
gEnemy2[i].h = 58; //敵2の高さ
gEnemy2[i].tw = 60; //敵2先の幅
gEnemy2[i].th = 60; //敵2先の高さ
}
//1/5の確率
if(rand()%3 == 0)
{
gEnemy2[i].dir = 4; //右向き
}
else
{
gEnemy2[i].dir = -4; //左向き
}
//種類によって敵を設定
if( gScore > 2500)
{
gEnemy2[i].type = TYPE2;
}
}
//敵2の移動-------------------------------------------------------------------------------------
void Enemy2Move(void)
{
//変数 i, rotateを宣言
int i;
float rotate=0;
//敵2の数をループ
for( i=0; i<ENEMY2_MAX; i++)
{
if( gEnemy2[i].flg == ON)
{
gEnemy2[i].y += 4; //下に移動
gEnemy2[i].rotate -= 1.5; //敵2を
//敵2のY座標が400より小さければ
if( gEnemy2[i].y >= -20)
{
gEnemy2[i].x += gEnemy2[i].dir; //右に移動
}
}
}
}
//敵2の移動範囲の制限---------------------------------------------------------------------------
void Enemy2InScreen(void)
{
//変数 iを宣言
int i;
//敵2の数ループ
for(i=0; i<ENEMY2_MAX; i++)
{
//敵2が存在すれば
if( gEnemy2[i].flg == ON)
{
Enemy2InScreenOne(i); //敵2の移動範囲の制限の実施
}
}
}
//敵2の移動範囲の制限の実施----------------------------------------------------------------------
void Enemy2InScreenOne(int i)
{
//敵2のY座標から-610引いた値が敵2の縦サイズより大きければ下向き
if( gEnemy2[i].y-690 > ENEMY2_YSIZE)
{
gEnemy2[i].flg = OFF; //敵2が存在しない
}
//敵2のX座標が100より小さければ左向き
if( gEnemy2[i].x < 100)
{
gEnemy2[i].dir = 4; //左向きに移動
}
//敵2のX座標が880より大きければ右向き
if( gEnemy2[i].x > 880)
{
gEnemy2[i].dir = -4; //右向きに移動
}
}
何か問題があればお願いします。
訂正して書いて頂けるとありがたいです。
また、わかりずらかったら、もう少し詳しく説明します。