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

📄 player.jc

📁 JILRuntime A general purpose, register based virtual machine (VM) that supports object-oriented feat
💻 JC
字号:
//------------------------------------------------------------------------------
// File: Player.jc
//------------------------------------------------------------------------------
//
// Description:
// ------------
//  Class definition for invaders game applet.
//------------------------------------------------------------------------------

class Player
{
    method          Player(long imageID, long bonus);
    method          Start(long x, long y);
    method long     Fire();
    method          Kill();
    method          Idle();
	method			SpawnMissile(long x, long y, long deltaY);
	method			Link(Screen& screen);
	method			Unlink(Screen& screen);

    long            m_X;
    long            m_Y;
    long            m_Alive;
    long            m_Bonus;
    long			m_NumMissiles;
    long			m_MaxMissiles;
    BitmapLayer&    m_Layer;
    array&			m_Missiles;
}

//------------------------------------------------------------------------------
// class Player
//------------------------------------------------------------------------------
// constructor

method Player::Player(long imageID, long bonus)
{
    m_X = 0;
    m_Y = 0;
    m_Alive = false;
    m_Bonus = bonus;
    m_NumMissiles = 0;
    m_MaxMissiles = 1;
    m_Layer = new BitmapLayer();
    m_Layer.GroupID( kGrpPlayer );
    m_Layer.Bitmap( kBitmapList[imageID] );
    m_Layer.AutoSize();
    m_Missiles = new array;

    Link( g_Applet.GameApplet::m_Screen );
}

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

method Player::Start(long x, long y)
{
    m_X = x;
    m_Y = y;
    m_Alive = true;
    m_Layer.Show();
    Idle();
}

//------------------------------------------------------------------------------
// Fire
//------------------------------------------------------------------------------
//

method long Player::Fire()
{
    if( m_Alive and m_NumMissiles < m_MaxMissiles )
    {
        GameApplet& game = g_Applet;
        long x = m_X + 7;
        long y = game.m_Screen.Height() - m_Y - 18;
        if( m_Bonus )
        {
            Player& player = game.m_Player[0];
            x += player.m_X;
        }
        SpawnMissile(x, y, kPlayerMissileSpeed);
        return true;
    }
    return false;
}

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

method Player::Kill()
{
    if( m_Alive )
    {
        GameApplet& game = g_Applet;
        m_Alive = false;
        m_MaxMissiles = 1;
        m_Layer.Hide();
        long w = m_Layer.Width() / 2;
        long h = m_Layer.Height() / 2;
        if( m_Bonus )
        {
            Player& player = game.m_Player[0];
            game.BigExplosion(player.m_X + m_X + w, game.m_Screen.Height() - m_Y + h);
        }
        else
        {
            game.BigExplosion(m_X + w, game.m_Screen.Height() - m_Y + h);
        }
        for( long m = 0; m < m_Missiles.length; m++ )
        {
			m_Missiles[m].Missile::m_Alive = false;
			m_Missiles[m].Missile::m_Layer.Hide();
		}
    }
}

//------------------------------------------------------------------------------
// Idle
//------------------------------------------------------------------------------
//

method Player::Idle()
{
    if( m_Alive )
    {
        GameApplet& game = g_Applet;
        if( m_Bonus )
        {
            Player& player = game.m_Player[0];
            m_Layer.MoveTo(player.m_X + m_X, game.m_Screen.Height() - m_Y);
        }
        else
        {
            m_Layer.MoveTo(m_X, game.m_Screen.Height() - m_Y);
        }
		m_NumMissiles = 0;
		for( long i = 0; i < m_Missiles.length; i++ )
		{
			Missile& m = m_Missiles[i];
			if( m.m_Alive )
			{
				m.Move();
				m_NumMissiles++;
			}
		}
    }
}

//------------------------------------------------------------------------------
// SpawnMissile
//------------------------------------------------------------------------------
// Add a new blue missile

method Player::SpawnMissile(long x, long y, long deltaY)
{
    for( long i = 0; i < m_Missiles.length; i++ )
    {
        if( not m_Missiles[i].Missile::m_Alive )
        {
            m_Missiles[i].Missile::Start(x, y, deltaY);
            return;
        }
    }
    Missile& missile = new Missile(kBmBlueMissile, 18, 18 );
    missile.Start(x, y, deltaY);
    m_Missiles += missile;
}

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

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

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

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

    // unlink player missiles
    for( long i = 0; i < m_Missiles.length; i++ )
    	m_Missiles[i].Missile::Unlink( screen );
}

⌨️ 快捷键说明

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