package com.jagie.j2me.game.ketris;
import javax.microedition.lcdui.*;
import java.util.Random;
/**
*
* <p>Title: </p>
* <p>Description: 该类为封装下坠物对象及其操作</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author: an unknown Japanese,Jagie
* @version 1.0
*/
public class KetrisBlock {
//各种砖块,1-7为活动砖块颜色,8为墙砖颜色
public static final int[] BRICK_COLORS = {
0x00FF0000, 0x0000FF00, 0x00FFFF00, 0x000000FF, 0x00FF00FF, 0x0000FFFF,
0x00C0DCC0, 0x00808080};
/**
* blockpattern的编码规则:blockpattern表示一个下坠物体的形状,一种下坠物的颜色是固定的。
* 对于一个下坠物,用一个三维数祖表示,第一维用rot表示(旋转值),第二维用x(也就是行),第三维用y表示(也就是列)。
* 所以 blockpattern1:田字及四种旋转形状
* blockpattern2:反L字及四种旋转形状
* blockpattern3:L字及四种旋转形状
* blockpattern4:1字及四种旋转形状
* ........................
*/
protected int blockpattern1[][][] = {
{
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
};
protected int blockpattern2[][][] = {
{
{
0, 0, 1, 0}
, {
0, 0, 1, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 0, 0}
, {
0, 1, 1, 1}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
0, 1, 0, 0}
, {
0, 1, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
1, 1, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 0, 0}
}
};
protected int blockpattern3[][][] = {
{
{
0, 1, 0, 0}
, {
0, 1, 0, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 1, 1}
, {
0, 1, 0, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 1, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 0, 1, 0}
, {
1, 1, 1, 0}
, {
0, 0, 0, 0}
}
};
protected int blockpattern4[][][] = {
{
{
0, 0, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 1, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 0, 0, 0}
, {
1, 1, 1, 1}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 1, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 0, 0, 0}
, {
1, 1, 1, 1}
, {
0, 0, 0, 0}
}
};
protected int blockpattern5[][][] = {
{
{
0, 0, 0, 0}
, {
1, 1, 0, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 1, 0}
, {
0, 1, 1, 0}
, {
0, 1, 0, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
1, 1, 0, 0}
, {
0, 1, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 1, 0}
, {
0, 1, 1, 0}
, {
0, 1, 0, 0}
, {
0, 0, 0, 0}
}
};
protected int blockpattern6[][][] = {
{
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
1, 1, 0, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 1, 0, 0}
, {
0, 1, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 0, 0, 0}
, {
0, 1, 1, 0}
, {
1, 1, 0, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 1, 0, 0}
, {
0, 1, 1, 0}
, {
0, 0, 1, 0}
, {
0, 0, 0, 0}
}
};
protected int blockpattern7[][][] = {
{
{
0, 0, 0, 0}
, {
1, 1, 1, 0}
, {
0, 1, 0, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 1, 0, 0}
, {
1, 1, 0, 0}
, {
0, 1, 0, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 1, 0, 0}
, {
1, 1, 1, 0}
, {
0, 0, 0, 0}
, {
0, 0, 0, 0}
}
, {
{
0, 1, 0, 0}
, {
0, 1, 1, 0}
, {
0, 1, 0, 0}
, {
0, 0, 0, 0}
}
};
private int blockpattern[][][]; /* 当前坠物形状,为以上定义的七个下坠物之一 */
private int blockNextpattern[][]; /* 下一个坠物形状,显示在游戏容器的右边 */
private int x; //blockpattern左上角x坐标,x=i表示左上角距离游戏容器左上角x轴上i个小砖块单位
private int y; //blockpattern左上角y坐标,y=i表示左上角距离游戏容器左上角y轴上i个小砖块单位
private int oldx; //x的旧值
private int oldy; //y的旧值
private int rot; //旋转值,0-3
private int oldrot; //旋转旧值
private int pattern; /* 组成当前坠物所用小砖块id(1-7),同时也表示一种下坠物形状 */
private int next; /* 组成下一个坠物所用小砖块id(1-7),同时也表示一种下坠物形状 */
private KetrisMap map;
protected Random rand;
/* 构造,保存map,初始化blockimage,rand,next */
public KetrisBlock(KetrisMap map) {
this.map = map;
rand = new Random();
next =Math.abs(rand.nextInt()) % 7 + 1;
}
/* 初始化 */
protected void init() {
pattern = next;
next = Math.abs(rand.nextInt()) % 7 + 1;
/* 得到当前下坠物 */
switch (pattern) {
case 1:
readPattern(blockpattern1);
break;
case 2:
readPattern(blockpattern2);
break;
case 3:
readPattern(blockpattern3);
break;
case 4:
readPattern(blockpattern4);
break;
case 5:
readPattern(blockpattern5);
break;
case 6:
readPattern(blockpattern6);
break;
case 7:
readPattern(blockpattern7);
break;
}
/* 得到下一个下坠物 */
switch (next) {
case 1:
readNextPattern(blockpattern1);
break;
case 2:
readNextPattern(blockpattern2);
break;
case 3:
readNextPattern(blockpattern3);
break;
case 4:
readNextPattern(blockpattern4);
break;
case 5:
readNextPattern(blockpattern5);
break;
case 6:
readNextPattern(blockpattern6);
break;
case 7:
readNextPattern(blockpattern7);
break;
}
x = 5; /* 游戏容器内径的一半 */
y = 0; /* y坐标 */
rot = 0;
//判断map数据,决定y的真正值,之所以这么处理,是因为当game over的时候,最后一个下坠物,可能只能画出一部分
//为了达到这个效果,必须让y成为一个恰当的负值
while (isCrashAtBegin()) {
y--;
if(y<-4){
break;
}
}
oldx = x;
oldy = y;
oldrot = rot;
}
/**
* 设置当前下坠物变量的内容
* @param nowblock int[][][] 7种下坠物常量之一
*/
private void readPattern(int[][][] nowblock) {
blockpattern = new int[4][4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
blockpattern[i][j][k] = nowblock[i][j][k];
}
}
}
}
/**
* 设置下一个下坠物变量的内容。只需要包存4中