📄 spritecanvas.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 + -