📄 explosion.jc
字号:
//------------------------------------------------------------------------------
// File: Explosion.jc
//------------------------------------------------------------------------------
//
// Description:
// ------------
// Class definition for invaders game applet.
//------------------------------------------------------------------------------
class Explosion
{
method Explosion(long imageID, long sizeX, long sizeY, long speed);
method Start(long x, long y);
method Animate();
method Link(Screen& screen);
method Unlink(Screen& screen);
long m_Alive;
BitmapLayer& m_Layer;
long m_Ani;
long m_AniStep;
long m_AniSpeed;
long m_Timer;
long m_BmWidth;
}
//------------------------------------------------------------------------------
// class Explosion
//------------------------------------------------------------------------------
// constructor
method Explosion::Explosion(long imageID, long sizeX, long sizeY, long speed)
{
const Bitmap& bm = kBitmapList[imageID];
m_BmWidth = bm.Width();
// create our layer
m_Layer = new BitmapLayer();
m_Layer.Bitmap( bm );
m_Layer.ResizeTo(sizeX, sizeY);
m_AniStep = sizeX;
m_AniSpeed = speed;
m_Ani = 0;
m_Timer = 0;
m_Alive = false;
if( imageID == kBmExplo24 )
m_Layer.GroupID( kGrpBigExplo );
else
m_Layer.GroupID( kGrpSmallExplo );
// add the layer to our screen's list of layers
Link( g_Applet.GameApplet::m_Screen );
}
//------------------------------------------------------------------------------
// Start
//------------------------------------------------------------------------------
// Make layer visible and start animation
method Explosion::Start(long x, long y)
{
m_Ani = 0;
m_Timer = stdlib::GetTicks() + m_AniSpeed;
m_Alive = true;
m_Layer.MoveTo(x - m_Layer.Width() / 2, y - m_Layer.Height() / 2);
m_Layer.Show();
}
//------------------------------------------------------------------------------
// Animate
//------------------------------------------------------------------------------
// Process the animation. The layer hides automatically at end of animation.
method Explosion::Animate()
{
if( m_Alive )
{
if( m_Timer < stdlib::GetTicks() )
{
m_Timer = stdlib::GetTicks() + m_AniSpeed;
m_Ani += m_AniStep;
if( m_Ani < m_BmWidth )
{
m_Layer.Offset(m_Ani, 0);
}
else
{
m_Layer.Hide();
m_Alive = false;
}
}
// if an explosion overlaps with an enemy ship, kill enemy ship
GameApplet& game = g_Applet;
Screen& screen = game.m_Screen;
for(long index = -1;;)
{
Layer& otherLayer = screen.LayerCollision( m_Layer, index );
if( otherLayer == null )
break;
if( otherLayer.GroupID() == kGrpEnemy )
{
Enemy& enemy = otherLayer.User();
enemy.Kill();
}
index = otherLayer.Index();
}
}
}
//------------------------------------------------------------------------------
// Link
//------------------------------------------------------------------------------
//
method Explosion::Link(Screen& screen)
{
m_Layer.User( this );
screen.AddLayer( m_Layer );
}
//------------------------------------------------------------------------------
// Unlink
//------------------------------------------------------------------------------
//
method Explosion::Unlink(Screen& screen)
{
m_Alive = false;
screen.RemoveLayer( m_Layer );
m_Layer.User( null );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -