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

📄 bossenemy.jc

📁 JILRuntime A general purpose, register based virtual machine (VM) that supports object-oriented feat
💻 JC
字号:
//------------------------------------------------------------------------------
// 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -