📄 maincanvas.java
字号:
package com.j2medev.chapter3;
import java.io.IOException;
import javax.microedition.lcdui.*;
class MainCanvas extends Canvas implements Runnable{
private Image bg = null;//背景图片
private Image img = null;//原始精灵图片
private Image[][] sprite = new Image[4][3];//代表精灵序列
//坐标变换的x,y
private int tx = 0;
private int ty = 0;
//精灵运行的方向
private boolean leftPressed = false;
private boolean rightPressed = false;
private boolean upPressed = false;
private boolean downPressed = false;
//dir和seq共同确定当前显示哪个精灵,dir代表行,seq代表列
private int dir = 2;
private int seq = 0;
public static final int DISTANCE = 4;
public MainCanvas(){
try{
bg = Image.createImage("/forest08.png");
img = Image.createImage("/people.png");
Image tmp = null;
//将people.png分割生成sprite精灵数组
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
tmp = Image.createImage(24,32);
Graphics g = tmp.getGraphics();
g.translate(-24*j,-32*i);
g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP);
sprite[i][j]=Image.createImage(tmp);
}
}
img = null;//释放img对象
new Thread(this).start();
}catch(IOException ex){
ex.printStackTrace();
}
}
//通过线程和按键标记实现连续按键的效果
public void run(){
while(true){
if(leftPressed){
left();
}else if(rightPressed){
right();
}else if(upPressed){
up();
}else if(downPressed){
down();
}
try{
Thread.sleep(100);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public void left(){
tx+=DISTANCE;
repaint();
}
public void right(){
tx-=DISTANCE;
repaint();
}
public void up(){
ty+=DISTANCE;
repaint();
}
public void down(){
ty-=DISTANCE;
repaint();
}
public void paint(Graphics g){
//清除前一屏幕
int color = g.getColor();
g.setColor(0xFF0FFF);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(color);
// g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP);
for(int i = 0;i<4;i++){
for(int j=0;j<3;j++){
g.drawImage(sprite[i][j],24*j,32*i,Graphics.LEFT|Graphics.TOP);
}
}
//变化坐标,绘制背景图片
g.translate(tx,ty);
g.drawImage(bg,getWidth()/2,getHeight()/2,Graphics.HCENTER|Graphics.VCENTER);
g.translate(-tx,-ty);
//更换精灵序列,总在同一位置绘画精灵,运动的是背景而不是精灵
seq = ++seq%3;
g.drawImage(sprite[dir][seq],getWidth()/2,getHeight()/2,Graphics.HCENTER|Graphics.VCENTER);
}
public void keyPressed(int keyCode){
int action = getGameAction(keyCode);
//根据按键的方向判断应该使用哪个方向的精灵,与sprite数组对应
switch(action){
case DOWN:
downPressed = true;
dir = 2;
break;
case UP:
upPressed = true;
dir = 0;
break;
case LEFT:{
leftPressed = true;
dir = 3;
break;
}case RIGHT:{
rightPressed = true;
dir = 1;
break;
}
default:
break;
}
repaint();
}
public void keyReleased(int keyCode){
int action = getGameAction(keyCode);
switch(action){
case DOWN:
downPressed = false;
break;
case UP:
upPressed = false;
break;
case LEFT:{
leftPressed = false;
break;
}case RIGHT:{
rightPressed = false;
break;
}
default:
break;
}
repaint();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -