explosion.jc

来自「JILRuntime A general purpose, register b」· JC 代码 · 共 133 行

JC
133
字号
//------------------------------------------------------------------------------
// 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 + =
减小字号Ctrl + -
显示快捷键?