📄 scene.java
字号:
package demo;
import java.util.Random;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
public class Scene {
private TiledLayer m_TLayer; //场景格子
private BrickSprite m_aBrick[]; //可以顶碎的砖块
private Sprite m_aPipe[]; //水管
private EnemySprite m_aEnemy[]; //敌人
private Random m_Random; //随机数
public Scene(int scrHeight){
try{
//读取格子tile图像
Image img = Image.createImage("/demo/grid.png");
m_TLayer = new TiledLayer( 10, 1, img, 25, 41 );
m_TLayer.setPosition(0, scrHeight - m_TLayer.getHeight());
//读取敌人和砖块的图像
Image imgSp = Image.createImage("/demo/sprite.png");
m_aBrick = new BrickSprite[4];
for( int n = 0; n < m_aBrick.length; n ++ )
m_aBrick[n] = new BrickSprite(imgSp, 13, 13);
m_aEnemy = new EnemySprite[2];
for( int n = 0; n < m_aEnemy.length; n ++ )
m_aEnemy[n] = new EnemySprite(imgSp, 13, 13);
//读取水管图像
Image imgPipe = Image.createImage("/demo/pipe.png");
m_aPipe = new Sprite[2];
for( int n = 0; n < m_aPipe.length; n ++ )
m_aPipe[n] = new Sprite(imgPipe, 29, 25);
m_Random = new Random();
}
catch(Exception exception){}
}
//将所有图层添加到指定的层管理器中
//manager指定层管理器
public void AddManager(LayerManager manager){
manager.append(m_TLayer);
for( int n = 0; n < m_aBrick.length; n ++ ){
manager.append(m_aBrick[n]);
manager.append(m_aBrick[n].m_Explosion);
}
for( int n = 0; n < m_aEnemy.length; n ++ )
manager.append(m_aEnemy[n]);
for( int n = 0; n < m_aPipe.length; n ++ )
manager.append(m_aPipe[n]);
}
//重新开局
public void Reset(){
for( int col = 0; col < m_TLayer.getColumns(); col ++ ){
for( int row = 0; row < m_TLayer.getRows(); row ++ )
m_TLayer.setCell(col, row, 1);
}
for( int n = 0; n < m_aPipe.length; n ++ ){
m_aPipe[n].setPosition(60 * n,
m_TLayer.getY() - m_aPipe[n].getHeight());
}
for( int n = 0; n < m_aBrick.length; n ++ ){
m_aBrick[n].setPosition(60 * n + 30,
m_TLayer.getY() - m_aBrick[n].getHeight()* 5);
}
CreateEnemy();
}
//获取场景的宽度
public int getWidth(){
return m_TLayer.getWidth();
}
//逻辑操作,mario为马利奥对象
public void Logic( MarioSprite mario ){
//mario下落
if( Drop(mario) )
{//如果能够继续下落
if( mario.getState() != MarioSprite.MARIO_JUMP )
mario.setState(MarioSprite.MARIO_DROP);
}
else
{//如果不能继续下落
if( mario.getState() == MarioSprite.MARIO_DROP ){
mario.setState(MarioSprite.MARIO_NORMAL);
}
}
//mario逻辑操作
mario.Logic(getWidth());
for( int n = 0; n < m_aBrick.length; n ++ )
{
//砖块逻辑
m_aBrick[n].Logic();
if( mario.collidesWith(m_aBrick[n], false) )
{//mario与砖块碰撞
int x1 = m_aBrick[n].getX();
int x2 = m_aBrick[n].getX() + m_aBrick[n].getWidth();
if( mario.getRefPixelX() < x1 ||
mario.getRefPixelX() > x2 )
{//mario在砖块的两侧
mario.MoveBack();
}
else
{//否则肯定在砖块下面,Drop方法已经保证mario不可能从上面碰到砖块
m_aBrick[n].Break();
mario.setState(MarioSprite.MARIO_NORMAL);
}
}
}
for( int n = 0; n < m_aEnemy.length; n ++ )
{
//敌人下落
Drop(m_aEnemy[n]);
//敌人逻辑
m_aEnemy[n].Logic();
if( mario.collidesWith(m_aEnemy[n], false) )
{//mario与敌人相碰
int yDown = mario.getY() + mario.getHeight();
//如果从上面碰到敌人,则敌人消失,否则游戏失败
if( yDown < m_aEnemy[n].getRefPixelY() )
m_aEnemy[n].setVisible(false);
else
mario.setState(MarioSprite.MARIO_DEAD);
}
for( int m = 0; m < m_aBrick.length; m ++ )
{//敌人与砖块相碰
if( m_aEnemy[n].collidesWith(m_aBrick[m], false) ){
m_aEnemy[n].Rebound();
}
}
for( int m = 0; m < m_aPipe.length; m ++ )
{//敌人与水管相碰
if( m_aEnemy[n].collidesWith(m_aPipe[m], false) ){
m_aEnemy[n].Rebound();
}
}
//敌人走到场景边缘
if( m_aEnemy[n].getX() <= 2 )
m_aEnemy[n].Rebound();
if( m_aEnemy[n].getX() + m_aEnemy[n].getWidth() >= getWidth() - 2 )
m_aEnemy[n].Rebound();
}
CreateEnemy();
}
//让精灵下落
private boolean Drop( Sprite sp ){
boolean bRet = true;
int x = sp.getX();
int y = sp.getY() + 4;
int width = sp.getWidth();
int yDown = sp.getY() + sp.getHeight() + 4;
if( yDown >= m_TLayer.getY() )
{//如果落到格子上
yDown = m_TLayer.getY() - 1;
y = yDown - sp.getHeight();
bRet = false;
}
for( int n = 0; n < m_aPipe.length; n ++ )
{//如果落到水管上
int pX = m_aPipe[n].getX();
int pWidth = m_aPipe[n].getWidth();
if( x + width > pX && x < pX + pWidth ){
if( y < m_aPipe[n].getY() &&
yDown >= m_aPipe[n].getY() ){
yDown = m_aPipe[n].getY() - 1;
y = yDown - sp.getHeight();
bRet = false;
}
}
}
for( int n = 0; n < m_aBrick.length; n ++ )
{//如果落到砖块上
if( m_aBrick[n].isVisible() == false )
continue;
int bX = m_aBrick[n].getX();
int bWidth = m_aBrick[n].getWidth();
if( x + width > bX && x < bX + bWidth ){
if( y < m_aBrick[n].getY() &&
yDown >= m_aBrick[n].getY() ){
yDown = m_aBrick[n].getY() - 1;
y = yDown - sp.getHeight();
bRet = false;
}
}
}
sp.setPosition(x, y);
//落到物体上,返回false,否则返回true
return bRet;
}
//随机产生敌人
private void CreateEnemy(){
for( int n = 0; n < m_aEnemy.length; n ++ ){
if( m_aEnemy[n].isVisible() == false )
{//随机位置产生新敌人
int x = m_Random.nextInt() % (getWidth() - 60);
x = Math.abs(x) + 30;
m_aEnemy[n].Start( x, 0, 2 );
return;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -