国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用MIDP2.0開發(fā)游戲(2)使用Sprite

2019-11-17 06:27:34
字體:
供稿:網(wǎng)友

SPRite,精靈,顧名思義,專用來代表游戲中的動(dòng)畫角色,比如飛機(jī),坦克等等。在MIDP1.0中,我們必須自己寫專門的類來實(shí)現(xiàn)Sprite,幸運(yùn)的是,MIDP2.0為Sprite提供了強(qiáng)力支持,可以創(chuàng)建靜態(tài),動(dòng)態(tài),不透明和透明的Sprite,下面我們預(yù)備在上次的GameCanvas基礎(chǔ)上添加一個(gè)Sprite并讓它動(dòng)起來。

Sprite的主要構(gòu)造方法有:

Sprite(Image):構(gòu)造一個(gè)單幅圖案的Sprite;

Sprite(Image, int width, int height):構(gòu)造一個(gè)動(dòng)畫Sprite,圖片將按照指定大小被分為N個(gè)Frame,通過setFrame(int index)就可以讓Sprite動(dòng)起來。我們用了一個(gè)有透明背景的png圖片創(chuàng)建坦克的Sprite:

使用MIDP2.0開發(fā)游戲(2)使用Sprite(圖一)

(注重這個(gè)圖是放大的JPG格式,你需要用photoshop之類的軟件處理成有透明背景的png格式,大小為64x16)

我們?cè)贓clipse中建立如下工程和目錄:

使用MIDP2.0開發(fā)游戲(2)使用Sprite(圖二)

以下是畫出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());

        // 畫一個(gè)Sprite非常簡單:
        spriteTank.setPosition(currentX, currentY);
        spriteTank.paint(g);

        flushGraphics();
    }
}



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 塘沽区| 武鸣县| 河曲县| 安平县| 自治县| 肃南| 乃东县| 新津县| 剑川县| 临沭县| 平乡县| 顺平县| 梁平县| 会同县| 盐山县| 定日县| 龙南县| 青州市| 游戏| 邵武市| 大方县| 西昌市| 阿尔山市| 内乡县| 荆门市| 威海市| 广汉市| 井冈山市| 民县| 包头市| 吉木萨尔县| 娄底市| 将乐县| 乌兰浩特市| 沽源县| 肃宁县| 西乌珠穆沁旗| 云南省| 全南县| 辽阳县| 浪卡子县|