📄 tbullet.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 + -