/**
为midp1.0写的sprite类的升级版本 * <p>title: 精灵类</p> * * <p>description: </p> * * <p>copyright: copyright (c) 2004</p> * * <p>company: </p> * * @author not attributable * @version 1.0 */import javax.microedition.lcdui.* ;public class mysprite { final public static int bycollidexy = 0 ; final public static int bycollidearea = 1 ; final public static int bycollideradius = 2 ; public image image; public int positionx; public int positiony; public int numframes; public int currentframe; public int[][] framesinfo;//本版本吧各个帧的尺寸存到数组中,而不是象1.0中等大 public boolean visible=true; public int dx; public int dy; public int collidex=0;//当两个角色交叉横向距离超过collidex时认为已经碰撞 public int collidey=0;//当两个角色交叉纵向距离超过collidey时认为已经碰撞 public int collidearea=0;//当两个角色互相入侵面积超过collidearea时认为已经碰撞(注意:这里的入侵面积!=交叉面积) public int collideradius=0;//碰撞半径 public int state=0;
public mysprite(image image,int numframes) throws exception { this.image = image; this.numframes = numframes; //set frameinfo framesinfo=new int[numframes][4]; for (int i=0;i<numframes;i++) { framesinfo[i][0]=i*image.getwidth()/numframes;//左上角x坐标 framesinfo[i][1]=0;//左上角y坐标 framesinfo[i][2]=image.getwidth()/numframes;//本帧宽度 framesinfo[i][3]=image.getheight();//本帧高度 } /////////////// this.currentframe=0; } public void draw(canvas thecanvas,graphics g) { if (visible) { g.setclip(positionx, positiony, framesinfo[currentframe][2], framesinfo[currentframe][3]); g.drawimage(image, positionx – framesinfo[currentframe][0], positiony-framesinfo[currentframe][1],0); g.setclip(0, 0, thecanvas.getwidth(), thecanvas.getheight()); } } public void step() { if (visible) { this.positionx += dx; this.positiony += dy; } } public boolean collideswith(mysprite sprite) { return this.collideswith(sprite,bycollidearea); } public boolean collideswith(mysprite sprite, int checktype) { if (! visible || ! sprite.visible) { return false; } if (checktype==bycollidearea) { //当两个角色互相入侵面积超过collidearea时认为已经碰撞(注意:这里的入侵面积!=交叉面积) int inx=sprite.positionx+sprite.framesinfo[sprite.currentframe][2]-this.positionx >this.positionx+this.framesinfo[currentframe][2]-sprite.positionx ?this.positionx+this.framesinfo[currentframe][2]-sprite.positionx :sprite.positionx+sprite.framesinfo[sprite.currentframe][2]-this.positionx ; int iny=sprite.positiony+sprite.framesinfo[sprite.currentframe][3]-this.positiony >this.positiony+this.framesinfo[currentframe][3]-sprite.positiony ?this.positiony+this.framesinfo[currentframe][3]-sprite.positiony :sprite.positiony+sprite.framesinfo[sprite.currentframe][3]-this.positiony ; if (inx>0 && iny>0 && inx*iny>this.collidearea+sprite.collidearea) { return true; } else { return false; } } else if (checktype==bycollidexy) { if (sprite.positionx+sprite.framesinfo[sprite.currentframe][2]-sprite.collidex>this.positionx+this.collidex && this.positionx+this.framesinfo[currentframe][2]-this.collidex>sprite.positionx+sprite.collidex && sprite.positiony+sprite.framesinfo[sprite.currentframe][3]-sprite.collidey>this.positiony+this.collidey && this.positiony+this.framesinfo[currentframe][3]-this.collidey>sprite.positiony+sprite.collidey) { return true; } else { return false; } } else //if (checktype==bycollideradius) { int inx=math.abs(this.positionx+this.framesinfo[currentframe][2]/2-sprite.positionx-(sprite.framesinfo[sprite.currentframe][2]+1)/2); int iny=math.abs(this.positiony+this.framesinfo[currentframe][3]/2-sprite.positiony-(sprite.framesinfo[sprite.currentframe][3]+1)/2); if (inx*inx+iny*iny<(collideradius+sprite.collideradius)*(sprite.collideradius+sprite.collideradius)) { return true; } else { return false; } } } public boolean collideswith(image image, int x, int y) { return this.collideswith(image, x, y,bycollidearea); }
public boolean collideswith(image image, int x, int y, int checktype) { if (! visible) { return false; }
if (checktype==bycollidearea) { //当两个角色互相入侵面积超过collidearea时认为已经碰撞(注意:这里的入侵面积!=交叉面积) int inx=x+image.getwidth()-this.positionx >this.positionx+this.framesinfo[currentframe][2]-x ?this.positionx+this.framesinfo[currentframe][2]-x :x+image.getwidth()-this.positionx ; int iny=y+image.getheight()-this.positiony >this.positiony+this.framesinfo[currentframe][3]-y ?this.positiony+this.framesinfo[currentframe][3]-y :y+image.getheight()-this.positiony ; if (inx>0 && iny>0 && inx*iny>this.collidearea) { return true; } else { return false; } } else if (checktype==bycollidexy) { if (x+image.getwidth()>this.positionx && this.positionx+this.framesinfo[currentframe][2]-this.collidex>x && y+image.getheight()>this.positiony && this.positiony+this.framesinfo[currentframe][3]-this.collidey>y) { return true; } else { return false; } } else //if (checktype==bycollideradius) { int inx=math.abs(this.positionx+this.framesinfo[currentframe][2]/2-x-(image.getwidth()+1)/2); int iny=math.abs(this.positiony+this.framesinfo[currentframe][3]/2-y-(image.getheight()+1)/2); if (inx*inx+iny*iny<collideradius*collideradius) { return true; } else { return false; } } }}
