📄 russiacanvas.java
字号:
import javax.microedition.lcdui.*;
public class RussiaCanvas extends KeyCanvas implements MicroKeyListener, Runnable {
//
private RussiaMIDlet midlet;
private Board board;
private int boardX;
private int boardY;
private int width;
private int height;
private int cell = 12;
private int blackGroundColor = 0x00000000; //背景颜色
private int boardRimColor = 0x00ffffff; //边框颜色
private int blockColor = 0x0000ffff; //方块颜色
private Thread gameThread = null;
private boolean pause = false;
private boolean dead = true;
private int delay = 300;
public RussiaCanvas(RussiaMIDlet midlet) {
this.midlet = midlet;
int bw = getWidth()/cell - 4;
int bh = getHeight()/cell - 2;
board = new Board(bw, bh); //创建游戏区域
//计算游戏区域的大小和位置,以像素为单位
width = bw*cell+2;
height = bh*cell+2;
boardX = (getWidth()-width)/2;
boardY = (getHeight()-height)/2;
setMicroKeyListener(this);
}
//绘制游戏界面
protected void paint(Graphics g) {
//绘制背景
g.setColor(blackGroundColor);
g.fillRect(0, 0, getWidth(), getHeight());
//绘制边框
g.setColor(boardRimColor);
g.drawRect(boardX, boardY, width, height);
//绘制背景方块
g.setColor(blockColor);
int w = width/cell;
int h = height/cell;
g.translate(boardX+2, boardY+2);
for(int i=0; i<w; i++) {
for(int j=0; j<h; j++) {
if(board.getValue(i, j) != 0) {
g.fillRect(i*cell, j*cell, cell-1, cell-1);
}
}
}
if(!dead) {
//绘制当前操作的方块图形
int[] block = board.getCurrentBlock();
int x = 0;
int y = 0;
for(int i=0; i<block.length; i++) {
x = board.getX(block[i]);
y = board.getY(block[i]);
g.fillRect(x*cell, y*cell, cell-1, cell-1);
}
if(pause) {
showInfo(g, "游戏暂停!!");
}
}
else {
midlet.setStartMenu();
showInfo(g, "开始新游戏!");
}
}
private void showInfo(Graphics g, String info) {
g.setColor(128, 255, 255);
int ww = width-4*cell;
int hh = ww/2;
int xx = (width-ww)/2;
int yy = (height-hh)/2;
g.fillRect(xx, yy, ww, hh);
g.setColor(0x00FF0000);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE));
g.drawString(info, width/2, height/2, Graphics.HCENTER|Graphics.BASELINE);
}
//键盘事件处理方法,如果持续按键,该方法将重复被调用
public void microKeyRepeated(int keyCode) {
microKeyPressed(keyCode);
}
////键盘事件处理方法,如果按下键,该方法将被调用
public void microKeyPressed(int keyCode) {
int gameAction = getGameAction(keyCode);
synchronized(board)
{
if(gameAction == Canvas.DOWN) {
board.down();
}
else if(gameAction == Canvas.LEFT) {
board.left();
}
else if(gameAction == Canvas.RIGHT) {
board.right();
}
else if(gameAction == Canvas.FIRE || gameAction == Canvas.UP) {
board.circumrotate();
}
repaint();
}
}
public void microKeyReleased(int keyCode) {
//
}
//开始游戏
public void start() {
if(board.gameOver()) {
dead = false;
board.init();
}
if(gameThread == null || !gameThread.isAlive()) {
gameThread = new Thread(this);
gameThread.start();
}
synchronized(this) {
pause = false;
notifyAll();
}
}
//暂停游戏
public void pause() {
synchronized(this) {
pause = true;
}
repaint();
}
//游戏线程执行体
public void run() {
while(!dead) {
try {
synchronized(this) {
while(pause) {
wait();
}
}
while(!dead && !pause) {
synchronized(board) {
board.down();
board.clear();
if(board.gameOver()) {
dead = true;
}
repaint();
}
Thread.sleep(delay);
}
}
catch(InterruptedException ie) {
//
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -