📄 player.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 + -