bossenemy.jc

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

JC
230
字号
//------------------------------------------------------------------------------
// File: BossEnemy.jc
//------------------------------------------------------------------------------
//
// Description:
// ------------
//  Class definition for invaders game applet.
//------------------------------------------------------------------------------

class BossEnemy : interface Enemy
{
	// methods
    method          BossEnemy(long imageID);
    method          Start(long x, long y);
    method long     Move();
    method          Kill();
    method long     Alive();
    method long     Index();
    method long     Score();
    method			Link(Screen&);
    method          Unlink(Screen&);

	// data
    long            m_Health;
    long            m_Lighted;
    long            m_X;
    long            m_Y;
    long            m_Alive;
    long            m_DestX;
    long            m_DestY;
    long            m_Score;
    BitmapLayer&    m_Layer;
}

//------------------------------------------------------------------------------
// class BossEnemy
//------------------------------------------------------------------------------
// constructor

method BossEnemy::BossEnemy(long imageID)
{
    m_Health = 0;
    m_Lighted = 0;
    m_X = 0;
    m_Y = 0;
    m_DestX = 0;
    m_DestY = 0;
    m_Alive = false;
    m_Score = kScoreMothershipHit;
    m_Layer = new BitmapLayer();
    m_Layer.GroupID( kGrpEnemy );
    m_Layer.Bitmap( kBitmapList[imageID] );
    m_Layer.ResizeTo(80, 112);

    Link( g_Applet.GameApplet::m_Screen );
}

//------------------------------------------------------------------------------
// Start
//------------------------------------------------------------------------------
//

method BossEnemy::Start(long x, long y)
{
    GameApplet& game = g_Applet;
    long maxX = game.m_Screen.Width() - m_Layer.Width();
    long maxY = game.m_Screen.Height() * 2 / 3 - m_Layer.Height();
    m_X = x;
    m_Y = y;
    m_DestX = stdlib::Rand(0, maxX);
    m_DestY = stdlib::Rand(0, maxY);
    m_Alive = true;
    m_Health = kInitialBossHealth;
    m_Layer.MoveTo( m_X, m_Y );
    m_Layer.Show();
}

//------------------------------------------------------------------------------
// Move
//------------------------------------------------------------------------------
//

method long BossEnemy::Move()
{
    if( m_Alive )
    {
        GameApplet& game = g_Applet;
        m_Layer.MoveTo( m_X, m_Y );

        long dx = (m_X - m_DestX) / kBossSpeed;
        if( dx < 0 )
            m_X += kBossSpeed;
        else if( dx > 0 )
            m_X -= kBossSpeed;

        long dy = (m_Y - m_DestY) / kBossSpeed;
        if( dy < 0 )
            m_Y += kBossSpeed;
        else if( dy > 0 )
            m_Y -= kBossSpeed;

        if( not dx and not dy )
        {
			if( stdlib::Rand(0, 1000) > 997 )
			{
				Start(m_X, m_Y);
			}
			if( stdlib::Rand(0, 1000) > 990 )
			{
				long x1 = m_X + (m_Layer.Width() - 15) / 2;
				long x2 = m_X + (m_Layer.Width() - 15);
				long y = m_Y + m_Layer.Height();
				game.NewRedMissile( m_X, y, kEnemyMissileSpeed );
				game.NewRedMissile( x1,  y, kEnemyMissileSpeed );
				game.NewRedMissile( x2,  y, kEnemyMissileSpeed );
                kSoundList[kSndBullet].Sound::Play(0, XToPan(x1));
			}
			if( stdlib::Rand(0, 1000) > 990 )
			{
				game.SpawnEnemy(m_X + m_Layer.Width() / 2, m_Y + m_Layer.Height() / 2);
			}
		}
        if( m_Lighted )
        {
            if( m_Lighted < stdlib::GetTicks() )
            {
                m_Lighted = 0;
                m_Layer.Offset(0, 0);
            }
        }
    }
    return m_Alive;
}

//------------------------------------------------------------------------------
// Kill
//------------------------------------------------------------------------------
//

method BossEnemy::Kill()
{
    GameApplet& game = g_Applet;
    if( m_Alive )
    {
        if( m_Health < 1 )
        {
            m_Alive = false;
            m_Layer.Hide();
            // place 9 big explosions
            long x1 = (m_Layer.Width() - 24) / 2;
            long x2 = m_Layer.Width() - 24;
            long y1 = (m_Layer.Height() - 24) / 2;
            long y2 = m_Layer.Height() - 24;
            game.BigExplosion(m_X, m_Y);
            game.BigExplosion(m_X + x1, m_Y);
            game.BigExplosion(m_X + x2, m_Y);
            game.BigExplosion(m_X, m_Y + y1);
            game.BigExplosion(m_X + x1, m_Y + y1);
            game.BigExplosion(m_X + x2, m_Y + y1);
            game.BigExplosion(m_X, m_Y + y2);
            game.BigExplosion(m_X + x1, m_Y + y2);
            game.BigExplosion(m_X + x2, m_Y + y2);
            // add to score
            game.AddScore( kScoreMothership );
        }
        else
        {
            m_Health--;
            if( not m_Lighted )
            {
                m_Lighted = stdlib::GetTicks() + 75;
                m_Layer.Offset(80, 0);
            }
        }
    }
}

//------------------------------------------------------------------------------
// Alive
//------------------------------------------------------------------------------
//

method long BossEnemy::Alive()
{
	return m_Alive;
}

//------------------------------------------------------------------------------
// Index
//------------------------------------------------------------------------------
//

method long BossEnemy::Index()
{
	return m_Layer.Index();
}

//------------------------------------------------------------------------------
// Score
//------------------------------------------------------------------------------
//

method long BossEnemy::Score()
{
	return m_Score;
}

//------------------------------------------------------------------------------
// Link
//------------------------------------------------------------------------------
//

method BossEnemy::Link(Screen& screen)
{
	m_Layer.User( this );
    screen.AddLayer( m_Layer );
}

//------------------------------------------------------------------------------
// Unlink
//------------------------------------------------------------------------------
//

method BossEnemy::Unlink(Screen& screen)
{
    m_Alive = false;
    screen.RemoveLayer( m_Layer );
    m_Layer.User( null );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?