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

📄 smallenemy.jc

📁 JILRuntime A general purpose, register based virtual machine (VM) that supports object-oriented feat
💻 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 + -