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

📄 scene.java

📁 J2ME编程的50个例子,适合掌上系统的编程
💻 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 + -