Решил сделать небольшую игру по типу аркадной рыбалки.
В чём суть игры: на данный момент есть три сцены: Хижина, Карта и Озеро.
1. Вы запускаете игру, и начинаете игру с хижины.
2. Нажимаете кнопку со стрелочкой, персонаж выходит из хижины, и стрелка сменяется на кнопку карты
3. Нажимаете на кнопку карты и переходите собственно на карту.
4. На карте, при помощи прозрачных label я реализовал перемещение между локациями, а именно: нажимаешь на рисунки на карте, и пиктограмма персонажа перемещается туда. Потом нажимаешь на кнопку со стрелочкой, и вот ты на той локации, где сейчас и находишься по карте. Кликаем озеро (рисунок глаза), и перемещаемся туда.
5. На озере, мы нажимаем кнопку с крючком, и появляется удочка, которой мы можем двигать клавишами "вправо" или "влево", и на данный момент, пока всё.
У меня всё было в порядке (за исключением того, что иногда label на карте не считывали щелчки мыши), до момента когда я достал удочку и понял что она не двигается по нажатию клавиш.
Полез за подсказкой в интернет, кое где прочитал про такое понятие как фокус в Java, и посоветовали добавить .setFocusable(true);. Проблему это не решило, и я решил проверить работает ли слушатель клавиш вообще с помощью системной строки. В итоге я увидел что следующее:
В сцене с хижиной: работает
На карте: работает
На озере: работает
На озере после того как достал удочку: не работает
На озере после того как убрал удочку: не работает
Обратно на карту с озера: работает
И вот не пойму почему так? Хотел побольше почитать про фокус, но внятной информации слишком мало. Возможно я как то некорректно задал все элементы, ведь для построения сцен, я использовал JLayeredPane.
Части исходного кода
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class MainWindow extends JFrame implements ActionListener, MouseListener, KeyListener {
int LocationIndex = 1;
boolean RodTake = false;
MainWindow() {
//Сцена с Хижиной
PaneShack.setVisible(true);
PaneShack.setBounds(0, 0, 1000, 800);
PaneShack.add(Shacklabel, Integer.valueOf(0));
PaneShack.add(CharacterLabel, Integer.valueOf(1));
PaneShack.add(buttonNext, Integer.valueOf(2));
PaneShack.add(buttonMap, Integer.valueOf(2));
//Сцена с Картой
PaneMap.setVisible(false);
PaneMap.setBounds(0, 0, 1000, 800);
PaneMap.add(MapLabel, Integer.valueOf(0));
PaneMap.add(BoatLabel, Integer.valueOf(1));
PaneMap.add(MapPointShack, Integer.valueOf(2));
PaneMap.add(MapCryLake, Integer.valueOf(2));
PaneMap.add(MapCity, Integer.valueOf(2));
PaneMap.add(buttonBack, Integer.valueOf(2));
//Сцена на Озере
PaneLake.setVisible(false);
PaneLake.setBounds(0, 0, 1000, 800);
PaneLake.add(LakeLabel, Integer.valueOf(0));
PaneLake.add(buttonHook, Integer.valueOf(2));
PaneLake.add(RodLabel, Integer.valueOf(2));
//Настройки Окна
this.setTitle("Рыбалка в Андере");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setLayout(null);
this.setSize(1000, 800);
this.setVisible(true);
this.addKeyListener(this);
this.setFocusable(true);
this.toFront();
this.add(TimeLabel);
this.add(PaneShack);
this.add(PaneMap);
this.add(PaneLake);
ImageIcon logo = new ImageIcon("src/Logo.png");
this.setIconImage(logo.getImage());
this.getContentPane().setBackground(new Color(0, 139, 139));
}
//Слушатель кнопок
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == buttonNext) ;
{
CharacterLabel.setVisible(true);
buttonNext.setVisible(false);
buttonMap.setVisible(true);
}
if (e.getSource() == buttonMap) {
PaneShack.setVisible(false);
PaneLake.setVisible(false);
PaneMap.setVisible(true);
}
if (e.getSource() == buttonBack) {
if (LocationIndex == 1) {
PaneShack.setVisible(true);
PaneLake.setVisible(false);
PaneMap.setVisible(false);
PaneShack.add(buttonMap, Integer.valueOf(2));
}
if (LocationIndex == 2) {
PaneShack.setVisible(false);
PaneLake.setVisible(true);
PaneMap.setVisible(false);
PaneLake.add(buttonMap, Integer.valueOf(2));
}
}
if (e.getSource() == buttonHook) {
if (!RodTake) {
RodLabel.setVisible(true);
RodTake = true;
RodLabel.setLocation(500, 400);
buttonMap.setVisible(false);
} else {
RodLabel.setVisible(false);
buttonMap.setVisible(true);
RodTake = false;
}
}
}
//Слушатель мыши
@Override
public void mouseClicked(MouseEvent e) {
if (e.getSource() == MapCryLake) {
BoatLabel.setBounds(800, 389, 40, 40);
LocationIndex = 2;
}
if (e.getSource() == MapCity) {
BoatLabel.setBounds(500, 180, 40, 40);
LocationIndex = 3;
}
if (e.getSource() == MapPointShack) {
BoatLabel.setBounds(254, 398, 40, 40);
LocationIndex = 1;
}
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getSource() == MapCryLake) {
BoatLabel.setBounds(800, 389, 40, 40);
LocationIndex = 2;
}
if (e.getSource() == MapCity) {
BoatLabel.setBounds(500, 180, 40, 40);
LocationIndex = 3;
}
if (e.getSource() == MapPointShack) {
BoatLabel.setBounds(254, 398, 40, 40);
LocationIndex = 1;
}
}
//Слушатель клавиш
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_RIGHT){
RodLabel.setLocation(RodLabel.getX()+5,RodLabel.getY());
System.out.println("R");
}
if (e.getKeyCode()==KeyEvent.VK_LEFT){
RodLabel.setLocation(RodLabel.getX()-5,RodLabel.getY());
System.out.println("L");
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode()==KeyEvent.VK_D){
RodLabel.setLocation(RodLabel.getX()+5,RodLabel.getY());
System.out.println("R");
}
if (e.getKeyCode()==KeyEvent.VK_A){
RodLabel.setLocation(RodLabel.getX()-5,RodLabel.getY());
System.out.println("L");
}
}
}