Коллеги, привет.
Эта задача совсем не поддаётся мне.
При запуске программы выдаёт ошибку:
Exception in thread "Thread-0" java.lang.UnsupportedOperationException: TRANSLUCENT translucency is not supported.
at java.desktop/java.awt.Window.setOpacity(Window.java:3661)
at java.desktop/java.awt.Frame.setOpacity(Frame.java:965)
at com.javarush.task.task23.task2312.KeyboardObserver.run(KeyboardObserver.java:28)
Это нормально, что выдаётся такая ошибка и программа продолжает работать? Не обращать внимание на эту ошибку?
Я так понимаю, что проблема в задании значения:
frame.setOpacity(0.0f);
Я задавал разные значения, но проблема не решалась.
Также метод print() вызывается и работает "какбы в бесконечном цикле". Т. е. я например пытаюсь вывести точки, но они выводятся непрерывно и я не могу построить например прямоугольник согласно заданию, т. к. точки выводятся беспрерывно.
Можете помочь разобраться мне с ошибкой и с "непрерывным выводом точек"? Пока не понимаю, что вообще происходит.
package com.javarush.task.task23.task2312;
import java.awt.event.KeyEvent;
public class Room {
private int width;
private int height;
private Snake snake;
private Mouse mouse;
public static Room game;
public Room(int width, int height, Snake snake) {
this.width = width;
this.height = height;
this.snake = snake;
game = this;
}
public Snake getSnake() {
return snake;
}
public Mouse getMouse() {
return mouse;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setSnake(Snake snake) {
this.snake = snake;
}
public void setMouse(Mouse mouse) {
this.mouse = mouse;
}
/**
* Основной цикл программы.
* Тут происходят все важные действия
*/
public void run() throws InterruptedException {
//Создаем объект "наблюдатель за клавиатурой" и стартуем его.
KeyboardObserver keyboardObserver = new KeyboardObserver();
keyboardObserver.start();
//пока змея жива
while (snake.isAlive()) {
//"наблюдатель" содержит события о нажатии клавиш?
if (keyboardObserver.hasKeyEvents()) {
KeyEvent event = keyboardObserver.getEventFromTop();
//Если равно символу 'q' - выйти из игры.
if (event.getKeyChar() == 'q') return;
//Если "стрелка влево" - сдвинуть фигурку влево
if (event.getKeyCode() == KeyEvent.VK_LEFT)
snake.setDirection(SnakeDirection.LEFT);
//Если "стрелка вправо" - сдвинуть фигурку вправо
else if (event.getKeyCode() == KeyEvent.VK_RIGHT)
snake.setDirection(SnakeDirection.RIGHT);
//Если "стрелка вверх" - сдвинуть фигурку вверх
else if (event.getKeyCode() == KeyEvent.VK_UP)
snake.setDirection(SnakeDirection.UP);
//Если "стрелка вниз" - сдвинуть фигурку вниз
else if (event.getKeyCode() == KeyEvent.VK_DOWN)
snake.setDirection(SnakeDirection.DOWN);
}
snake.move(); //двигаем змею
print(); //отображаем текущее состояние игры
sleep(); //пауза между ходами
}
System.out.println("Game Over!");
}
public void print() {
int[][] matrix = new int[height][width];
// System.out.print(matrix[0].length + " ");
// System.out.print("D" + matrix[].length);
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
matrix[i][j] = 46;
System.out.print((char)matrix[i][j]);
}
if (i == height - 1) {
System.out.println('\n');
}
}
// System.out.print(".");
//Создаем массив, куда будем "рисовать" текущее состояние игры
//Рисуем все кусочки змеи
//Рисуем мышь
//Выводим все это на экран
}
public void eatMouse() {
createMouse();
}
public void createMouse() {
int x = (int) (Math.random() * width);
int y = (int) (Math.random() * height);
mouse = new Mouse(x, y);
}
public static void main(String[] args) throws InterruptedException {
game = new Room(40, 20, new Snake(10, 10));
game.snake.setDirection(SnakeDirection.DOWN);
game.createMouse();
game.run();
}
public void sleep() throws InterruptedException {
int time = 500;
int sectionsSize = getSnake().getSections().size();
if (sectionsSize == 1) {
Thread.sleep(time);
}
if (sectionsSize > 1 && sectionsSize <= 11) {
time = time - 20 * (sectionsSize - 1);
} else if (sectionsSize > 11 && sectionsSize <= 15) {
time = 300 - (25 * (sectionsSize - 11));
} else {
time = 200;
}
Thread.sleep(time);
// делаем паузу, длинна которой зависит от длинны змеи
}
}