📄 rdgamecanvas.java
字号:
package phone.mediaSound.game.tetris;
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.lcdui.game.LayerManager;
import javax.microedition.lcdui.game.Sprite;
import javax.microedition.lcdui.game.TiledLayer;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class RDGameCanvas extends GameCanvas implements Runnable {
/**
* @author Hou Liang Wei
* @deprecated
* @see time 2009-04-20-22:00
*/
private NewLayerManager lyManager = new NewLayerManager();
private TiledLayer RDTiledLayer;// 背景图层
private Picture tempSpriteArray = new Picture();
private Sprite RDSprite;
private Image image;// 边框的图像
private int picChangeState, picChangeNum;
private int arrayX, arrayY;
private int score = 0;// 计分
private Graphics g;
private int currentX = 0;// 当前图像的横坐标位置
private int currentY = 0;// 当前图像的纵坐标位置
private int[][] RDSpriteArray;
private int[][] TLMap;
private int[] isRow = new int[16];
private Random rand = new Random(System.currentTimeMillis());
public RDGameCanvas() {
super(true);
g = this.getGraphics();
}
public void equalzaro() {
picChangeNum = picChangeState = arrayY = arrayX = currentY = currentX = 0;
}
public void run() {
init();
while (true) {
keyPressed();
RDSprite.setPosition(currentX, currentY++);
arrayY = currentX / 10;
arrayX = currentY / 10;
if (isHit()) {
if (currentY <= RDSprite.getHeight()) {
break;
} else {
clearBoard();
changeTiledLayer();
equalzaro();
randSprite();
}
}
clearScreen();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
// TiledLayer初始化,及添加层管理面板
public void init() {
try {
image = Image.createImage("/phone/mediaSound/game/tetris/pictures/0.png");
} catch (IOException e) {
e.printStackTrace();
}
RDTiledLayer = new TiledLayer(12, 16, image, 10, 10);
TLMap = new int[][] { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 16; j++) {
RDTiledLayer.setCell(i, j, TLMap[j][i]);// *********************************
}
}
randSprite();
lyManager.append(RDSprite);
lyManager.append(RDTiledLayer);
}
// 处理用户按键
private void keyPressed() {
if ((this.getKeyStates() == this.UP_PRESSED)) {
picChangeState++;
picChangeState %= 4;
changePic(picChangeNum, picChangeState);
if ((isHit() == true) & (picChangeState > 0)) {
picChangeState--;
picChangeState %= 4;
changePic(picChangeNum, picChangeState);
}
}
if ((this.getKeyStates() == this.LEFT_PRESSED)) {
if (currentX > 10) {
currentX = currentX - 10;
RDSprite.setPosition(currentX, currentY);
}
}
if ((this.getKeyStates() == this.RIGHT_PRESSED)) {
if (currentX < RDTiledLayer.getWidth() - RDSprite.getWidth() - 10) {
currentX = currentX + 10;
RDSprite.setPosition(currentX, currentY);
}
}
if ((this.getKeyStates() == this.DOWN_PRESSED)) {
if (currentY < RDTiledLayer.getHeight() - RDSprite.getHeight() - 10) {
currentY = currentY + 10;
RDSprite.setPosition(currentX, currentY);
}
}
}
// 产生随机图像
private void randSprite() {
int picNum = Math.abs(rand.nextInt()) % 7;
int picState = Math.abs(rand.nextInt())
% 4;
picChangeState = picState;
picChangeNum = picNum;
String picName = "/phone/mediaSound/game/tetris/pictures/" + String.valueOf(picNum + 1)
+ ".png";
try {
image = Image.createImage(picName);
} catch (IOException e) {
e.printStackTrace();
}
RDSprite = new Sprite(image);
currentX = RDTiledLayer.getWidth() / 2;
currentY = RDSprite.getHeight();
RDSprite.setPosition(currentX, currentY);
RDSprite.defineReferencePixel(RDSprite.getWidth() / 2, 0);
lyManager.append(RDSprite);
changePic(picNum, picState);
}
public void start() {
Thread t = new Thread(this);
t.start();
}
public void writeArray(int[][] writearray) {
for (int i = 0; i < writearray.length; i++) {
for (int j = 0; j < writearray[i].length; j++) {
System.out.print(" " + writearray[i][j]);
}
System.out.println();
}
}
private void writeArray(int[] writearray) {
for (int i = 0; i < writearray.length; i++) {
System.out.print(" " + writearray[i]);
}
System.out.println();
}
// 判断下落图像是否跟屏幕中的任何一个图像相遇
public boolean isHit() {
if (RDSprite.collidesWith(RDTiledLayer, true) == true) {
return true;
}
return false;
}
// 改变图像形状
public void changePic(int picChangeNum, int picChangeState) {
if (picChangeState == 0) {
RDSprite.setTransform(RDSprite.TRANS_NONE);
}
if (picChangeState == 1) {
RDSprite.setTransform(RDSprite.TRANS_ROT270);
}
if (picChangeState == 2) {
RDSprite.setTransform(RDSprite.TRANS_ROT180);
}
if (picChangeState == 3) {
RDSprite.setTransform(RDSprite.TRANS_ROT90);
}
RDSpriteArray = tempSpriteArray.getSpriteArray(picChangeNum * 4
+ picChangeState);// *************************
// writeArray(RDSpriteArray);
}
//
public void clearScreen() {
g.setColor(255, 255, 255);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
lyManager.paint(g, 10, 10);
this.flushGraphics();
}
// 图像从上往下落的时候,当落到最底层的时,或者遇到其它图像的时候,图像停止下落并且成为背景图像的一部分
private void changeTiledLayer() {
for (int i = 0; i < RDSpriteArray.length; i++) {
if (arrayX + i < 16) {
for (int j = 0; j < RDSpriteArray[i].length; j++) {
if ((arrayY + j < 12) && (RDSpriteArray[i][j] == 1)) {
TLMap[arrayX + i][arrayY + j] = RDSpriteArray[i][j] + 1;
}
}
}
}
listTLMap();
isROW();
removeD();
lyManager.remove(RDSprite);
}
// 图像下落的时候,背景图像的改变
public void listTLMap() {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 16; j++) {
RDTiledLayer.setCell(i, j, TLMap[j][i]);// ***************************
}
}
}
public void isROW() {
int i, j;
isRow[0] = isRow[15];
for (j = 1; j < 15; j++) {
for (i = 1; i < 11; i++) {
if (TLMap[j][i] == 2) {
if (i >= 10)
isRow[j] = 1;
continue;
} else {
isRow[j] = 0;
break;
}
}
}
}
// 某一行已经完全被填满,这一行消失,并且加分
public void removeD() {
int j = 0;
for (int i = 0; i < isRow.length - 1; i++) {
if (isRow[i] == 1) {
changeArray(i);
listTLMap();
j++;
}
}
score += j / 2 * 10;
}
// 改变数组的值,将数组的后一个元素的值,赋值为前一个元素
public void changeArray(int i) {
int j;
for (j = i; j > 1; j--) {
TLMap[j] = TLMap[j - 1];
}
TLMap[1] = new int[] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
score += 10;
System.out.println("你现在的得分是: " + score);
}
// 图层的管理器
class NewLayerManager extends LayerManager {
public NewLayerManager() {
super();
}
public void paint(Graphics g, int i, int j) {
super.paint(g, i, j);
g.setColor(255, 0, 0);
g.drawString("得分:" + String.valueOf(score),
RDTiledLayer.getWidth() + 10, 10, Graphics.LEFT
| Graphics.TOP);
}
}
private void clearBoard() {
for (int j = 0; j < 12; j++) {
TLMap[0][j] = 1;
TLMap[15][j] = 1;
}
for (int i = 0; i < 16; i++) {
TLMap[i][0] = 1;
TLMap[i][11] = 1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -