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