[pisanie gier] dodawanie etapow (kolejnych ekranow)

0

witam,
mam pytanie dotyczace pisania gier, chcialbym zrobic zeby po zaladowaniu gry wyswietlilo mi sie menu w ktorym moge sobie wybrac jakies tam opcje w stylu nowa gra, napisalem klasy (glowna zawierajaca JFrame, klase menu i klase etap odpowiadajaca za wszystkie zdazenia z gry), jednak kiedy dodam KeyListener do klasy menu to w klasie etap juz nie moge z niego korzystac. Prawdopodobnie musze jakos usunac obiekt klasy menu po rozpoczeciu gry, ale nie wiem za bardzo jak i tu moje pytanie czy jest na to jakis efektywny sposob?

klasa glowna

 
import javax.swing.JFrame;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;

public class SpaceRocks{
    
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static final int SPEED = 10;
    public JFrame ramka;
    
    public SpaceRocks(){
        ramka = new JFrame("Space Rocks");
        
        ramka.setBounds(0, 0, WIDTH, HEIGHT);
        ramka.setVisible(true);
        ramka.addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent e){
                System.exit(0);
            }
        });
        ramka.setResizable(false);
    }
    
    public static void main(String[] args){
        SpaceRocks gra = new SpaceRocks();
        menu Menu = new menu (gra);
        
    }
    
}

klasa menu


import java.awt.Canvas;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Graphics;

public class menu extends Canvas implements KeyListener{
    
    private SpaceRocks program;
    
    public menu(SpaceRocks program) {
        
        this.program = program;
        JPanel panel = (JPanel)program.ramka.getContentPane();
        
        setBounds(0,0,WIDTH,HEIGHT);
        panel.setPreferredSize(new Dimension(WIDTH,HEIGHT));
        panel.setLayout(null);
        panel.add(this);
        requestFocus();
        addKeyListener(this);
        
        
        
    }
    
    public void keyPressed(KeyEvent e) {
        switch (e.getKeyCode()) {
            case KeyEvent.VK_SPACE:removeKeyListener(this);etap pierwszy = new etap(program); break;
        }
    }
    
    public void keyReleased(KeyEvent e) {

    }
    
    public void keyTyped(KeyEvent e) {}
}

klasa etap

import java.awt.Canvas;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.Dimension;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JPanel;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.Rectangle;

public class etap extends Canvas implements KeyListener{
    
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static final int SPEED = 10;
    
    private int iledodac;
    private BufferStrategy strategy;
    private SpriteCache obrazki;
    private ArrayList postacie;
    private gracz gracz1;
    private int gameover;
    SpaceRocks program;
    
    public void keyPressed(KeyEvent e) {
        gracz1.wcisniety(e);
    }
    
    public void keyReleased(KeyEvent e) {
        gracz1.puszczony(e);
    }
    
    public void keyTyped(KeyEvent e) {}
    
    public void tworzswiat(){
        postacie = new ArrayList();
        iledodac = 1;
    }
    
    public etap(SpaceRocks program) {
        this.program = program;
        
        obrazki = new SpriteCache();
        JPanel panel = (JPanel)program.ramka.getContentPane();
        
        setBounds(0,0,WIDTH,HEIGHT);
        panel.setPreferredSize(new Dimension(WIDTH,HEIGHT));
        panel.setLayout(null);
        panel.add(this);
        
        
        createBufferStrategy(2);
        strategy = getBufferStrategy();
        requestFocus();
        gracz1 = new gracz(this);
        gameover = 0;
        addKeyListener(this);
        gameloop();

    }
    
    public void setgameover() {
        gameover = 1;
    }
    
    
    public void gameloop(){
        int z = 0;
        tworzswiat();
        while (isVisible() && gameover != 1){
            odswiez();
            sprawdzzderzenia();
            rysuj();
            if (z % 100 == 0)
                dodajprzeciwnika();
            z++;
            try {
                Thread.sleep(SPEED);
            } catch (InterruptedException e) {}
        }
        menu Menu = new menu(program);
    }
    
    
}


0

Do usuwania listenerów służy funkcja removeKeyListener. Powinieneś utworzyć w głównym nowy obiekt w Twoim przypadku Cansas. np.

Cansas menu = new Cansas();

i potem dodać do ramki:
ramka.addKeyListener(menu);

a jak chcesz usunać to robisz:
ramka.removeKeyListener(menu);

1 użytkowników online, w tym zalogowanych: 0, gości: 1