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

📄 bulletsystem.cpp

📁 射击小游戏
💻 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 + -