📄 bulletsystem.cpp
字号:
#include "stdafx.h"
#include "BulletSystem.h"
#include "Bullet.h"
// 构造函数
BulletSystem::BulletSystem()
{
}
// 释构函数
BulletSystem::~BulletSystem()
{
list<Bullet*>::iterator p, pend;
p = m_BulletList.begin();//获得首指针
pend = m_BulletList.end();//获得尾指针
while(p!= pend)//循环删除链表对象
{
delete *p;
p++;
}
}
// 新增子弹函数
//功能:被主控程序的PlayerFire(Player *pPlayer)和void EnermyFire(Enermy *pEnermy)调用增加屏幕子弹数量
//参数:
//BulletType:给出子弹的类型
//x:所有子弹初始时的屏幕X坐标
//y:所有子弹初始时的屏幕Y坐标
//sprite_vx:子弹的X方向的速度
//sprite_vy:子弹的Y方向的速度
void BulletSystem::FireHappened(BULLET_TYPE BulletType, int x, int y, double sprite_vx, double sprite_vy)
{
int i;
Bullet *pNewBullet;
switch(BulletType)
{
case PLAYER_FIRE://迫击炮
for(i = 0; i<4; i++)
{
//增加一排子弹。12是第一个子弹的左方偏移量,8是每发子弹的宽度
pNewBullet = new Bullet_Fire(x-12+8*i, y, sprite_vx, sprite_vy);
m_BulletList.push_back(pNewBullet);//将新增子弹加入链表
}
break;
case PLAYER_MISSILE://导弹
for(i = 0; i<6; i++)
{
//在0-20宽度的范围内随机生成导弹。其发射角度也是随机的
pNewBullet = new Bullet_Missile( x-10+rand()%21, y-10+rand()%21, sprite_vx, sprite_vy, rand()%181);
m_BulletList.push_back(pNewBullet);//将新增子弹加入链表
}
break;
case PLAYER_ROUND://散弹
//按照20,50,70,80,90,100,110,130,160的角度初始化每一发子弹,形成散弹的效果
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 20);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 50);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 70);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 80);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 90);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 100);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 110);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 130);
m_BulletList.push_back(pNewBullet);
pNewBullet = new PlayerBullet_RoundBullet( x, y, sprite_vx, sprite_vy, 160);
m_BulletList.push_back(pNewBullet);
break;
case ENEMY_B1://供敌机TOM使用的子弹,经常是五发连发,呈现散弹的效果。以230,250,270,290,310为角度
for(i = 0; i<5; i++)
{
pNewBullet = new EnermyBullet1( x+8*(i-2), y, sprite_vx, sprite_vy, 270+20*(i-2));
m_BulletList.push_back(pNewBullet);
}
break;
case ENEMY_B2://供敌机MINI使用的子弹,角度较大
pNewBullet = new EnermyBullet2( x-10, y, sprite_vx, sprite_vy, 0);
m_BulletList.push_back(pNewBullet);
pNewBullet = new EnermyBullet2( x+10, y, sprite_vx, sprite_vy, 180);
m_BulletList.push_back(pNewBullet);
break;
case ENEMY_B3://供敌机JACK使用的子弹,角度较小
pNewBullet = new EnermyBullet3( x-5, y, sprite_vx, sprite_vy, 225);
m_BulletList.push_back(pNewBullet);
pNewBullet = new EnermyBullet3( x+5, y, sprite_vx, sprite_vy, 315);
m_BulletList.push_back(pNewBullet);
break;
}
}
// 返回第一个子弹对象
Bullet* BulletSystem::GetFirstBullet()
{
m_iBulletIndex = -1;
m_iBulletCount = m_BulletList.size();
if(m_iBulletCount == 0)
return NULL;
m_pCurElement = m_BulletList.end();
return GetNextBullet();
}
// 返回下一个子弹对象
Bullet* BulletSystem::GetNextBullet()
{
m_iBulletIndex++;
m_pCurElement++;//调整指针指向下一个
while( ( m_iBulletIndex < m_iBulletCount ) && ( ( *m_pCurElement )->m_bUsed == false ) )//删除无用子弹
{
delete *m_pCurElement;//释放内存
m_iBulletCount--;//子弹总数减少
m_pCurElement = m_BulletList.erase(m_pCurElement);//从链表中删除
}
if(m_pCurElement == m_BulletList.end())
return NULL;
else
return *m_pCurElement;
}
//更新所有子弹
void BulletSystem::Update()
{
Bullet *pBullet = GetFirstBullet();
while(pBullet)
{
pBullet->Update();//调用每一个子弹的更新函数,由于这是一个虚函数,可以体现出多态性
pBullet = GetNextBullet();
}
}
//清除所有子弹
void BulletSystem::Clear()
{
m_BulletList.clear();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -