【Java开源代码栏目提醒】:网学会员Java开源代码为您提供View_Canvas.java参考,解决您在View_Canvas.java学习中工作中的难题,参考学习。
package ch09;
import java.util.Random;
import java.io.IOException;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
public class View_Canvas
extends GameCanvas
implements Runnable, CommandListener {
//代表程序是否运行的状态
boolean running;
//存储构成羊动画的各图像帧
Image sheep_img;
//存储构成背景的各图像帧
Image grass_img, fence_img;
//代表羊群动画的精灵对象
Sprite sp[];
//动画播放序列
int fs[][] = {
{
0, 1, 2, 3, 4}
, {
5, 6, 7, 8, 9}
, {
10, 11, 12, 13, 14}
};
//代表草地背景
TiledLayer tlg;
//代表栅栏背景
TiledLayer tlf;
//屏幕宽度
int win_width = getWidth();
//屏幕高度
int win_height = getHeight();
//每帧羊图像的宽高
int img_sheep_size = 15;
//每帧草图像的宽高
int img_grass_size = 16;
//每帧栅栏图像的宽高
int img_fence_size = 16;
//代表可视窗体移动方向,0、1分别代表左、右
int dir = 1;
//代表可视窗体的x坐标
int x = 0;
//代表可视窗体的移动跨度
int span = 5;
//代表背景是屏幕宽度的倍数。
int num = 2;
//背景行、列数
int backcols, backrows;
//绘制上下文
Graphics g = getGraphics();
//产生随机数
Random r = new Random();
//层管理器
LayerManager lm = new LayerManager();
//主MIDlet类实例
View_MIDlet vm;
/*
3.构造器
*/
public View_Canvas(View_MIDlet vm) {
super(true);
this.vm = vm;
Command exitCommand = new Command("退出", Command.EXIT, 0);
addCommand(exitCommand);
setCommandListener(this);
try {
sheep_img = Image.createImage("/icons/background/sheep.png");
grass_img = Image.createImage("/icons/background/grass.png");
fence_img = Image.createImage("/icons/background/fence.png");
}
catch (IOException e) {
System.out.println(e.getMessage());
}
// 计算横向需要多少图片
backcols = win_width / img_grass_size * num;
// 计算纵向需要多少图片
backrows = win_height / img_grass_size + 1;
//铺草地
tlg = new TiledLayer(backcols, backrows, grass_img, img_grass_size,
img_grass_size);
for (int i = 0; i < backcols * backrows; i++) {
int n = (r.nextInt() >>> 1) % 5 + 1;
tlg.setCell(i % backcols, i / backcols, n);
}
//铺栅栏
tlf = new TiledLayer(backcols, backrows, fence_img, img_fence_size,
img_fence_size);
//铺外上栅栏
for (int i = 0; i < backcols; i++) {
tlf.setCell(i, 0, 1);
}
//铺外下栅栏
for (int i = 0; i < backcols; i++) {
tlf.setCell(i, backrows - 2, 1);
tlf.setCell(i, backrows - 1, 1);
}
//铺外左栅栏
for (int i = 0; i < backrows; i++) {
tlf.setCell(0, i, 1);
}
//铺外右栅栏
for (int i = 0; i < backrows; i++) {
tlf.setCell(backcols - 1, i, 1);
}
//初始化羊群
sp = new Sprite[backrows * backcols];
for (int i = 0; i < backrows; i++) {
sp[i] = new Sprite(sheep_img, img_sheep_size, img_sheep_size);
lm.append(sp[i]);
sp[i].setFrameSequence(fs[ (r.nextInt() >>> 1) % 3]);
sp[i].setFrame(0);
sp[i].setPosition( (r.nextInt() >>> 1) % (backcols - 2) * img_grass_size,
(r.nextInt() >>> 1) % (backrows - 2) * img_grass_size);
}
//初始化层管理
lm.append(tlf);
lm.append(tlg);
lm.setViewWindow(0, 0, win_width, win_height);
lm.paint(g, 0, 0);
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);
for (int i = 0; i < backrows; i++) {
sp[i].nextFrame();
}
switch (dir) {
case 0:
if (x < span) {
x = 0;
dir = 1;
}
else {
x = x - span;
}
break;
case 1:
if (x > backcols / 2 * img_grass_size - span * 2) {
x = backcols / 2 * img_grass_size - span * 2;
dir = 0;
}
else {
x = x + span;
}
break;
}
lm.setViewWindow(x, 0, win_width, win_height);
lm.paint(g, 0, 0); //坐标相对于绘制上下文原点
flushGraphics();
}
/*
7.结束线程
*/
public void stop() {
running = false;
}
/*
8.响应按钮事件
*/
public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
vm.quitApp();
}
}
}
上一篇:
ViewUtils.java
下一篇:
关于大学英语教学