📄 smallenemy.jc
字号:
//------------------------------------------------------------------------------
// File: SmallEnemy.jc
//------------------------------------------------------------------------------
//
// Description:
// ------------
// Class definition for invaders game applet.
//------------------------------------------------------------------------------
class SmallEnemy : interface Enemy
{
// methods
method SmallEnemy(long shape);
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_X;
long m_Y;
long m_Alive;
long m_DestX;
long m_DestY;
long m_Score;
long m_Speed;
long m_MoveThreshold;
long m_FireThreshold;
BitmapLayer& m_Layer;
}
//------------------------------------------------------------------------------
// class SmallEnemy
//------------------------------------------------------------------------------
// constructor
method SmallEnemy::SmallEnemy(long shape)
{
m_X = 0;
m_Y = 0;
m_DestX = 0;
m_DestY = 0;
m_Alive = false;
m_Score = kEnemyScore[shape];
m_Speed = kEnemySpeed[shape];
m_MoveThreshold = 997 - 2 * shape;
m_FireThreshold = 997 - 2 * shape;
m_Layer = new BitmapLayer();
m_Layer.GroupID( kGrpEnemy );
m_Layer.Bitmap( kBitmapList[kBmEnemy1 + shape] );
m_Layer.AutoSize();
Link( g_Applet.GameApplet::m_Screen );
}
//------------------------------------------------------------------------------
// Start
//------------------------------------------------------------------------------
//
method SmallEnemy::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_Layer.MoveTo( m_X, m_Y );
m_Layer.Show();
}
//------------------------------------------------------------------------------
// Move
//------------------------------------------------------------------------------
//
method long SmallEnemy::Move()
{
if( m_Alive )
{
GameApplet& game = g_Applet;
m_Layer.MoveTo( m_X, m_Y );
long dx = (m_X - m_DestX) / m_Speed;
if( dx < 0 )
m_X += m_Speed;
else if( dx > 0 )
m_X -= m_Speed;
long dy = (m_Y - m_DestY) / m_Speed;
if( dy < 0 )
m_Y += m_Speed;
else if( dy > 0 )
m_Y -= m_Speed;
if( not dx and not dy )
{
if( stdlib::Rand(0, 1000) > m_MoveThreshold )
{
Start(m_X, m_Y);
}
if( stdlib::Rand(0, 1000) > m_FireThreshold )
{
long x = m_X + (m_Layer.Width() - 15) / 2;
long y = m_Y + m_Layer.Height();
game.NewRedMissile( x, y, kEnemyMissileSpeed );
kSoundList[kSndBullet].Sound::Play(0, XToPan(x));
}
}
}
return m_Alive;
}
//------------------------------------------------------------------------------
// Kill
//------------------------------------------------------------------------------
//
method SmallEnemy::Kill()
{
GameApplet& game = g_Applet;
if( m_Alive )
{
m_Alive = false;
m_Layer.Hide();
game.BigExplosion(m_X + m_Layer.Width() / 2, m_Y + m_Layer.Height() / 2);
}
}
//------------------------------------------------------------------------------
// Alive
//------------------------------------------------------------------------------
//
method long SmallEnemy::Alive()
{
return m_Alive;
}
//------------------------------------------------------------------------------
// Index
//------------------------------------------------------------------------------
//
method long SmallEnemy::Index()
{
return m_Layer.Index();
}
//------------------------------------------------------------------------------
// Score
//------------------------------------------------------------------------------
//
method long SmallEnemy::Score()
{
return m_Score;
}
//------------------------------------------------------------------------------
// Link
//------------------------------------------------------------------------------
//
method SmallEnemy::Link(Screen& screen)
{
m_Layer.User( this );
screen.AddLayer( m_Layer );
}
//------------------------------------------------------------------------------
// Unlink
//------------------------------------------------------------------------------
//
method SmallEnemy::Unlink(Screen& screen)
{
m_Alive = false;
screen.RemoveLayer( m_Layer );
m_Layer.User( null );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -