感觉MIDP2中的Sprite类很好用,而目前开发手机程序还是MIDP1为主流,所以做此类,用起来还是比较方便的,呵呵 该类处于改进中,请关注本站最新版本 -------------------------- package theman;
/** * <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 { private Image image; private int positionX; private int positionY; private int frameWidth; private int frameHeight; private int numFrames; private int currentFrame; 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 MySprite(Image image, int frameWidth, int frameHeight, int numFrames) throws Exception { this.image = image; this.frameWidth = frameWidth; this.frameHeight = frameHeight; this.numFrames = numFrames; this.currentFrame=0; } public int getX() { return this.positionX; } public void setX(int positionX) { this.positionX = positionX; } public int getY() { return this.positionY; } public int getFrameWidth() { return this.frameWidth; } public int getFrameHeight() { return this.frameHeight; } public void setY(int positionY) { this.positionY = positionY; } public void setCurrentFrame(int current) { this.currentFrame = current; } public void draw(Graphics g,MainCanvas theCanvas) { if (visible) { g.clipRect(getX(), getY(), frameWidth, frameHeight); g.drawImage(image, getX() - currentFrame * frameWidth, getY(), g.TOP | g.LEFT); g.setClip(0, 0, theCanvas.getWidth(), theCanvas.getHeight()); } } public void step() { this.positionX+=DX; this.positionY+=DY; } public boolean collidesWith(MySprite sprite) { return this.collidesWith(sprite,false); } public boolean collidesWith(MySprite sprite, boolean CheckType) { if (! visible || ! sprite.visible) { return false; } if (CheckType) { //当两个角色互相入侵面积超过collideArea时认为已经碰撞(注意:这里的入侵面积!=交叉面积) int inX=sprite.getX()+sprite.frameWidth-this.getX() >this.getX()+this.frameWidth-sprite.getX() ?this.getX()+this.frameWidth-sprite.getX() :sprite.getX()+sprite.frameWidth-this.getX() ; int inY=sprite.getY()+sprite.frameHeight-this.getY() >this.getY()+this.frameHeight-sprite.getY() ?this.getY()+this.frameHeight-sprite.getY() :sprite.getY()+sprite.frameHeight-this.getY() ; if (inX>0 && inY>0 && inX*inY>this.collideArea+sprite.collideArea) { return true; } else { return false; } } else { if (sprite.getX()+sprite.frameWidth-sprite.collideX>this.getX() && this.getX()+this.frameWidth-this.collideX>sprite.getX() && sprite.getY()+sprite.frameHeight-sprite.collideY>this.getY() && this.getY()+this.frameHeight-this.collideY>sprite.getY()) { return true; } else { return false; } } } public boolean collidesWith(Image image, int x, int y) { return this.collidesWith(image, x, y,false); }
public boolean collidesWith(Image image, int x, int y, boolean CheckType) { if (! visible) { return false; }
if (CheckType) { //当两个角色互相入侵面积超过collideArea时认为已经碰撞(注意:这里的入侵面积!=交叉面积) int inX=x+image.getWidth()-this.getX() >this.getX()+this.frameWidth-x ?this.getX()+this.frameWidth-x :x+image.getWidth()-this.getX() ; int inY=y+image.getHeight()-this.getY() >this.getY()+this.frameHeight-y ?this.getY()+this.frameHeight-y :y+image.getHeight()-this.getY() ; if (inX>0 && inY>0 && inX*inY>this.collideArea) { return true; } else { return false; } } else { if (x+image.getWidth()>this.getX() && this.getX()+this.frameWidth-this.collideX>x && y+image.getHeight()>this.getY() && this.getY()+this.frameHeight-this.collideY>y) { return true; } else { return false; } } } }
----------------------------------------- |
飘飘何所似?天地一沙鸥。 | 
|