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

📄 tbullet.cpp

📁 一个另类的坦克大战源程序
💻 CPP
字号:
// TBullet.cpp: implementation of the TBullet class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "TBullet.h"
#include "TExplode.h"
#include "Tworld.h"

ESound TBullet::m_sound[4];
EPG TBullet::m_epg[4];

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

TBullet::TBullet(int x,int y,DIRECTION dir,BULLET_TYPE nType,int nShield,int nFireRange)
:TSprite(x,y,nShield,0,CLASS_TBULLET),m_nType(nType)
{
	SetDelayTimer(50);
	m_dir = dir;
	m_nFireRange = nFireRange;


	//////////////////////////////////////////
	//计算音效的音量及均衡
	
	int valume,pan;		//音量和均衡
	int w,h;

	//声源与玩家的距离
	w = x - g_world.Player(0)->GetX();
	h = y - g_world.Player(0)->GetY();

	//计算音效的音量及均衡
	valume = MAX(ABS(w),ABS(h)) * (-10000/800);
	pan = w * (10000/400);

	/////////////////////////////////////////////////
	//跟据类型设置速度

	switch(nType)
	{
	case LIGHT:
		//玩家的子弹,总会听到声音的
		m_nSpeed = 15;
		//if(valume>-10000)	//小于最小音量,没必要播放
		m_sound[2].Play(-1000,pan);
		break;
	case FIRE:
		m_nSpeed = 10;
		if(valume>-10000)
			m_sound[1].Play(valume,pan);
		break;
	case DMISSILE:
		m_nSpeed = 0;		//导弹开始速度为0,然后利用加速度加速
		if(valume>-10000)
			m_sound[0].Play(valume,pan);
		break;
	case SMISSILE:
		m_nSpeed = 0;
		if(valume>-10000)
			m_sound[0].Play(valume,pan);
		break;
	}
}

TBullet::~TBullet()
{

}


void TBullet::Move()
{
	if(!IsMyTime())
		return ;

	TLinkNode * pNode;
	switch(m_nType)
	{
	case FIRE:		//火弹,由火坦克发射的炮弹

		//计算出当前动画帧
		m_nCurrentFrame = m_dir*3+(m_nCurrentFrame+1)%3;

		//超出射程范围,发出死亡信息
		if(m_nFireRange<0)
		{
			Dead();
		}

		//击中玩家了吗?(即使死了也不让你好过)
		if(g_world.Player(0)->HitBy(this))
		{
			//击中目标,任务完成
			Dead();	
		}

		//已经死亡,来个爆炸效果
		if(IsDead())
			g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY,EXPLODE_FIRE));

		break;
	case DMISSILE:	//双导弹,敌军的导弹
		
		m_nSpeed +=1;	//以加速为1的速度运动

		m_nCurrentFrame = m_dir;	//计算当前动画的帧

		//超出射程范围,发出死亡信息
		if(m_nFireRange<0)
			Dead();

		//击中玩家?
		if(g_world.Player(0)->HitBy(this))
			Dead();

		//死了
		if(IsDead())
		{
			/////////////////////////////////////////////////////
			//双导弹当然是两个爆炸效果
			if(m_dir==DIR_RIGHT||m_dir==DIR_LEFT)
			{
				g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY+6,EXPLODE_MISSILE));
				g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY-6,EXPLODE_MISSILE));
			}else
			{
				g_world.ExplodeLink().Add(NEW TExplode(m_nX+6,m_nY,EXPLODE_MISSILE));
				g_world.ExplodeLink().Add(NEW TExplode(m_nX-6,m_nY,EXPLODE_MISSILE));
			}
		}
		break;
	case SMISSILE:	//单导弹,不用注释了吧
		m_nSpeed ++;
		m_nCurrentFrame = m_dir;

		if(m_nFireRange<0)
			Dead();
		if(g_world.Player(0)->HitBy(this))
			Dead();

		if(IsDead())
			g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY,EXPLODE_MISSILE));
		break;

	case LIGHT:	//我们的武器:)

		m_nCurrentFrame = 0;

		////////////////////////////////////////////////////
		//计算是否打中在链表中的敌军坦克
		
		//取得链表中的第一辆坦克
		pNode=g_world.EnemyTankLink().m_pHeader;

		while(pNode)	//还不到链尾
		{
			//打中了吗?
			if(pNode->m_pObject->HitBy(this))
				//Ok,Mission completed
				Dead();
			//取得下一辆坦克
			pNode = pNode->m_pNext;
		}

		////////////////////////////////////////////////////
		//计算是否打中障碍物
		pNode = g_world.ObstacleLink().m_pHeader ;
		while(pNode)
		{
			if(pNode->m_pObject->HitBy(this))
				Dead();
			pNode = pNode->m_pNext;
		}

		if(m_nFireRange<0)
		{
			//太远了,没办法
			Dead();
		}

		//???,为什么没有爆炸效果?

		break;
	default:
		TRACE(0,"Invalid bullet id");
		break;
	}

	//是不是死了?
	if(!IsDead())
	{
		//没死,那么继续移动

		//速度太快了!
		if(m_nSpeed>24)
			m_nSpeed = 24;

		//向前,向前,向前...
		m_nX+=g_nDirXY[m_dir][0]*m_nSpeed;
		m_nY+=g_nDirXY[m_dir][1]*m_nSpeed;

		//改变射程
		m_nFireRange -= m_nSpeed;
	}
}


//////////////////////////////////////////////
//画子弹
void TBullet::Draw()
{
	POINT p;
	p.x = m_nX;
	p.y = m_nY;
	g_world.LPToDP(p);	//把世界逻辑坐标转换到设备坐标
	WGE_Surface.Blt(m_epg[m_nType],
		m_nCurrentFrame,
		p.x,p.y );
}

///////////////////////////////////////////////
//取得碰撞矩形
void TBullet::GetRect(RECT& rc)
{
	rc.left = m_nX - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyX;
	rc.top = m_nY - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyY;
	rc.bottom = rc.top + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwHeight ;
	rc.right = rc.left + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwWidth ;
}

⌨️ 快捷键说明

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