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

📄 explosion.jc

📁 JILRuntime A general purpose, register based virtual machine (VM) that supports object-oriented feat
💻 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 + -