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

📄 gameapplet.jc

📁 JILRuntime A general purpose, register based virtual machine (VM) that supports object-oriented feat
💻 JC
📖 第 1 页 / 共 2 页
字号:
            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 + -