基于MIDP1.0的模仿Sprite类

原创 2004年12月30日 08:44:00

感觉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;
        }
    }
}
}

-----------------------------------------
飘飘何所似?天地一沙鸥。

Image类跟Sprite类有什么区别?

Image代表图片本身,只提供图片的数据和基本操作。 Spirte代表一个由多帧组成的闪花,只负责在帧数、位置上操作。传入Image后,Spirte把Image分成多帧操作。 Sprite属于MIDP...
  • sindw
  • sindw
  • 2017年07月30日 20:39
  • 193

Libgdx之Sprite 精灵类

已经介绍了这么多容器类来加载图片,下面出场的的是Sprite,也就是精灵类,这个可以说是集大成者,里面封装了更多的方法来操作纹理。 Sprite可以保存几何属性,大小(size, width, he...
  • zqiang_55
  • zqiang_55
  • 2016年04月03日 16:50
  • 1529

基于MIDP1.0实现动画效果

作者:mingjava   文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=48在SUN的技术文章里面有一篇文章讲述了如何基...
  • mobilechannel
  • mobilechannel
  • 2005年12月01日 13:02
  • 495

关于MIDP 1.0 图片翻转换色的讨论

最近工作有点空,所以想研究研究关于 MIDP1.0图片翻转的问题,可能有人会问 midp2 里不是有翻转函数码,但是我可以说国内绝大多数的公司都是使用1.0在开发,因为中国有太多用户使用的手机不支持2...
  • zengcity
  • zengcity
  • 2006年04月14日 17:32
  • 843

pygame经典sprite精灵类

import cStringIO, base64 import pygame from pygame.locals import * class Ball(pygame.sprite.Sprite)...
  • Jailman
  • Jailman
  • 2017年12月01日 10:26
  • 9538

Python游戏引擎开发(五):Sprite精灵类和鼠标事件

本次来实现Sprite类和鼠标事件。 说起这个Sprite啊,涉及过2D游戏研究领域的看官应该都听说过它。它中文原意是“精灵”,不过在不同人的眼中,它所表示的意义不同。比如说在cocos2d中,它可...
  • yorhomwang
  • yorhomwang
  • 2016年02月03日 21:14
  • 4509

基于MIDP1.0实现通信录

作者:mingjava  文章来源:http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=41项目简介      基于MIDP1.0实现的个...
  • mobilechannel
  • mobilechannel
  • 2005年12月01日 11:11
  • 709

sprite类

import pygame class myballclass(pygame.sprite.Sprite): def __init__(self, image_file, location):...
  • robinYunhao
  • robinYunhao
  • 2017年03月05日 15:38
  • 134

关于在cocos2dx中继承Sprite的分析与技巧

本文章特指使用C++作为编程语言,基于cocos2dx游戏引擎开发游戏。 在cocos2dx中,sprite作为精灵类是使用最为频繁的类,与其它类相比,如:Node, Layer或Scene,Sp...
  • guggy
  • guggy
  • 2014年05月12日 15:48
  • 2640

C语言中的类模拟

C语言中的类模拟(C++编程思想)                   在面向对象的语言里面,出现了类的概念。这是编程思想的一种进化。所谓类:是对特定数据的特定操作的集合体。所以说类包含了两个范畴:数...
  • fupozsl
  • fupozsl
  • 2007年09月10日 21:53
  • 3410
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于MIDP1.0的模仿Sprite类
举报原因:
原因补充:

(最多只允许输入30个字)