📄 tank.c
字号:
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 + -