📄 gameapplet.jc
字号:
m_Player[2].Player::Start(centerX, allY);
m_Player[3].Player::Start(rightX, allY);
break;
}
}
//------------------------------------------------------------------------------
// SpawnEnemy
//------------------------------------------------------------------------------
//
method GameApplet::SpawnEnemy(long x, long y)
{
long shape = stdlib::Rand(0, 4);
for( long i = 0; i < m_Enemies.length; i++ )
{
Enemy& ene = m_Enemies[i];
if( not ene.Alive() )
{
if( typeof(ene) != typeof(AttackEnemy) and
typeof(ene) != typeof(BossEnemy) )
{
ene.Unlink( m_Screen );
Enemy& enemy = new SmallEnemy( shape );
enemy.Start(x, y);
m_Enemies[i] = enemy;
return;
}
}
}
if( m_Enemies.length < kHardEnemyLimit )
{
Enemy& enemy = new SmallEnemy( shape );
m_Enemies += enemy;
enemy.Start(x, y);
}
}
//------------------------------------------------------------------------------
// AddMoreEnemies
//------------------------------------------------------------------------------
//
method GameApplet::AddMoreEnemies()
{
if( m_Enemies.length < kHardEnemyLimit )
{
long shape = m_Level % 5;
for( long i = 0; i < kNumberOfMoreEnemies; i++ )
{
m_Enemies += new SmallEnemy( shape );
}
}
}
//------------------------------------------------------------------------------
// KillAll
//------------------------------------------------------------------------------
// Kill all explosions and missiles
method GameApplet::KillAll()
{
long i;
for( i = 0; i < m_BigExplo.length; i++ )
{
m_BigExplo[i].Explosion::m_Alive = false;
m_BigExplo[i].Explosion::m_Layer.Hide();
}
for( i = 0; i < m_SmallExplo.length; i++ )
{
m_SmallExplo[i].Explosion::m_Alive = false;
m_SmallExplo[i].Explosion::m_Layer.Hide();
}
for( i = 0; i < m_RedMissiles.length; i++ )
{
m_RedMissiles[i].Missile::m_Alive = false;
m_RedMissiles[i].Missile::m_Layer.Hide();
}
}
//------------------------------------------------------------------------------
// OnInit
//------------------------------------------------------------------------------
//
method GameApplet::OnInit()
{
long i;
long maxX = m_Screen.Width();
long maxY = m_Screen.Height();
m_Level = 1;
m_LevelDisplay.Text( "Level " + stdlib::Ltoa(m_Level) );
m_LevelDisplay.AutoSize();
m_WinLayer.Hide();
m_LoseLayer.Hide();
m_Message.Hide();
m_Score = 0;
m_NumFire = 0;
// unlink player list and create new one
m_NumBonus = 0;
for( i = 0; i < m_Player.length; i++ )
m_Player[i].Player::Unlink( m_Screen );
m_Player = new array;
// unlink enemy list and create new one
for( i = 0; i < m_Enemies.length; i++ )
m_Enemies[i].Enemy::Unlink( m_Screen );
m_Enemies = new array;
// create new player
m_Player[0] = new Player( kBmShip, false);
for( i = 1; i <= 3; i++ )
m_Player[i] = new Player( kBmShip2, true);
long px = maxX / 2;
long py = m_Player[0].Player::m_Layer.Height();
m_Player[0].Player::Start(px, py);
// create new enemies
for( i = 0; i < kNumberOfEnemies; i++ )
{
long x = stdlib::Rand(0, maxX);
long y = stdlib::Rand(0, maxY / 2);
Enemy& enemy = new SmallEnemy( 0 );
enemy.Start(x, y);
m_Enemies += enemy;
}
m_RunMode = kModeContinue;
m_NextMode = kModeTimeOut;
}
//------------------------------------------------------------------------------
// OnStart
//------------------------------------------------------------------------------
//
method GameApplet::OnStart()
{
m_NumFire = 0;
m_Level++;
m_LevelDisplay.Text( "Level " + stdlib::Ltoa(m_Level) );
m_LevelDisplay.AutoSize();
m_WinLayer.Hide();
m_LoseLayer.Hide();
m_Message.Hide();
AddMoreEnemies();
AlignBonusShips();
if( (m_Level % kBossLevelInterval) > 0 )
{
long x, y;
long maxX = m_Screen.Width();
long maxY = m_Screen.Height();
for( long i = 0; i < m_Enemies.length; i++ )
{
if( typeof(m_Enemies[i]) == typeof(BossEnemy) )
{
m_Enemies[i].Enemy::Unlink( m_Screen );
m_Enemies[i] = new AttackEnemy( kBmAttackEnemy );
}
x = stdlib::Rand(0, maxX);
y = stdlib::Rand(0, maxY * 2 / 3);
m_Enemies[i].Enemy::Start(x, y);
}
// give player one bonus ship after each BOSS level
if( (m_Level / kBossLevelInterval) and (m_Level % kBossLevelInterval) == 1 )
{
AddBonusShip();
}
}
else
{
long i;
long maxX = m_Screen.Width() - 80;
// create BOSS(es)
long n = m_Level / kBossLevelInterval;
for( i = 0; i < n; i++ )
{
Enemy& boss = new BossEnemy( kBmMothership );
boss.Start(stdlib::Rand(0, maxX), -112);
m_Enemies[i].Enemy::Unlink( m_Screen );
m_Enemies[i] = boss;
}
// alert message
long x = (m_Screen.Width() - m_BossAlert.Width()) / 2;
m_BossAlert.MoveTo( x, 5 );
m_BossAlert.Show();
}
m_RunMode = kModeContinue;
m_NextMode = kModeTimeOut;
}
//------------------------------------------------------------------------------
// OnContinue
//------------------------------------------------------------------------------
//
method GameApplet::OnContinue()
{
long i;
long allDead = true;
// animate big explosions
for( i = 0; i < m_BigExplo.length; i++ )
m_BigExplo[i].Explosion::Animate();
// animate small explosions
for( i = 0; i < m_SmallExplo.length; i++ )
m_SmallExplo[i].Explosion::Animate();
// move enemy missiles
for( i = 0; i < m_RedMissiles.length; i++ )
m_RedMissiles[i].Missile::Move();
// move enemies
for( i = 0; i < m_Enemies.length; i++ )
{
if( m_Enemies[i].Enemy::Move() )
allDead = false;
}
// get mouse
long mx = 0, my = 0;
m_Screen.GetMouse(mx, my);
// move player
Player& player = m_Player[0];
mx -= player.m_Layer.Width() / 2;
if( player.m_X < mx )
player.m_X += kPlayerSpeed;
if( player.m_X > mx )
player.m_X -= kPlayerSpeed;
for( i = 0; i < m_Player.length; i++ )
m_Player[i].Player::Idle();
// check for game over
if( not m_Player[0].Player::m_Alive )
{
m_RunMode = kModeTimeOut;
m_NextMode = kModeGameOver;
}
else if( allDead )
{
m_RunMode = kModeTimeOut;
m_NextMode = kModeNextLevel;
}
}
//------------------------------------------------------------------------------
// OnTimeOut
//------------------------------------------------------------------------------
//
method GameApplet::OnTimeOut()
{
OnContinue();
if( m_Timer == 0 )
{
m_Timer = stdlib::GetTicks() + kTimeOutTicks;
}
else if( m_Timer < stdlib::GetTicks() )
{
m_RunMode = m_NextMode;
m_Timer = 0;
}
}
//------------------------------------------------------------------------------
// OnNextLevel
//------------------------------------------------------------------------------
//
method GameApplet::OnNextLevel()
{
string text = "";
if( (m_Level % kBossLevelInterval) > 0 )
{
float limit = kNumberOfMoreEnemies * m_Level * 2.0;
float rating = limit * 100.0 / m_NumFire;
text = stdlib::Format(
"Missiles fired: %d\n"
"Missile limit: %3.2f\n"
"Your rating: %3.2f", {m_NumFire, limit, rating});
if( rating >= 100.0 )
{
long bonus = rating * limit / 200.0;
AddScore( bonus );
text += stdlib::Format("\nBonus score: %d", {bonus});
// give player 1 missile bonus
long flag = false;
for( long i = 0; i < m_Player.length; i++ )
{
Player& player = m_Player[i];
if( player.m_Alive and player.m_MaxMissiles < kHardMissileLimit )
{
player.m_MaxMissiles++;
flag = true;
}
}
if( flag )
{
if( m_NumBonus )
text += "\nYour ships receive a bonus missile!";
else
text += "\nYour ship receives a bonus missile!";
}
}
}
else
{
if( m_NumBonus < 3 )
{
if( (m_Level / kBossLevelInterval) > 1 )
text = "You survived the big buddies.\nYou receive a bonus ship!";
else
text = "You survived the big buddy.\nYou receive a bonus ship!";
}
else
{
if( (m_Level / kBossLevelInterval) > 1 )
text = "You survived the big buddies.\nYou get 1000 bonus points!";
else
text = "You survived the big buddy.\nYou get 1000 bonus points!";
AddScore( 1000 );
}
}
text += "\n\nHit space to continue";
long y = (m_Screen.Height() - m_WinLayer.Height() - m_Message.Height()) / 2;
m_WinLayer.MoveTo( (m_Screen.Width() - m_WinLayer.Width()) / 2, y );
m_WinLayer.Show();
y += m_WinLayer.Height();
m_Message.Text( text );
m_Message.MoveTo( (m_Screen.Width() - m_Message.Width()) / 2, y );
m_Message.Show();
m_BossAlert.Hide();
KillAll();
m_RunMode = kModeWait;
m_NextMode = kModeStart;
}
//------------------------------------------------------------------------------
// OnGameOver
//------------------------------------------------------------------------------
//
method GameApplet::OnGameOver()
{
long y = (m_Screen.Height() - m_LoseLayer.Height() - m_Message.Height()) / 2;
m_LoseLayer.MoveTo( (m_Screen.Width() - m_LoseLayer.Width()) / 2, y );
m_LoseLayer.Show();
y += m_LoseLayer.Height();
m_Message.Text( kCredits );
m_Message.MoveTo( (m_Screen.Width() - m_Message.Width()) / 2, y );
m_Message.Show();
m_BossAlert.Hide();
KillAll();
m_RunMode = kModeWait;
m_NextMode = kModeInit;
}
//------------------------------------------------------------------------------
// AddScore
//------------------------------------------------------------------------------
//
method GameApplet::AddScore( long points )
{
m_Score += points;
m_ScoreDisplay.Text( "Score: " + stdlib::Ltoa(m_Score) );
m_ScoreDisplay.AutoSize();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -