/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package lession22;
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.midlet.*;
/**
*
* javax.microedition.lcdui.game:J2ME提供的加强游戏性能的包
* GameCanvas:游戏画布,比普通画布更加适合游戏开发
* Layer:图层,表示在游戏画面上可移动的物体,抽象类
* LayerManager:图层管理器,管理图层的变换
* Sprite:精灵,表示游戏中的各种角色,比如子弹,汽车等。
* TitedLayer:布局层,充当环境角色,如地图。
* GameCanvas基本测试
*
* GameCanvas是游戏画布
*
* @author mouyong
*/
public class GameCanvasMidlet1 extends MIDlet {
MyGameCanvas mygame = new MyGameCanvas();
Display dis = Display.getDisplay(this);
public void startApp() {
dis.setCurrent(mygame);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
//GameCanvas可以不用重写paint(),也就意味着不重绘整个画面
class MyGameCanvas extends GameCanvas implements Runnable {
//获得画笔
private Graphics gra = this.getGraphics();
//精灵
private Sprite sprite;
//旋转的状态,用于每一秒钟旋转一次图片
private int state = Sprite.TRANS_NONE;
//由于GameCanvas沒有默认构造方法,所以得写一个构造方法来完成构造
public MyGameCanvas() {
//这里的true,表示只让与游戏有关的键可以使用。
super(true);
/******************************精灵*******************************/
try {
//精灵
sprite = new Sprite(Image.createImage("/lession22/iboy.gif"));
} catch (IOException ex) {
ex.printStackTrace();
}
/******************************旋转和悬挂点**********************/
//定义悬挂点(0,0)注意,这个坐标是图片本身的坐标
sprite.defineReferencePixel(0, 0);
//将悬挂点绑定到屏幕上的一个位置(100,100),注意,这个坐标是屏幕坐标
sprite.setRefPixelPosition(100, 100);
new Thread(this).start();
}
public void run() {
//new一个随机数,以便绘制随机线条
Random rand = new Random();
while (true) {
/**********************************游戏画布************************************/
//构造函数传了true,表示可以通过getKeyStates()来查询键的状态
//这样,我们就可以直接在线程中对按键进行判断
//System.out.println(getKeyStates());
//写法:getKeyStates()==GameCanvas.XXXXXX_PRESSED表示某键被按下
// if (this.getKeyStates() == GameCanvas.LEFT_PRESSED) {
// System.out.println("左键被按下");
// }
// try {
// Thread.currentThread().sleep(1000);
// } catch (InterruptedException ex) {
// ex.printStackTrace();
// }
//
// //使用getGraphics()获得画笔,直接重绘
// //this.getGraphics().drawRect(10, 20, 100, 100);
//
//
//
// gra.drawLine(rand.nextInt(), rand.nextInt(), rand.nextInt(), rand.nextInt());
// //画笔第一次直接画在屏幕上,但之后都是画在缓冲中,所以需要刷新缓冲
// this.flushGraphics();
/******************************精灵*******************************/
// try {
// //局部刷新,将原来的图片清除
// gra.setColor(255, 255, 255);
// gra.fillRect(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());
//
// //移动精灵:x每次移动1个像素,y每次移动0个像素
// sprite.move(1, 0);
// //将图片画到画布上
// sprite.paint(gra);
// //需要刷新缓冲
//
// this.flushGraphics();
//
// Thread.sleep(100);
// } catch (Exception e) {
// e.printStackTrace();
// }
/******************************旋转和悬挂点**********************/
//让图片旋转
switch (state) {
case Sprite.TRANS_NONE:
state = Sprite.TRANS_ROT90;
break;
case Sprite.TRANS_ROT90:
state = Sprite.TRANS_ROT180;
break;
case Sprite.TRANS_ROT180:
state = Sprite.TRANS_ROT270;
break;
case Sprite.TRANS_ROT270:
state = Sprite.TRANS_NONE;
break;
}
//局部刷新,将原来的图片清除
gra.setColor(255, 255, 255);
gra.fillRect(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());
sprite.setTransform(state);
sprite.paint(gra);
this.flushGraphics();
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}