【Java开源代码栏目提醒】:网学会员在Java开源代码频道为大家收集整理了Water_Canvas.java提供大家参考,希望对大家有所帮助!
package ch07;
import java.util.Random;
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class Water_Canvas
extends GameCanvas
implements Runnable, CommandListener {
//代表程序是否运行的状态
boolean running;
//存储构成背景的各图像帧
Image img;
//代表背景
TiledLayer tlg;
//水动画播放序列
int fw[] = {
6, 7, 8};
//当前图像帧索引
int mySequenceIndex = 0;
//代表水动态背景索引
int myAnimatedTileIndex;
//屏幕宽度
int win_width = getWidth();
//屏幕高度
int win_height = getHeight();
//每帧草图像的宽高
int img_grass_size = 16;
//绘制上下文
Graphics g = getGraphics();
//主MIDlet类实例
Water_MIDlet wm;
/*
3.构造器
*/
public Water_Canvas(Water_MIDlet wm) {
super(true);
this.wm = wm;
Command exitCommand = new Command("退出", Command.EXIT, 0);
addCommand(exitCommand);
setCommandListener(this);
try {
img = Image.createImage("/icons/background/field.png");
}
catch (IOException e) {
System.out.println(e.getMessage());
}
// 计算横向需要多少图片
int backcols = win_width / img_grass_size + 1;
// 计算纵向需要多少图片
int backrows = win_height / img_grass_size + 1;
//铺草地
tlg = new TiledLayer(backcols, backrows, img, img_grass_size,
img_grass_size);
Random r = new Random();
for (int i = 0; i < backcols * backrows; i++) {
int n = (r.nextInt() >>> 1) % 5 + 1;
tlg.setCell(i % backcols, i / backcols, n);
}
//铺水区域
myAnimatedTileIndex = tlg.createAnimatedTile(6);
//铺外上水区域
for (int i = 0; i < backcols; i++) {
tlg.setCell(i, 0, myAnimatedTileIndex);
}
//铺外下水区域
for (int i = 0; i < backcols; i++) {
tlg.setCell(i, backrows - 2, myAnimatedTileIndex);
tlg.setCell(i, backrows - 1, myAnimatedTileIndex);
}
//铺外左水区域
for (int i = 0; i < backrows; i++) {
tlg.setCell(0, i, myAnimatedTileIndex);
}
//铺外右水区域
for (int i = 0; i < backrows; i++) {
tlg.setCell(backcols - 2, i, myAnimatedTileIndex);
tlg.setCell(backcols - 1, i, myAnimatedTileIndex);
}
//铺内上水区域
for (int i = 2; i < backcols - 3; i++) {
tlg.setCell(i, 2, myAnimatedTileIndex);
}
//铺内下水区域
for (int i = 3; i < backcols - 3; i++) {
tlg.setCell(i, backrows - 4, myAnimatedTileIndex);
}
//铺内左水区域
for (int i = 2; i < backrows - 3; i++) {
tlg.setCell(2, i, myAnimatedTileIndex);
}
//铺内右水区域
for (int i = 3; i < backrows - 3; i++) {
tlg.setCell(backcols - 4, i, myAnimatedTileIndex);
}
//铺栅栏
//铺上栅栏
for (int i = 3; i < backcols - 4; i++) {
tlg.setCell(i, 3, 9);
}
//铺下栅栏
for (int i = 3; i < backcols - 4; i++) {
tlg.setCell(i, backrows - 5, 9);
}
//铺左栅栏
for (int i = 3; i < backrows - 4; i++) {
tlg.setCell(3, i, 9);
}
//铺右栅栏
for (int i = 3; i < backrows - 4; i++) {
tlg.setCell(backcols - 5, i, 9);
}
start();
}
/*
4.启动线程
*/
public void start() {
running = true;
Thread t = new Thread(this);
t.start();
}
/*
5.控制进程
*/
public void run() {
long st = 0, et = 0, diff = 0;
//控制每秒帧数,即动画快慢
int rate = 250;
while (running) {
st = System.currentTimeMillis();
render(g);
et = System.currentTimeMillis();
//避免刷新过快,暂停线程至要求帧数
diff = et - st;
if (diff < rate) {
try {
Thread.sleep(rate - diff);
}
catch (InterruptedException ex) {
stop();
}
}
}
}
/*
6.实现绘制
*/
private void render(Graphics g) {
//绘制背景
g.setColor(0x000000);
g.fillRect(0, 0, win_width, win_height);
tlg.paint(g);
mySequenceIndex++;
mySequenceIndex %= 3;
tlg.setAnimatedTile(myAnimatedTileIndex, fw[mySequenceIndex]);
tlg.paint(g);
flushGraphics();
}
/*
7.结束线程
*/
public void stop() {
running = false;
}
/*
8.响应按钮事件
*/
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
wm.quitApp();
}
}
}
上一篇:
WaterPanel.java
下一篇:
关于大学英语教学