Witam, piszę prostą gierkę w Javie i niestety zaciąłem się w kluczowym momencie. Mam zbudowane ładne menu i chciałbym przejść nieco dalej, tzn, przejść do kolejnego menu a następnie zacząć rozgrywkę. Niestety, moje menu nie chce reagować na moje prośby :) Tak to w tej chwili wygląda:
SpaceMission.java
//package + importy
public class SpaceMission extends Canvas implements ActionListener {
public static final int GAMEWIDTH = 800;
public static final int GAMEHEIGHT = 600;
public static long usedTime; //do FPS
private long startTime; //do FPS
private static final String rsrcsrootpath = "src" + File.separator + "spacemission" + File.separator;
public static final String imagespath = rsrcsrootpath + "images" + File.separator;
public static final String soundspath = rsrcsrootpath + "sounds" + File.separator;
public static final String otherspath = rsrcsrootpath + "others" + File.separator;
private void InitSpaceMission() {
//tworzenie okna i ustawienie jego właściwości
//utworzenie widoku poczatkowego - menu startowego
String[] startMenuButtonsNames = {"newgame", "options", "exit"};
Menu startMenu = new Menu(startMenuButtonsNames);
startMenu.addActionListener(this);
//wyswietlenie menu i okna
}
public void actionPerformed(ActionEvent e) {
System.out.println("Zmieniam opcje gry");
}
public static void main(String[] args) {
final SpaceMission NewGame = new SpaceMission();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
NewGame.InitSpaceMission();
}
});
usedTime = 1000;
while (true) {
NewGame.repaint();
}
}
}
Menu.java
//package + importy
public class Menu extends JPanel implements ActionListener {
protected ActionListener actionListener = null;
private Sprites sprites = new Sprites();
private SoundSprites soundsprites = new SoundSprites();
private String buttonspath = SpaceMission.imagespath + "buttons" + File.separator;
private Font DefaultGameFont;
private AudioStream ButtonSound;
public Menu(String[] buttonNamesArray) {
//konstruowanie pojedyńczego menu
//m.in
IButton[] buttonsArray = new IButton[buttonNamesArray.length];
for (int i=0; i<buttonNamesArray.length; ++i) {
buttonsArray[i] = new IButton(imagesArray[i][0], imagesArray[i][1], buttonNamesArray[i]);
buttonsArray[i].addActionListener(this);
} //gdzie IButton to obiekt dziedziczący po JButton, ustawiający na wstępie parę opcji dot. wyglądu
}
//wyswietlenie przycisków
public void paintComponent(Graphics g) {
//rysowanie logo i innych obrazków
}
//poniżej obsluga przycisków menu
public void actionPerformed(ActionEvent e) {
//odtwórz dźwięk
if (e.getActionCommand().equals("newgame")) {
System.out.println("Zacznij rozgrywkę");
}
if (e.getActionCommand().equals("next")) {
System.out.println("Idz dalej");
}
if (e.getActionCommand().equals("options")) {
System.out.println("Zmień opcje gry");
ActionEvent ev = new ActionEvent(e.paramString(), 0, "OptionsMenu");
}
if (e.getActionCommand().equals("exit")) {
System.exit(0);
}
}
protected void addActionListener(ActionListener l) {
actionListener = AWTEventMulticaster.add(actionListener, l);
}
protected void removeActionListener(ActionListener l) {
actionListener = AWTEventMulticaster.remove(actionListener, l);
}
}
Nasłuchiwanie zdarzeń wewnątrz klasy działa doskonale. Ładnie wyświetla mi w terminalu "Zmień opcje gry", następnie powinno wysłać zdarzenie do klasy głównej, która w odpowiedzi na to powinna wyświetlić "Zmieniam opcje gry". Ale to jednak nie następuje. Może to być wina tej dziwnej implementacji addActionListener jaką znalazłem gdzieś w odmętach internetu? Pomocy, bo termin goni niemiłosiernie. :(