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

📄 spritecanvas.java

📁 j2me的入门程序
💻 JAVA
字号:
package com.ejoy;

import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.*;



//
//经验总结:getRefPiexalX()返回的是参考点在图层上的x坐标
//getRefPiexalY()返回的是参考点在图层上的y坐标
//
//而设置位置的方法setPosition(x,y)是以精灵左上角为坐标参考的(基于图层)
//


/**
 * @author net.app
 * designed by jackie
 * Email:net.app@hotmail.com
 * 
 * 
 * 该精灵类仅仅是为了测试精灵在地图中的行走及碰撞的实现
 * 基于MIDP2.0,
 *
 */


public class SpriteCanvas extends GameCanvas implements Runnable{

	private Graphics mg;//离屏刷子
	public Image spimg;//精灵载入图
	public Image bgimg;//背景载入图
	public MySprite sp;//主角精灵
	
	
	public TiledLayer bg0;//地图的背景
	public TiledLayer bg1;//地图的碰撞层
	public TiledLayer bg2;//地图的装饰层
	public TiledLayer bg3;//精灵的遮盖层
	
	public int SPRITE_WIDTH=32;//精灵的宽度
	public int SPRITE_HEIGHT=48;//精灵的高度
	
	public int MAP_WIDTH=32*16;//地图的宽度
	public int MAP_HEIGHT=32*16;//地图的高度
	public int SCREEN_WIDTH=getWidth();//获取屏幕的宽度
	public int SCREEN_HEIGHT=208;//指定屏幕的高度
	public int winX=0;//窗口左上角x坐标
	public int winY=0;//窗口左上角y坐标
	
	
	public int speed=5;//窗口移动速度
	public int wdelta=5;//精灵移动速度
	
	public LayerManager lm;//LayerManager
	
	public int frame=0;//精灵子帧初始化
	
	public final static int SOUTH=0;//向下
	public final static int WEST=1;//向左
	public final static int EAST=2;//向右
	public final static int NORTH=3;//向上
	
	
	final byte[][] mynewmap_map0 = {
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 },
			{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
			 }
			};

			final byte[][] mynewmap_map1 = {
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0
			 },
			{ 10, 11, 11, 11, 11, 11, 11, 11, 0, 0, 0, 30, 11, 11, 11, 12
			 },
			{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20
			 },
			{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20
			 },
			{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 59, 60, 0, 20
			 },
			{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 20
			 },
			{ 18, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 20
			 },
			{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20
			 },
			{ 18, 0, 0, 85, 86, 87, 88, 0, 0, 0, 0, 58, 0, 0, 0, 20
			 },
			{ 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20
			 },
			{ 18, 33, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 81, 0, 20
			 },
			{ 18, 41, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20
			 },
			{ 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28
			 },
			{ 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36
			 }
			};
			
			final byte[][] mynewmap_map2 = {
					{ 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 25, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 },
					{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
					 }
					};

			final byte[][] mynewmap_map3 = {
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 2, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, 3, 3, 4
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 0
			 },
			{ 0, 0, 0, 53, 54, 55, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 61, 62, 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 69, 70, 71, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 77, 78, 79, 80, 0, 0, 0, 0, 50, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 0, 0, 0, 73, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 },
			{ 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0
			 },
			{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
			 }
			};
	
	/**
	 * 构造函数
	 *
	 */		
			
	public SpriteCanvas()
	{
		super(true);
		mg=getGraphics();
		setFullScreenMode(true);
		int[] spriteQeuene=new int[]{0,0,1,1,2,2,3,3,
				4,4,5,5,6,6,7,7,
				8,8,9,9,10,10,11,11,
				12,12,13,13,14,14,15,15};
		try
		{
			spimg=Image.createImage("/res/girl.png");
			sp=new MySprite(spimg,SPRITE_WIDTH,SPRITE_HEIGHT);
			sp.defineReferencePixel(SPRITE_WIDTH/2, SPRITE_HEIGHT/2);
			sp.setFrameSequence(spriteQeuene);
			sp.setPosition(100, 10);
			bgimg=Image.createImage("/res/town.png");
			bg0=new TiledLayer(16,16,bgimg,32,32);
			bg1=new TiledLayer(16,16,bgimg,32,32);
			bg2=new TiledLayer(16,16,bgimg,32,32);
			bg3=new TiledLayer(16,16,bgimg,32,32);
			
			for(int i=0;i<mynewmap_map0.length;i++)
			{
				for(int j=0;j<mynewmap_map0[i].length;j++)
				{
					bg0.setCell(j, i, mynewmap_map0[i][j]);
					bg1.setCell(j, i, mynewmap_map1[i][j]);
					bg2.setCell(j, i, mynewmap_map2[i][j]);
					bg3.setCell(j, i, mynewmap_map3[i][j]);
				}
			}
			
			lm=new LayerManager();
	
			lm.append(bg3);
			lm.append(sp);
			lm.append(bg2);
			//lm.append(arg0)
			lm.append(bg1);
			lm.append(bg0);
			
			
			
			
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		
		
		
	}
	
	
	
	
	
	public void run()
	{
		while(true)
		{
			
			long lastTime=System.currentTimeMillis();
			logic();
			mg.setColor(0x000000);
			mg.fillRect(0, 0, getWidth(), 208);
			//lm.setViewWindow(winX, winY, getWidth(), 208);
			sp.paint(mg);
			lm.paint(mg, 0, 0);
			flushGraphics();
			long currentTime=System.currentTimeMillis();
			int esp=(int)(currentTime-lastTime);
			if(esp<1000/20)
			{
				try
				{
					Thread.sleep(1000/20-esp);
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		}
	}
	
	
	/**
	 * 
	 * 演示中的逻辑处理
	 * 
	 * 注释部分为单屏无精灵情况下的演示
	 * 
	 * 基本上为四个按键的处理
	 *
	 */
	


	
	public void logic()
	{
		int keyCode=getKeyStates();
		int spriteX=sp.getRefPixelX();
		int spriteY=sp.getRefPixelY();
		
		if((keyCode&UP_PRESSED)!=0)
		{
			
			if(spriteY>SCREEN_HEIGHT/2&&spriteY<MAP_HEIGHT-SCREEN_HEIGHT/2&&winY-speed>0)
			{
				if(!this.adjustAndCollision(NORTH, wdelta))
				{
					winY-=speed;
					this.setFrames(NORTH);
					sp.setPosition(spriteX-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2-wdelta);
					lm.setViewWindow(winX, winY, SCREEN_WIDTH, SCREEN_HEIGHT);
				}
			}
			else
				{
					if(spriteY-wdelta>SPRITE_HEIGHT/2)
					{
						if(!this.adjustAndCollision(NORTH, wdelta))
						{
							this.setFrames(NORTH);
							sp.setPosition(spriteX-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2-wdelta);
						}
					}
				}
			
			
			/*if((winY-speed)>0)
			{
				winY-=speed;
			}
			else if(winY>0&&(winY-speed)<0)
			{
				winY-=(speed-winY);
			}
			else if(winY<0)
			{
				winY=0;
			}*/
		}
		
		if((keyCode&DOWN_PRESSED)!=0)
		{
			
			if(spriteY>SCREEN_HEIGHT/2&&spriteY<MAP_HEIGHT-SCREEN_HEIGHT/2&&(winY+speed)<MAP_HEIGHT-SCREEN_HEIGHT)
			{
				if(!adjustAndCollision(SOUTH, wdelta))
				{
					winY+=speed;
					this.setFrames(SOUTH);
					sp.setPosition(spriteX-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2+wdelta);
					lm.setViewWindow(winX, winY, SCREEN_WIDTH, SCREEN_HEIGHT);
				}
			}
			else
			{
				if(!this.adjustAndCollision(SOUTH, wdelta))
				{
					this.setFrames(SOUTH);
					sp.setPosition(spriteX-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2+wdelta);
				}
			}
			
			
			/*if((winY+speed)<(MAP_HEIGHT-208))
			{
				winY+=speed;
			}
			
			else if((winY+speed)>(MAP_HEIGHT-208)&&winY<(MAP_HEIGHT-208))
			{
				winY+=(winY+speed)%(MAP_HEIGHT-208);
			}
			
			else if(winY>(MAP_HEIGHT-208))
			{
				winY=MAP_HEIGHT-208;
			}*/
		}
		
		
		if((keyCode&LEFT_PRESSED)!=0)
		{
			
			if(spriteX>SCREEN_WIDTH/2&&spriteX<MAP_WIDTH-SCREEN_WIDTH/2&&winX-speed>0)
			{
				if(!this.adjustAndCollision(WEST, wdelta))
				{
					winX-=speed;
					this.setFrames(WEST);
					sp.setPosition(spriteX-wdelta-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2);
					lm.setViewWindow(winX, winY, SCREEN_WIDTH, SCREEN_HEIGHT);
				}
				
			}
			
			else
			{
				if(spriteX-wdelta>SPRITE_WIDTH/2)
				{
					if(!this.adjustAndCollision(WEST, wdelta))
					{
						this.setFrames(WEST);
						sp.setPosition(spriteX-wdelta-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2);
					}
				}
				
				
			}
			
			
			
			/*if(winX-speed>0)
			{
				winX-=speed;
			}
			
			else if(winX-speed<0&&winX>0)
			{
				winX-=(speed-winX);
			}
			
			else if(winX<0)
			{
				winX=0;
			}*/
		}
		
		
		
		if((keyCode&RIGHT_PRESSED)!=0)
		{
			
			if(spriteX>SCREEN_WIDTH/2&&spriteX<MAP_WIDTH-SCREEN_WIDTH/2&&(winX+speed)<MAP_WIDTH-SCREEN_WIDTH)
			{
				if(!this.adjustAndCollision(EAST, wdelta))
				{
					winX+=speed;
					this.setFrames(EAST);
					sp.setPosition(spriteX+wdelta-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2);
					lm.setViewWindow(winX, winY, SCREEN_WIDTH, SCREEN_HEIGHT);
				}
			
			}
			else
			{
				if(spriteX+wdelta<MAP_WIDTH-SPRITE_WIDTH/2)
				{
					if(!this.adjustAndCollision(EAST, wdelta))
					{
						this.setFrames(EAST);
						sp.setPosition(spriteX+wdelta-SPRITE_WIDTH/2, spriteY-SPRITE_HEIGHT/2);
					}
				}
				
			}
			
			
			/*if(winX+speed<MAP_WIDTH-getWidth())
			{
				winX+=speed;
			}
			
			else if(winX+speed>MAP_WIDTH-getWidth()&&winX<MAP_WIDTH-getWidth())
			{
				winX+=(winX+speed)%(MAP_WIDTH-getWidth());
			}
			
			else if(winX>(MAP_WIDTH-getWidth()))
			{
				winX=MAP_WIDTH-getWidth();
			}*/
		}
				
		
	}
	
	
	
	public void setFrames(int direction)
	{
		frame++;
		sp.setFrame(frame%8+direction*8);
	}
	
	
	/**
	 * 调整性碰撞检测:先向所移方向移动walkdelta,检测是否
	 * 碰撞,是的话返回true,否的话返回false,不过情况如何
	 * 都将返回原先位置
	 * 
	 * @param direction 移动方向
	 * @param walkdelta 移动的偏移值,于speed可以合并使用
	 * @return boolean
	 */
	
	public boolean adjustAndCollision(int direction,int walkdelta)
	{
		boolean isCollision=false;
		if(direction==EAST)
		{
			int oldX=sp.getRefPixelX();
			int newX=oldX+walkdelta;
			if(newX<MAP_WIDTH-SPRITE_WIDTH/2)
				sp.setPosition(newX-SPRITE_WIDTH/2, sp.getRefPixelY()-SPRITE_HEIGHT/2);
			if(sp.collidesWith(bg1, true))
			{
				isCollision=true;
			}
			sp.setPosition(oldX-SPRITE_WIDTH/2, sp.getRefPixelY()-SPRITE_HEIGHT/2);
			return isCollision;
		}
		
		else if(direction==WEST)
		{
			int oldX=sp.getRefPixelX();
			int newX=oldX-walkdelta;
			if(newX>SPRITE_WIDTH/2)
				sp.setPosition(newX-SPRITE_WIDTH/2, sp.getRefPixelY()-SPRITE_HEIGHT/2);
			if(sp.collidesWith(bg1, true))
				isCollision=true;
			sp.setPosition(oldX-SPRITE_WIDTH/2, sp.getRefPixelY()-SPRITE_HEIGHT/2);
			return isCollision;
		}
		
		else if(direction==SOUTH)
		{
			int oldY=sp.getRefPixelY();
			int newY=oldY+walkdelta;
			if(newY<MAP_HEIGHT-SPRITE_HEIGHT/2)
				sp.setPosition(sp.getRefPixelX()-SPRITE_WIDTH/2, newY-SPRITE_HEIGHT/2);
			if(sp.collidesWith(bg1, true))
				isCollision=true;
			sp.setPosition(sp.getRefPixelX()-SPRITE_WIDTH/2, oldY-SPRITE_HEIGHT/2);
			return isCollision;
		}
		
		else if(direction==NORTH)
		{
			int oldY=sp.getRefPixelY();
			int newY=oldY-walkdelta;
			if(newY>SPRITE_HEIGHT/2)
				sp.setPosition(sp.getRefPixelX()-SPRITE_WIDTH/2, newY-SPRITE_HEIGHT/2);
			if(sp.collidesWith(bg1, true))
				isCollision=true;
			sp.setPosition(sp.getRefPixelX()-SPRITE_WIDTH/2, oldY-SPRITE_HEIGHT/2);
			return isCollision;
		}
		
		 return isCollision;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -