使用MIDP2.0开发游戏 (2) 使用Sprite

转载 2004年08月29日 18:29:00

Sprite,精灵,顾名思义,专用来代表游戏中的动画角色,比如飞机,坦克等等。在MIDP1.0中,我们必须自己写专门的类来实现Sprite,幸运的是,MIDP2.0为Sprite提供了强力支持,可以创建静态,动态,不透明和透明的Sprite,下面我们准备在上次的GameCanvas基础上添加一个Sprite并让它动起来。

Sprite的主要构造方法有:

Sprite(Image):构造一个单幅图案的Sprite;

Sprite(Image, int width, int height):构造一个动画Sprite,图片将按照指定大小被分为N个Frame,通过setFrame(int index)就可以让Sprite动起来。我们用了一个有透明背景的png图片创建坦克的Sprite:

注意这个图是放大的JPG格式,你需要用Photoshop之类的软件处理成有透明背景的png格式,大小为64x16

我们在Eclipse中建立如下工程和目录:

以下是画出Sprite的TankGameCanvas.java

package tank.midp.core;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class TankGameCanvas extends GameCanvas implements Runnable {
    // 控制方向:
    private static int INDEX_OF_UP = 0;
    private static int INDEX_OF_DOWN = 1;
    private static int INDEX_OF_LEFT = 3;
    private static int INDEX_OF_RIGHT = 2;

    private boolean isPlay; // Game Loop runs when isPlay is true
    private long delay; // To give thread consistency
    private int currentX, currentY; // To hold current position of the 'X'
    private int width; // To hold screen width
    private int height; // To hold screen height

    private Sprite spriteTank; // our sprite!

    // Constructor and initialization
    public TankGameCanvas() {
        super(true);
        width = getWidth();
        height = getHeight();
        currentX = width / 2;
        currentY = height / 2;
        delay = 20;
        // init sprite:
        try {
            Image image = Image.createImage("/res/img/player1.png"); // 注意路径
            spriteTank = new Sprite(image, 16, 16); // 大小是16x16
        }
        catch(Exception e) { e.printStackTrace(); }
    }

    // Automatically start thread for game loop
    public void start() {
        isPlay = true;
        new Thread(this).start();
    }

    public void stop() { isPlay = false; }

    // Main Game Loop
    public void run() {
        Graphics g = getGraphics();
        while (isPlay) {
            input();
            drawScreen(g);
            try {
                Thread.sleep(delay);
            }
            catch (InterruptedException ie) {}
        }
    }

    // Method to Handle User Inputs
    private void input() {
        int keyStates = getKeyStates();
        // Left
        if ((keyStates & LEFT_PRESSED) != 0) {
            currentX = Math.max(0, currentX - 1);
            spriteTank.setFrame(INDEX_OF_LEFT);
        }
        // Right
        if ((keyStates & RIGHT_PRESSED) !=0 ) {
            if ( currentX + 5 < width)
                currentX = Math.min(width, currentX + 1);
            spriteTank.setFrame(INDEX_OF_RIGHT);
        }
        // Up
        if ((keyStates & UP_PRESSED) != 0) {
            currentY = Math.max(0, currentY - 1);
            spriteTank.setFrame(INDEX_OF_UP);
        }
        // Down
        if ((keyStates & DOWN_PRESSED) !=0) {
            if ( currentY + 10 < height)
                currentY = Math.min(height, currentY + 1);
            spriteTank.setFrame(INDEX_OF_DOWN);
        }
    }
    // Method to Display Graphics
    private void drawScreen(Graphics g) {
        g.setColor(0); // black
        g.fillRect(0, 0, getWidth(), getHeight());

        // 画一个Sprite非常简单:
        spriteTank.setPosition(currentX, currentY);
        spriteTank.paint(g);

        flushGraphics();
    }
}

运行后的画面如下,可以用上下左右控制坦克:

需要注意的几点:MIDP的class需要preverify以后才能运行,因此可执行的class在verified目录下而不是bin目录,运行前还需要把整个res目录copy到verified/classes下。如果你改动代码后重新编译,verified目录会被先清空,只剩下classes,每次都要手动copy这个res目录很不爽,我们准备下次编写一个ant脚本让它自动完成所有工作。

:~

初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比

转载▼ 标签:  ios7   apple   iphone   sprite   kit   ...
  • yongyinmg
  • yongyinmg
  • 2014年03月05日 10:42
  • 1303

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

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

ios游戏开发 Sprite Kit教程:初学者 1

注:本文译自Sprite Kit Tutorial for Beginners 目录 Sprite Kit的优点和缺点Sprite Kit vs Cocos2D-iPhone ...
  • sqc3375177
  • sqc3375177
  • 2013年10月13日 14:38
  • 7805

人生如梦游戏间,RPG游戏开源开发讲座(JAVA篇)[2]——踏破红尘

“本鹏”上回书言道,Java 游戏中地图的构建是一件极其简单的事情,本次书接前文,探讨游戏中角色的移动问题。  众所周知,[角色]是一个游戏的灵魂所在,没有角色的游戏,就是没有灵魂的游戏。  那么...
  • w00w12l
  • w00w12l
  • 2013年06月20日 21:01
  • 990

cocos2d-x游戏开发系列教程-超级玛丽09-怪物激活与移动

在游戏中,很多怪物本身是会移动的,这里主要有蘑菇怪,乌龟等。
  • yincheng01
  • yincheng01
  • 2014年02月14日 15:53
  • 2891

图片精灵sprite动画插件

好久好久没有写博客了,最近写了俩个小插件,这是其中一个。 我想大家在玩游戏的时候会看到人物走动,这些不管在3d还是2d游戏都会有这些动画,这些动画都有一个小单元一个小单元拼凑吹来的,这个小单元就是精...
  • ccj1990528
  • ccj1990528
  • 2016年08月29日 12:05
  • 657

《Unity3d脚本编程 使用C#语言开发跨平台游戏》读书笔记1

1.4脚本编程的优势 ·易于学习,代码维护方便,适合快速开发 ·开发成本低(因易于学习,所以可以启用新人,同时开发速度快,这些都是降低成本的方法) 2.2.1以速度作为衡量语言级...
  • AKA009
  • AKA009
  • 2017年04月24日 12:58
  • 1841

【ugui的坑】实现可拖拽的Sprite

最近由于个人项目的需要,必须去做一个可以被拖拽的Sprite出来。这里涉及到的两个问题。 1.Sprite应该可以响应点击事件,拖拽事件等。 2.如何从屏幕坐标系转换为世界坐标系。关于问题1,解决...
  • j13015252122
  • j13015252122
  • 2015年08月23日 23:36
  • 977

Sprite Kit编程指南(2)-使用精灵

使用精灵 精灵是用于创建大部分场景内容的基本构建块,所以在转到其他Sprite Kit节点类之前先了解精灵是有用的。精灵用SKSpriteNode对象表现。一个SKSpriteNode对象,要么...
  • yu0089
  • yu0089
  • 2014年01月20日 17:34
  • 1846

怎样去开发一款游戏

最近有许多人问我怎样去开发一款游戏,网上并没有关于这个话题的文章,我就决定写一些东西来分享一下我的经验,关于游戏开发的整个过程。记住这只是一个概要,并且会因项目的不同而改变。 步骤一.选择你...
  • qp120291570
  • qp120291570
  • 2013年04月17日 12:15
  • 2534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: 使用MIDP2.0开发游戏 (2) 使用Sprite
举报原因:
原因补充:

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