⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mygamecanvas.java

📁 在j2me手机游戏中可以动态生成游戏中所需要的地图 值得研究一下
💻 JAVA
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.media.*;
import java.io.*;

public class MyGameCanvas extends GameCanvas implements Runnable {
    boolean running;                 // 根据thread显示有无loop处理的flag
    final static int GRID_SIZE = 32; // 一个tiled的尺寸
    TiledLayer map;                  // map用Layer
    LayerManager layerManager;       // LayerManager
    int width;                       // Canvas的宽度
    int height;                      // Canvas的高度
    int heroX = 1;                   // 在中央显示map坐标(x)
    int heroY = 2;                   // 在中央显示map坐标(y)
    Image mapImage;                  // TiledLayer使用的map image
    Sprite hero;                     // 主人公的sprite
    int heroFrame = 0;               // 主人公的sprite的index
    int floor;                       // floor号码
    long gameStartTime;              // 游戏开始的时刻
    Player player;                   // 播放声音用Player
    int mapW;                        // map的横向尺寸
    int mapH;                        // map的纵向尺寸
    
    /**
     * MyGameCanvas的constructor
     */
    public MyGameCanvas() throws Exception {
        super(true);
        
        // 取得canvas的尺寸
        width  = getWidth();
        height = getHeight();

        mapImage  = Image.createImage("/map.png");  // tiled用image

        Image heroImage = Image.createImage("/hero.png"); // 主人公image
        hero = new Sprite(heroImage, GRID_SIZE, GRID_SIZE);

        // 从WAV文件取得InputStream
        InputStream in = getClass().getResourceAsStream("footstep.wav");
            
        // 生成Player对象
        player = Manager.createPlayer(in, "audio/x-wav");

        //layerManager
        layerManager = new LayerManager();
        layerManager.append(hero);

        // 设定map的初始size
        mapW = 11;
        mapH = 11;
        
        // 设定map
        resetMap(mapW, mapH);
        
        // 设定floor号码为1
        floor = 1;
        
        // thread的开始
        running = true;
        Thread t = new Thread(this);
        t.start();
        
        // 记录游戏开始时刻
        gameStartTime = System.currentTimeMillis();
    }

    /**
     * 重新设定map
     */
    private void resetMap(int width, int height) {
        // 生成TiledLayer
        map = new TiledLayer(width, height, mapImage, GRID_SIZE, GRID_SIZE);

        // 取得map信息
        int[][] mapData = MapGenerator.getMap(width, height);

        // 在TiledLayer中设定map信息
        for (int y = 0; y < mapData.length; y++) {
            for (int x = 0; x < mapData[y].length; x++) {
                map.setCell(x, y, mapData[y][x]);
            }
        }
        
        // 在layerManager中添加map
        layerManager.append(map);
    }
    
    /**
     * thread的执行
     */
    public void run() {
        Graphics g = getGraphics();

        while (running) {
            long startTime = System.currentTimeMillis();
            tick();
            keyEvent(getKeyStates());
            draw(g);

            long endTime = System.currentTimeMillis();
            int duration = (int)(endTime - startTime);
            if(duration < 200) {
                try {
                    Thread.sleep(200 - duration); 
                }
                catch (InterruptedException e) {
                    stop();
                }
            }
        }
    }
    
    /**
     * 根据按键状态切换处理
     */
    private void keyEvent(int keyStates) {
        // 保存目前的坐标值
        int preX = heroX;
        int preY = heroY;

        if      ((LEFT_PRESSED  & keyStates) != 0 ) { heroX--; } // 向左移动
        else if ((RIGHT_PRESSED & keyStates) != 0 ) { heroX++; } // 向右移动
        else if ((UP_PRESSED    & keyStates) != 0 ) { heroY--; } // 向上移动
        else if ((DOWN_PRESSED  & keyStates) != 0 ) { heroY++; } // 向下移动

        // 遇到障碍物(岩石或洞穴)则返回移动前的位置
        int cellType = map.getCell(heroX, heroY);
        if ( cellType == 4 || cellType == 5) {
            heroX = preX;
            heroY = preY;
        } 
        
        // 设定坐标值
        hero.setPosition(heroX * GRID_SIZE,heroY * GRID_SIZE);

        // 遇到上升台阶则移动到上面一层
        if( cellType == 7 ) {
            upFloor();
        } 
    }

    /**
     * 上台阶
     */
    private void upFloor() {
        // 描绘的更新
        Graphics g = getGraphics();
        draw(g);
        
        // 播放上台阶的声音        
        try {
            player.start();
            Thread.sleep(1000); 
        } catch(Exception e) {}

        // 在画面中显示下面的层数
        floor++;
        g.setColor(0, 0, 0);
        g.fillRect(0, 0, width, height);
        Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE);
        g.setColor(255, 255, 255);
        g.drawRect(50, 100, width - 100, height - 200);
        g.setFont(font);
        g.drawString("[ " + floor + "F ]", width/2, 135, g.BOTTOM|g.HCENTER);
        flushGraphics();
        
        // 只有1秒待机
        try {
            Thread.sleep(1000); 
        } catch(Exception e) {}

        // 从layerManager中消除目前的map
        layerManager.remove(map);
        
        // 只增大2map尺寸
        if(mapW < 25) {
            mapW += 2;
            mapH += 2;
        }
        
        // 更新map
        resetMap(mapW, mapH);
        
        // 重新设定主人公坐标值
        heroX = 1;
        heroY = 1;
    }
    
    /**
     * 每经过一定时间的处理
     */
    private void tick() {
        // 更新主人公的sprite的index
        heroFrame = (heroFrame + 1) % 2;
        hero.setFrame(heroFrame);
    }

    /**
     * 描绘的更新
     */
    private void draw(Graphics g) {
        // 指定描绘区域
        layerManager.setViewWindow(
            heroX * GRID_SIZE - (width - GRID_SIZE) / 2,
            heroY * GRID_SIZE - (height - 40 - GRID_SIZE) / 2,
            width, height - 40);

        // map的描绘
        g.setColor(0, 0, 0);
        g.fillRect(0, 0, width, height);
        layerManager.paint(g,0,0);
        
        // status的描绘
        g.setColor(255,255,255);
        g.fillRect(0, height - 40, width, 40);
        g.setColor(0, 0, 0);
        int gameTime = (int)(System.currentTimeMillis() - gameStartTime ) / 1000;
        g.drawString("" + floor + "F  : " + mapW + "x" + mapH, width/2, height - 20, g.BOTTOM|g.HCENTER);
        g.drawString("" + gameTime + "sec", width/2, height - 5, g.BOTTOM|g.HCENTER);

        // 描绘的更新
        flushGraphics();
    }
    
    /**
     * thread的停止
     */
    public void stop() {
        running = false;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -