學習JAVA的程序中,試著寫一個俄羅斯方塊。創建了一個goDown的方法控制方塊向下移動,通過新建執行緒的sleep實作固定時間下移一次,當按鍵監聽到鍵盤按下s鍵時,也會執行一次goDown方法。
goDown方法中呼叫了一個clearLine的方法,就是判斷某行全部方塊都有的時候,該行閃爍數次后消失(閃爍是通過洗掉此行、重繪、執行緒休眠100毫秒,再添加此行、重繪、執行緒休眠100毫秒,回圈數次來實作 )
這里就出現了一點問題,如果這個goDown方法是新建執行緒呼叫的,那閃爍效果可以實作,沒有任何問題。但如果goDown方法是通過按s鍵呼叫的,那會運行在EDT上,導致在這個goDown執行完之前,都不會進行重繪,閃爍效果就無法實作,如果我要保留按鍵也能呼叫goDown的話有沒有辦法解決這個問題呢?代碼我也一并放上:
@Override
public void keyTyped(KeyEvent e) {
if(e.getKeyChar() == 'w') {
}
if(e.getKeyChar() == 's') {
if(!isOver) {
goDown();
}
}
if(e.getKeyChar() == 'd') {
goRight();
}
if(e.getKeyChar() == 'a') {
goLeft();
}
if(isOver) {
if(!isScoreBoard) {
isScoreBoard = true;
showScoreBoard();
}
else {
isScoreBoard = false;
newGame();
}
}
}
// 按鍵監聽器
@Override
public void keyPressed(KeyEvent e) {
}
// 釋放監聽器
@Override
public void keyReleased(KeyEvent e) {
}
public void runDownThread() {
Thread t = new Thread() {
public void run() {
while(!isOver) {
goDown();
repaint();
try {
Thread.sleep(2000/speed);
} catch (InterruptedException e) {}
}
}
};
t.start();
}
public void goLeft() {
boolean isAbleToGoLeft = true;
for(Coords cubeCoords : tetriminos) {
if(cubeCoords.getX() <= cs || landedCubes.contains(new Coords(cubeCoords.getX() - cs, cubeCoords.getY()))) {
isAbleToGoLeft = false;
}
}
if(isAbleToGoLeft) {
for(int i = 0; i < tetriminos.size(); i++) {
tetriminos.get(i).changeX(-cs);
if(landedCubes.contains(new Coords(tetriminos.get(i).getX(), tetriminos.get(i).getY() + cs))
|| tetriminos.get(i).getY() >= fieldHeight) {
isLanded = true;
}else {
isLanded = false;
}
//tetriminos.get(i).print();
}
}
repaint();
}
public void goRight() {
boolean isAbleToGoRight = true;
for(Coords cubeCoords : tetriminos) {
if(cubeCoords.getX() >= fieldWidth || landedCubes.contains(new Coords(cubeCoords.getX() + cs, cubeCoords.getY()))) {
isAbleToGoRight = false;
}
}
if(isAbleToGoRight) {
for(int i = 0; i < tetriminos.size(); i++) {
tetriminos.get(i).changeX(cs);
if(landedCubes.contains(new Coords(tetriminos.get(i).getX(), tetriminos.get(i).getY() + cs))
|| tetriminos.get(i).getY() >= fieldHeight) {
isLanded = true;
}else {
isLanded = false;
}
//tetriminos.get(i).print();
}
}
repaint();
}
public void clearLine() {
tetriminos.clear();
for(int i = 0; i < 5; i++) {
for(int yCoord : clearedLineYCoordsList) {
landedCubes.removeAll(lineCoordsMap.get(yCoord));
}
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
for(int yCoord : clearedLineYCoordsList) {
landedCubes.addAll(lineCoordsMap.get(yCoord));
}
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
}
for(int yCoord : clearedLineYCoordsList) {
landedCubes.removeAll(lineCoordsMap.get(yCoord));
}
for(Coords cubeCoords : landedCubes) {
int aboveLinesCount = 0;
for(int yCoord : clearedLineYCoordsList ) {
if(cubeCoords.getY() < yCoord) {
aboveLinesCount++;
}
}
cubeCoords.changeY(cs * aboveLinesCount);
}
repaint();
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
}
public void goDown() {
if(isLanded) {
landedCubes.addAll(tetriminos);
for(Coords cubeCoords : tetriminos) {
if(landedCubes.containsAll(lineCoordsMap.get(cubeCoords.getY()))) {
clearedLineYCoordsList.add(cubeCoords.getY());
}
}
if(!clearedLineYCoordsList.isEmpty()) {
clearLine();
clearedLineYCoordsList.clear();
}
getNewTetriminos();
isLanded = false;
for(Coords cubeCoords : tetriminos) {
if(landedCubes.contains(new Coords(cubeCoords.getX(), cubeCoords.getY()))) {
isOver = true;
}
if(landedCubes.contains(new Coords(cubeCoords.getX(), cubeCoords.getY() + cs))) {
isLanded = true;
}
}
repaint();
return;
}
for(int i = 0; i < tetriminos.size(); i++) {
tetriminos.get(i).changeY(cs);
}
for(Coords cubeCoords : tetriminos) {
if(cubeCoords.getY() == fieldHeight || landedCubes.contains(new Coords(cubeCoords.getX(), cubeCoords.getY() + cs))) {
isLanded = true;
}
}
repaint();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/269000.html
標籤:Java相關
上一篇:第一個帖子
