You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

305 lines
5.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package model;
import java.util.TimerTask;
import java.util.Timer;
import util.Constant;
import view.GameCanvas;
import view.MyFrame;
/**
* 由 4 * 4 个方格Box构成一个块 控制块的移动、下落、变形等
*/
public class Block {
private GameCanvas gc;//画布
private Box[][] boxs = new Box[4][4];
// public static int[][] yinying=new int[4][4];
public int y, x;
public int style;
public int newH = 0;
public int newL = 0;
private static int st = 7;//默认属于初级
public boolean isAlive = false;//判断方块是否存活
public boolean pausing = false;//暂停为假
/**
* 设置方块数量
*/
public static void set_addl(int a) {
Block.st = a;
}
/**
* 获取方块数量
*/
public static int get_addl() {
return st;
}
/**
* 空构造函数
*/
public Block() {
}
/**
* 构造函数,产生一个特定的块
*
* @param style
* 块的样式对应STYLES的28个值中的一个
* @param y
* 起始位置左上角在canvas中的坐标行
* @param x
* 起始位置左上角在canvas中的坐标列
* @param level
* 游戏等级,控制块的下落速度
* @param canvas
* 画板
*/
public Block(int style, int y, int x, GameCanvas gc) {
this.style = style;
this.y = y;
this.x = x;
this.gc = gc;
// this.high=high;
int key = 0x8000;// 匹配器
// 获得一种方块
for (int i = 0; i < boxs.length; i++) {
for (int j = 0; j < boxs[i].length; j++) {
boolean isColor = ((style & key) != 0);
boxs[i][j] = new Box(isColor);
key >>= 1;
}
}
display();// 调用显示函数
}
/**
* 将当前块从画布的对应位置移除,要等到下次重画画布时才能反映出来
*/
public void earse() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (boxs[i][j].isColorBox()) {
Box box = gc.getBox(i + y, j + x);
if (box == null)
continue;
box.setColor(false);
}
}
}
}
/**
* 让当前块放置在画布的对应位置上,要等到下次重画画布时才能看见
*/
public void display() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (boxs[i][j].isColorBox()) {
Box box = gc.getBox(y + i, x + j);// 获得在游戏界面的位置
if (box == null)
continue;
else
box.setColor(true);
}
}
}
}
/**
* 左移方法
*/
public void moveLeft() {
newL = x - 1;
newH = y;
if (isMoveAble(newH, newL) && !pausing) {
earse();
x--;
display();
gc.repaint();
}
}
/**
* 右移方法
*/
public void moveRight() {
newL = x + 1;
newH = y;
if (isMoveAble(newH, newL) && !pausing) {
earse();
x++;
display();
gc.repaint();
}
}
/**
* 向下加速
*/
public void moveDown() {
newL = x;
newH = y + 1;
if (pausing == true)
return;
if (isMoveAble(newH, newL)) {
earse();
y++;
display();
gc.repaint();
} else {
isAlive = false;
// mytask.cancel();
}// 取消定时器任务
}
/**
* 瞬间到达底部
*/
public void quickDown() {
newL = x;
newH = y + 1;
while (isMoveAble(newH, newL)) {
earse();
y++;
display();
gc.repaint();
newL = x;
newH = y + 1;
}
isAlive = false;
}
/* *//**
* 阴影实现
*//*
public void yy() {
int yy = y;
newL = x;
newH = yy + 1;
while (isMoveAble(newH, newL)) {
earse();
yy++;
display();
newL = x;
newH = yy + 1;
}
earse();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (boxs[i][j].isColorBox() == true)
yinying[i][j]=yy+j;
}
}
}*/
/**
* 旋转功能的实现
*/
public void moveUp() {
earse();
if (pausing == true)
return;
if (isChangeAble()) {
// 获取下一形态
int key = 0x8000;
for (int a = 0; a < 4; a++) {
for (int b = 0; b < 4; b++) {
boolean isColor = ((this.style & key) != 0);
boxs[a][b].setColor(isColor);
key >>= 1;
}
}
display();
gc.repaint();
}
}
/**
*
* 判断是否可以移动 获取下个位置是否为空,或者已经是有颜色的
*/
public boolean isMoveAble(int newH, int newL) {
earse();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (boxs[i][j].isColorBox()) {
Box box = gc.getBox(newH + i, newL + j);
if (box == null || (box.isColorBox())) {
display();// 显示原先的位置
return false;
}
}
}
}
display();
return true;
}
/**
* 判断是否可以进行变形
*/
private boolean isChangeAble() {
int key = 0x8000;
int newStyle = 0;
earse();
for (int i = 0; i < st; i++) {
for (int j = 0; j < 4; j++) {
if (Constant.STYLES[i][j] == this.style) {
newStyle = Constant.STYLES[i][(j + 1) % 4];// 取得下一个状态
break;
}
// display();
}
}
// 判断此状态在游戏界面上显示是否有障碍
for (int a = 0; a < boxs.length; a++) {
for (int b = 0; b < boxs[a].length; b++) {
if ((newStyle & key) != 0) {
Box box = gc.getBox(y + a, x + b);
if (box == null || box.isColorBox()) {
// display();
return false;
}
}
key >>= 1;
}
}
this.style = newStyle;
return true;
}
/**
* 暂停
*/
public void pause() {
// TODO Auto-generated method stub
if (MyFrame.playing == true) {
pausing = true;
// isMoveAble(newH, newL);
gc.pau = true;
gc.repaint();
}
}
/**
* 继续
*/
public void jixu() {
if (MyFrame.playing == true) {
pausing = false;
gc.pau = false;
gc.repaint();
;
}
}
}