?? 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 + -