📄 bullet.cpp
字号:
#include "stdafx.h"
// 子弹基类Bullet的实现
Bullet::Bullet(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy)
:Sprite(pgw, x_value, y_value)//构造函数的初始化
{
dx=sprite_vx;
dy=sprite_vy;
ExplosionFrameCount = 32;// 爆炸动画帧数设计为32
ExplosionFrameIndex = -1;// 爆炸动画当前帧设计为-1
};
int Bullet::GetFireInterval(BULLET_TYPE BulletType)// 返回给定类型的子弹的发射时间间隔
{
switch(BulletType)
{
case PLAYER_BULLET_FIRE:
return 150;
case PLAYER_BULLET_MISSILE:
return 300;
case PLAYER_BULLET_ROUND_BULLET:
return 200;
case PLAYER_BULLET_BIG_BULLET:
return 600;
case ENERMY_BULLET_1:
return 2000;
case ENERMY_BULLET_2:
return 700;
case ENERMY_BULLET_3:
return 1000;
}
return 0;
}
void Bullet::SetMovement(double speed, int angle)// 根据速率和角度,计算分速度
{
double a = GameWorld::PI * angle / 180;
dx += speed * cos( a );// 计算速度分量dx
dy += - speed * sin( a );// 计算速度分量dy
}
void Bullet::Update()
{
if(OutOfSight())//超出看见范围则标记丢失
Used=false;
else if(Life<=0)
{
if(++ExplosionFrameIndex==0)//子弹的爆炸
{
sx = 0;
sy = 83;
w = 32;
h = 32;
dx = 0;
dy = 0;
}
else if(ExplosionFrameIndex>=ExplosionFrameCount)//当爆破当前帧>=ExplosionFrameCount的时候对sx的设计
Used = false;
else
{
sx = 32 * ( ExplosionFrameIndex / 4 );
}
}
Sprite::Update();// 刷新, 刷新位置和输出画面
}
// BIG的实现
PlayerBullet_Big::PlayerBullet_Big(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy)
:Bullet(pgw, x_value, y_value, sprite_vx, sprite_vy)
{
Bullet::dx=0;
Bullet::dy=-10;
Sprite::sx=118;
Sprite::sy=0;
Sprite::w=120;
Sprite::h=28;
// 碰撞检测用矩形
cx=2;
cy=0;
cw=5;
ch=9;
Atackness = 8;
Life=3;
AdjustPosition();// 已左上角作为中心点调整位置,即在相应设计位图的位置中要取素材
};
// Fire的实现
PlayerBullet_Fire::PlayerBullet_Fire(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy)
:Bullet(pgw, x_value, y_value, sprite_vx, sprite_vy)
{
Bullet::dx=0;
Bullet::dy=-15;
Sprite::sx=29;
Sprite::sy=0;
Sprite::w=3;
Sprite::h=13;
// 碰撞检测用矩形
cx=0;
cy=0;
cw=3;
ch=9;
AdjustPosition();// 已左上角作为中心点调整位置,即在相应设计位图的位置中要取素材
};
// Missile的实现
PlayerBullet_Missile::PlayerBullet_Missile(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy, int angle)
:Bullet(pgw, x_value, y_value, sprite_vx, sprite_vy)
{
Angle=angle;
dAngle=3;
Sprite::sx=32;
Sprite::sy=0;
Sprite::w=4;
Sprite::h=8;
// 碰撞检测用矩形
cx=1;
cy=0;
cw=2;
ch=6;
x0=x_value;//获取出弹位置
Range=5;//设计出弹速度//
AdjustPosition();
};
void PlayerBullet_Missile::Update()//玩家死后的从新来
{
if(Life>0)
{
x=x0;//出弹的位置
dx=Range*cos(Angle*GameWorld::PI/180);//出弹速度的设计(含角度)
dy=-10;//上升速度
Angle+=dAngle;//角度的变化
Range+=2;// 规律
}
Bullet::Update();
}
// RoundBullet的实现
PlayerBullet_RoundBullet::PlayerBullet_RoundBullet(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy, int angle)
:Bullet(pgw, x_value, y_value, 0, 0)
{
Sprite::sx=36;
Sprite::sy=0;
Sprite::w=5;
Sprite::h=5;
// 碰撞检测用矩形
cx=1;
cy=1;
cw=3;
ch=3;
Atackness = 3;
AdjustPosition();
SetMovement(10, angle);//调用函数来设计子弹的速度的角度
};
// EnermyBullet1的实现
EnermyBullet1::EnermyBullet1(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy, int angle)
:Bullet(pgw, x_value, y_value, sprite_vx, sprite_vy)
{
Sprite::sx=30;
Sprite::sy=25;
Sprite::w=8;
Sprite::h=8;
// 碰撞检测用矩形
cx=2;
cy=2;
cw=4;
ch=4;
AdjustPosition();
SetMovement(2, angle);//调用函数来设计子弹的速度的角度
};
// EnermyBullet2的实现
EnermyBullet2::EnermyBullet2(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy, int angle)
:Bullet(pgw, x_value, y_value, sprite_vx, sprite_vy)
{
Sprite::sx=29;
Sprite::sy=13;
Sprite::w=7;
Sprite::h=7;
// 碰撞检测用矩形
cx=1;
cy=1;
cw=5;
ch=5;
AdjustPosition();
SetMovement(6, angle);//调用函数来设计子弹的速度的角度
};
// EnermyBullet3的实现
EnermyBullet3::EnermyBullet3(GameWorld *pgw, int x_value, int y_value, double sprite_vx, double sprite_vy, int angle)
:Bullet(pgw, x_value, y_value, sprite_vx, sprite_vy)
{
Sprite::sx=29;
Sprite::sy=20;
Sprite::w=5;
Sprite::h=5;
// 碰撞检测用矩形
cx=1;
cy=1;
cw=3;
ch=3;
AdjustPosition();
SetMovement(4, angle);//调用函数来设计子弹的速度的角度
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -