⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tank.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 5 页
字号:
                    r.x = x - 8;
                    r.y = (game1->movie[i]).y - 8;
                    r.w = 18;
                    r.h = 18;
                    DrawBmpIdEx((INT16U)(x), (INT16U)((game1->movie[i]).y), (INT16U)(BID_map000 + (gTankgame.barriesflag << 1) + 1), &r, DSPM_Transp);
                }
                else
                {
                    x = (((x - 8) >> 3) << 3) + 8;
                    y = ((((game1->movie[i]).y - 8) >> 3) << 3) + 8;
                    for (j = 0;j < 3;j++)
                        for (k = 0;k < 3;k++)
                        {
                            if (x + k*8 >= SCREENX + SCREENWID - 1 || y + j*8 >= SCREENY + SCREENHIG - 1)
                            {
                                continue;
                            }
                            if ((((game1->map).maptiles_id[((((game1->movie[i]).y - 8) >> 3) + j)*28 + (((game1->movie[i]).x - 8) >> 3) + k]) == (game1->map).maptiles_id[0]))
                            {
                                r.x = x + k * 8 - 8;
                                r.y = y + j * 8 - 8;
                                r.w = r.h = 8;
                                DrawBmpIdEx((INT16U)(x + k*8), (INT16U)(y + j*8), (INT16U)(BID_map000 + (gTankgame.barriesflag << 1) + 1), &r, DSPM_Transp);
                            }
                            else                              /*地图没有炸掉*/
                            {
                                if ((x + k*8 < SCREENX + SCREENWID) && (y + j*8 < SCREENY + SCREENHIG))
                                {

                                    DrawBmpIdEx((INT16U)(x + k*8), (INT16U)(y + j*8), (INT16U)(BID_title10 + ((game1->map).maptiles_id[((((game1->movie[i]).y - 8) >> 3) + j)*28 + (((game1->movie[i]).x - 8) >> 3) + k])), NULL, DSPM_Transp);

                                }
                            }
                        }

                }
            }

        }
    }

}
/************************************************************************
Desc  : 子弹和地图发生碰撞后地图的变化
Param:bullet 那种炮弹,map 地图结构
Return:balkflag=1时表示子弹与地图发生碰撞
Global:无
Author:xiexiuxie
*************************************************************************/
int GameTankBulletBalkDeal(GameTankBullet *bullet, MapType *map)
{
    int i, j;
    int x, y;
    int tlsx, tlsy;
    int bt_r_title, bt_b_title;
    int parkbalkflag = 0;
    int balkflag = 0;
    int dx[4] = { -1, 0, 1, 0};  //
    int dy[4] = {0, -1, 0, 1};
    x = bullet->x + dx[bullet->dir] * bullet->speed;
    y = bullet->y + dy[bullet->dir] * bullet->speed;
    bt_r_title = ((x + bullet->wid - 1 - (SCREENX)) >> 3);
    bt_b_title = ((y + bullet->hig - 1 - SCREENX) >> 3);
    for (i = 0;((x + (i << 3) - SCREENX) >> 3) <= bt_r_title;i++)
    {
        tlsx = ((x + (i << 3) - SCREENX) >> 3);
        for (j = 0;((y + (j << 3) - SCREENX) >> 3) <= bt_b_title;j++)
        {
            tlsy = (y + (j << 3) - SCREENX) >> 3;
            if (map->maptiles_id[tlsy*MAPSIZE+tlsx] > BULLETPASSMAX)
            {
                if (((bullet->bullet_id >= BID_bullet30) && (bullet->bullet_id <= BID_bullet33)) && (map->maptiles_id[tlsy*MAPSIZE+tlsx] < PARKTILE))       //当子弹升级到最高之后可以摧毁一切东西。
                {
                    map->maptiles_id[tlsy*MAPSIZE+tlsx] = map->maptiles_id[0];
                }
                else if (((bullet->bullet_id >= BID_bullet20) && (bullet->bullet_id <= BID_bullet23)) && (map->maptiles_id[tlsy*MAPSIZE+tlsx] < FIRMNESSTile))
                {
                    map->maptiles_id[tlsy*MAPSIZE+tlsx] = map->maptiles_id[0];
                }
                else if (((bullet->bullet_id >= BID_bullet10) && (bullet->bullet_id <= BID_bullet13)) && (map->maptiles_id[tlsy*MAPSIZE+tlsx] < DEFALTTitle))
                {
                    map->maptiles_id[tlsy*MAPSIZE+tlsx] = map->maptiles_id[0];
                }
                else if (map->maptiles_id[tlsy*MAPSIZE+tlsx] == DAMAGEDBrick || map->maptiles_id[tlsy*MAPSIZE+tlsx] == TERRENEWall || map->maptiles_id[tlsy*MAPSIZE+tlsx] == DEFALTTitle || map->maptiles_id[tlsy*MAPSIZE+tlsx] == RCTile + 3)
                {
                    map->maptiles_id[tlsy*MAPSIZE+tlsx] = map->maptiles_id[0];   //当为有裂痕的砖块或者为土块或者为已经打了三次出现裂痕的水泥块时则变为地图的第一个块,map->maptiles_id[0][0]为背景
                }
                else if ((map->maptiles_id[tlsy*MAPSIZE+tlsx] == BRICKTile) || (map->maptiles_id[tlsy*MAPSIZE+tlsx] >= RCTile && map->maptiles_id[tlsy*MAPSIZE+tlsx] < RCTile + 3))
                {
                    map->maptiles_id[tlsy*MAPSIZE+tlsx] += 1;
                }
                else if ((map->maptiles_id[tlsy*MAPSIZE+tlsx] >= PARKTILE) && (parkbalkflag == 0) && (tankgoodsprotection == 0))
                {
                    if (ParkUndead != 7)
                    {
                        gTankgame.parkflag++;
                        parkbalkflag++;
                    }
                    else
                    {
                        ;
                    }
                }
                balkflag = 1;
            }

        }
    }
    return(balkflag);
}
/************************************************************************
Desc  : 计算被打爆的坦克的数量
Param: tank 坦克类型
Return:无
Global:goodsappear0=1    给一次出现物品的机会, goodsappear1物品出现的x位置   ,
goodsappear1物品出现的y位置
Author:xiexiuxie
*************************************************************************/
void DeadEnemyTankcount(GameTank *tank)
{
    int i;
    for (i = 0 ; i < 6 ; i++)
    {
        if (tank->tank_id >= (BID_enemytank01 + i * 4) && tank->tank_id <= (BID_enemytank04 + i * 4))
            break;
    }
    if (i == 3)   /*||i==5*/   //当打掉3类坦克时 给一次物品出现的机会
    {
        goodsappear0 = 1;
        if (tank->x >= SCREENX + SCREENWID - 1 - tank->wid)
        {
            tank->x = SCREENX + SCREENWID - 1 - tank->wid;
        }
        if (tank->y >= SCREENY + SCREENHIG - 1 - tank->hig)
        {
            tank->y = SCREENY + SCREENHIG - 1 - tank->hig;
        }
        if (tank->y <= SCREENY)
        {
            tank->y = SCREENY + 2;
        }
        goodsappear1 = tank->x;
        goodsappear2 = tank->y;
    }
    if (i < 6)
    {
        TankNumPerEnemyType[ i ]++;//打掉的每一类坦克的统计
    }
}
/************************************************************************
Desc  : 敌人坦克和我方坦克相遇判断
Param:tank 坦克类型 ,game1  游戏结构参数
Return:敌人坦克的改变方向Y_DIR、 X_DIR、0
Global:无
Author:xiexiuxie
*************************************************************************/
int EnemyTankSearchAimJudge(GameTank *tank, GameTankType *game1)
{
    int dx[4] = { -1, 0, 1, 0};
    int dy[4] = {0, -1, 0, 1};
    if (game1->player[0].active && ((((tank->x - 8) >> 3) == ((game1->player[0].x - 8) >> 3))//  ??>>8 将地图坐标换算成map文件
                                    || ((((tank->x - 8) >> 3) - 1) == ((game1->player[0].x - 8) >> 3))
                                    || ((((tank->x - 8) >> 3) + 1) == ((game1->player[0].x - 8) >> 3))))  //敌方坦克与玩家坦克在同一x方向上
    {
        return Y_DIR;
    }
    if (game1->player[0].active && ((((tank->y - 8) >> 3) == ((game1->player[0].y - 8) >> 3))
                                    || ((((tank->y - 8) >> 3) - 1) == ((game1->player[0].y - 8) >> 3))
                                    || (((((tank->y - 8) >> 3) + 1) == ((game1->player[0].y - 8) >> 3)))))//敌方坦克与玩家坦克在同一y方向上
    {
        return X_DIR;
    }
    return 0;
}
/************************************************************************
Desc  : 玩家子弹处理
param:game1 游戏结构
Return:无
Global:bulletareamark、ENEMYBULLETMAX
Author:xiexiuxie
*************************************************************************/
void PlayerBulletdeal(GameTankType *game1)
{
    int j, k, n, tankdir;
    int x, y;
    int lx, mx, ly, my, randnum, dirchangenum;
    int dx[4] = { -1, 0, 1, 0};
    int dy[4] = {0, -1, 0, 1};
    for (k = 0;k < 4;k ++)
    {
        for (n = 0;n < BULLET_MAXNUM;n++)
        {
            if (game1->playerbullet[0][k][n].active)
            {
                x = game1->playerbullet[0][k][n].x + dx[game1->playerbullet[0][k][n].dir] * game1->playerbullet[0][k][n].speed;
                y = game1->playerbullet[0][k][n].y + dy[game1->playerbullet[0][k][n].dir] * game1->playerbullet[0][k][n].speed;

                bulletarea[bulletareamark].x = (game1->playerbullet[0][k][n]).x ;
                bulletarea[bulletareamark++].y = (game1->playerbullet[0][k][n]).y;
                if (bulletarea[bulletareamark].x&0x0001 == 1 && bulletarea[bulletareamark].x < SCREENX + SCREENWID)
                {
                    bulletarea[bulletareamark].x += 1;
                }
                if ((x < SCREENX) || (x + game1->playerbullet[0][k][n].wid) > (SCREENX + SCREENWID) || (y < SCREENY) || ((y + game1->playerbullet[0][k][n].hig) > (SCREENY + SCREENHIG)))
                {                                             //这种情况下,炮弹不处在激活状态
                    game1->playerbullet[0][k][n].active = 0;
                    continue;
                }
                if (GameTankBulletBalkDeal(&(game1->playerbullet[0][k][n]), &game1->map)) //返回1则表示子弹和物体发生了碰撞
                {
                    game1->playerbullet[0][k][n].active = 0;
                    GameAddMovie(x, y, &MinExplode, game1);  //爆炸动画

                    // MixerSetChannel(1, TankSoundSexplode, 1, 1 );

                    if (gTankgame.parkflag >= 3)
                    {
                        GameAddMovie(216, 112, &Burning, game1);  //爆炸动画
                        return;
                    }
                    continue;
                }

                for (j = 0 ; j < ENEMYBULLETMAX ; j ++)
                {
                    if (!game1->enemybullet[j].active)
                    {
                        continue;
                    }

                    lx = x > game1->enemybullet[j].x ? x : game1->enemybullet[j].x;
                    mx = (x + game1->playerbullet[0][k][n].wid - 1) < (game1->enemybullet[j].x + game1->enemybullet[j].wid - 1) ? (x + game1->playerbullet[0][k][n].wid - 1) : (game1->enemybullet[j].x + game1->enemybullet[j].wid - 1);
                    ly = y > game1->enemybullet[j].y ? y : game1->enemybullet[j].y;
                    my = (y + game1->playerbullet[0][k][n].hig - 1) < (game1->enemybullet[j].y + game1->enemybullet[j].hig - 1) ? (y + game1->playerbullet[0][k][n].hig - 1) : (game1->enemybullet[j].y + game1->enemybullet[j].hig - 1);
                    if (lx < mx && ly < my)  //玩家子弹与敌方子弹的碰撞处理
                    {
                        game1->enemybullet[j].active = 0;
                        game1->playerbullet[0][k][n].active = 0;
                        GameAddMovie(x, y, &MinExplode, game1);
                        GameAddMovie(game1->enemybullet[j].x, game1->enemybullet[j].y, &MinExplode, game1);
                        //MixerSetChannel(1, TankSoundSexplode, 1, 1 );
                        continue;
                    }
                }

                if (!game1->playerbullet[0][k][n].active)
                {
                    continue;
                }

                for (j = 0;j < ENEMYMAX;j ++)
                {
                    if (!game1->enemy[j].active)
                    {
                        continue;
                    }
                    lx = x > game1->enemy[j].x ? x : game1->enemy[j].x;  //玩家坦克子弹与敌人坦克的碰撞处理
                    mx = (x + game1->playerbullet[0][k][n].wid - 1) < (game1->enemy[j].x + game1->enemy[j].wid - 1) ? (x + game1->playerbullet[0][k][n].wid - 1) : (game1->enemy[j].x + game1->enemy[j].wid - 1);
                    ly = y > game1->enemy[j].y ? y : game1->enemy[j].y;
                    my = (y + game1->playerbullet[0][k][n].hig - 1) < (game1->enemy[j].y + game1->enemy[j].hig - 1) ? (y + game1->playerbullet[0][k][n].hig - 1) : (game1->enemy[j].y + game1->enemy[j].hig - 1);
                    if (lx < mx && ly < my)
                    {
                        game1->playerbullet[0][k][n].active = 0;
                        if (game1->enemy[j].status < 7)
                        {
                            continue;
                        }
                        game1->enemy[j].life -= game1->playerbullet[0][k][n].power;
                        if (game1->enemy[j].life <= 0)
                        {
                            DeadEnemyTankcount(&(game1->enemy[j]));
                            game1->enemy[j].active = 0;
                            game1->enemy[j].life = 0;
                            game1->scores[0] += game1->enemy[j].score;
                            infshowflag = 1;
                            GameAddMovie(game1->enemy[j].x, game1->enemy[j].y, &Explode, game1);  //爆炸动画
                            //MixerSetChannel(1, TankSoundBexplode, 1, 1 );

                        }
                        else
                        {
                            if (gTankgame.tankleverchoce == 0)
                            {
                                dirchangenum = EASYAI;
                            }
                            else if (gTankgame.tankleverchoce == 1)
                            {
                                dirchangenum = MIDAI;
                            }
                            else
                            {
                                dirchangenum = HARDAI;
                            }
                            if (GetPositiveRand(100) < (INT32U)dirchangenum)                                              //50%的概率改变方向澹?
                            {
                                tankdir = EnemyTankSearchAimJudge(&game1->enemy[j], game1);
                                if (tankdir == Y_DIR)
                                {
                                    if (game1->enemy[j].y < game1->player[0].y)
                                    {
                                        game1->enemy[j].dir = 2;
                                    }
                                    else
                                    {
                                        game1->enemy[j].dir = 0;
                                    }
                                }
                                else if (tankdir == X_DIR)
                                {
                                    if (game1->enemy[j].x < game1->player[0].x)
                                    {
                                        game1->enemy[j].dir = 1;
                                    }
                                    else
                                    {
                                        game1->enemy[j].dir = 3;
                                    }
                                }
                                else
                                {
                                    randnum = (int)GetPositiveRand(2000);


                                    game1->enemy[j].dir = (game1->enemy[j].dir + randnum) & 0x0003;
                                }
                            }
                            GameAddMovie(x, y, &MinExplode, game1);  //爆炸动画

                            //MixerSetChannel(1, TankSoundSexplode, 1, 1 );

                        }
                        break;
                    }
                }

                if (!game1->playerbullet[0][k][n].active)
                {
                    continue;
                }
                game1->playerbullet[0][k][n].x = x;
                game1->playerbullet[0][k][n].y = y;
            }
        }
    }
}
/************************************************************************
Desc  : 敌人子弹处理
Param: game1 游戏结构
Return:无
Global:ENEMYBULLETMAX、bulletareamark
Author:xiexiuxie
*************************************************************************/
void EnemyBulletdeal(GameTankType *game1)
{
    int i, k, n;
    int x, y;
    int lx, mx, ly, my;
    int dx[4] = { -1, 0, 1, 0};
    int dy[4] = {0, -1, 0, 1};
    for (i = 0;i < ENEMYBULLETMAX;i ++)
    {
        if (game1->enemybullet[i].active)
        {

            x = game1->enemybullet[i].x + dx[game1->enemybullet[i].dir] * game1->enemybullet[i].speed;
            y = game1->enemybullet[i].y + dy[game1->enemybullet[i].dir] * game1->enemybullet[i].speed;

            bulletarea[bulletareamark].x = (game1->enemybullet[i]).x ;
            bulletarea[bulletareamark++].y = (game1->enemybullet[i]).y;

            if (bulletarea[bulletareamark].x&0x0001 == 1 && bulletarea[bulletareamark].x < SCREENX + SCREENWID)
            {
                bulletarea[bulletareamark].x += 1;
            }
            if (x <= SCREENX || x + game1->enemybullet[i].wid >= SCREENX + SCREENWID || y <= SCREENY || y + game1->enemybullet[i].hig >= SCREENY + SCREENHIG)
            {
                game1->enemybullet[i].active = 0;
                continue;
            }
            if (GameTankBulletBalkDeal(&(game1->enemybullet[i]), &game1->map))
            {
                game1->enemybullet[i].active = 0;
                GameAddMovie(x, y, &MinExplode, game1);  //爆炸动画
                //MixerSetChannel(1, TankSoundSexplode, 1, 1 );

                if (gTankgame.parkflag >= 3)
                {
                    GameAddMovie(216, 112, &Burning, game1);  //爆炸动画
                    return;
                }
                continue;
            }
            for (k = 0;k < 4;k ++)
            {
                for (n = 0;n < BULLET_MAXNUM;n++)
                {
                    if (!game1->playerbullet[0][k][n].active)
                        continue;

                    lx = x > game1->playerbullet[0][k][n].x ? x : game1->playerbullet[0][k][n].x;//敌方子弹与我方子弹的碰撞过程判断
                    mx = (x + game1->enemybullet[i].wid - 1) < (game1->playerbullet[0][k][n].x + game1->playerbullet[0][k][n].wid - 1) ? (x + game1->enemybullet[i].wid - 1) : (game1->playerbullet[0][k][n].x + game1->playerbullet[0][k][n].wid - 1);
                    ly = y > game1->playerbullet[0][k][n].y ? y : game1->playerbullet[0][k][n].y;
                    my = (y + game1->enemybullet[i].hig - 1) < (game1->playerbullet[0][k][n].y + game1->playerbullet[0][k][n].hig - 1) ? (y + game1->enemybullet[i].hig - 1) : (game1->playerbullet[0][k][n].y + game1->playerbullet[0][k][n].hig - 1);
                    if (lx < mx && ly < my)
                    {
                        game1->playerbullet[0][k][n].active = 0;
                        game1->enemybullet[i].active = 0;
                        GameAddMovie(x, y, &MinExplode, game1);
                        GameAddMovie(game1->playerbullet[0][k][n].x, game1->playerbullet[0][k][n].y, &MinExplode, game1);
                        // MixerSetChannel(1, TankSoundSexplode, 1, 1 );
                        continue;
                        //break;
                    }
                }
            }

            if (game1->player[

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -