游戏开发论坛

 找回密码
 立即注册
搜索
查看: 909|回复: 0

求助!!帮我找下错

[复制链接]

8

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2008-2-12 14:47:00 | 显示全部楼层 |阅读模式
这个是我做的坦克大战的碰撞检测代码,但是敌人与敌人的检测有问题,运行时敌人经常重叠卡在一起,希望高手能帮我指出错误在那里
BOOL game::CheckAABB(int AMinX, int AMaxX,int AMinY, int AMaxY, int BMinX, int BMaxX, int BMinY, int BMaxY)
{
        if(AMaxX<BMinX)
                return false;
        if(AMinX>BMaxX)
                return false;
        if(AMaxY<BMinY)
                return false;
        if(AMinY>BMaxY)
                return false;
        return true;
}
///Enemy与地图的碰撞
BOOL game:: Enemyblock(int x, int y)
{

bool        block = false;

        for(int i=0; i<MAXX; i++)
        {
                for(int j=0; j<MAXY; j++)
                {
                         if(gameMap[j] > 1)
                         {
                               
                                if(CheckAABB(x, x+28, y, y+28, j*16+10,j*16+16+10, i*16+20,i*16+16+20) )
                                {
                                        block = true;
                                        break;
                                }
                         }
                }

                if(block)
                        break;
        }

        return block;


};
///Enemy与Enemy的碰撞

BOOL game:: EnemyandEnemy(struct_EnemyTank *pETank)
{

        bool        block = false;
                struct_EnemyTank *pETank2;
        POSITION pos=manager.listEnemyTank.GetHead();
        while(pos)
        {
        pETank2 = (struct_EnemyTank*)manager.listEnemyTank.GetAt(pos);
                                if(pETank!=pETank2)
                                {
                                        switch(pETank->Directry)
                                        {
                                        case 0:
               if(CheckAABB(pETank-&gtos.x, pETank->Pos.x+28, pETank->Pos.y-pETank->v, pETank->Pos.y+28-pETank->v, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
                                {
                                        block = true;
                                        break;
                                }break;
                                        case 1:
                           if(CheckAABB(pETank->Pos.x+pETank->v, pETank->Pos.x+pETank->v+28, pETank->Pos.y, pETank->Pos.y+28, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
                                {
                                        block = true;
                                        break;
                                }break;
                                        case 2:
                if(CheckAABB(pETank->Pos.x, pETank->Pos.x+28, pETank->Pos.y+pETank->v, pETank->Pos.y+28+pETank->v, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
                                {
                                        block = true;
                                        break;
                                }break;
                                        case 3:
                           if(CheckAABB(pETank->Pos.x-pETank->v, pETank->Pos.x-pETank->v+28, pETank->Pos.y, pETank->Pos.y+28, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
                                {
                                        block = true;
                                        break;
                                }break;
                                        }
                                       
                                }
            pos=manager.listEnemyBullet.GetNext(pos);
                if(block)
                        break;
               
        }
       
        return block;


};



//===================================
//描述: 控制敌方的坦克的行动
//====================================
int game::MoveETank()
{
        DWORD nt=GetTickCount();
        POINT np;
        POSITION pos;
        struct_EnemyTank *pETank;
        pos=manager.listEnemyTank.GetHead();
       
        while(pos)
        {
                pETank=(struct_EnemyTank*)manager.listEnemyTank.GetAt(pos);
               
        switch (pETank->Directry)
                {
                case 0:
                        {
                                if( !Enemyblock( pETank->Pos.x, pETank->Pos.y - pETank->v )))///有碰撞就转方向

                                {
                                        if(!EnemyandEnemy(pETank))
                                        {
                                pETank->Pos.y -= pETank->v;
                                    }
                                  if( pETank->Pos.y - pETank->v < 20 )///碰到边境就转方向
                   {
                           pETank->Pos.y = 20;
                                            pETank->Directry =  rand()%4;
                   }
                                }
                else
                                {
                                  pETank->Directry =  rand()%4;
                                }
                        }
                        break;
                case 1:
                        {
                                if( !Enemyblock( pETank->Pos.x + pETank->v , pETank->Pos.y )&&!EnemyandEnemy(pETank))
                                {
                                        if(!EnemyandEnemy(pETank))
                                        {
                                 pETank->Pos.x += pETank->v;
                                    }
                               
                                 if( pETank->Pos.x + pETank->v > 398 )
                   {
                           pETank->Pos.x = 398;
                                           pETank->Directry =  rand()%4;
                   }
                                   }
                else
                                {
                                  pETank->Directry =  rand()%4;
                                }
                        }
                        break;
                case 2:
                        {
                                if( !Enemyblock( pETank->Pos.x, pETank->Pos.y + pETank->v )&&!EnemyandEnemy(pETank))
                                {
                                                if(!EnemyandEnemy(pETank))
                                        {
                                   pETank->Pos.y += pETank->v;
                                    }
               
                               
                                  if( pETank->Pos.y + pETank->v > 408 )
                   {
                           pETank->Pos.y = 408;
                                            pETank->Directry =  rand()%4;
                   }
                                    }
                  else
                                {
                                  pETank->Directry =  rand()%4;
                                }
                        }
                        break;
                case 3:
                        {
               if( !Enemyblock( pETank->Pos.x - pETank->v, pETank->Pos.y )&&!EnemyandEnemy(pETank))
                                {
              
                                         if(!EnemyandEnemy(pETank))
                                        {
                                     pETank->Pos.x -= pETank->v;
                                    }
               
                                 if( pETank->Pos.x - pETank->v < 10 )
                   {
                           pETank->Pos.x = 10;
                                             pETank->Directry =  rand()%4;
                   }
                                       }
                else
                                {
                                  pETank->Directry =  rand()%4;
                                }
                        }
                        break;
               
        }
                pos=manager.listEnemyBullet.GetNext(pos);
                DisplayETank(pETank);
        }
        return 1;
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 01:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表