czyszczenie bufora- reset w grze

0

Witam, mam taki o to problem: chciałbym zrobić w grze tzw reset, czy chcesz zagrac jeszcze raz? itp.

problem polega na tym ze gdy zeruje program w taki sposób:

               ((Button)p1).setLabel(" ");

                                ((Button)p2).setLabel(" ");


                                p1.setBackground(Color.white);

                                p2.setBackground(Color.white);

 

                           ((Button)p1).setActionCommand("p1");

                           ((Button)p1).addActionListener(this);

                           ((Button)p2).setActionCommand("p2");

                           ((Button)p2).addActionListener(this);

                           

to po kilku próbach tak jakby przyciski przyciskaja sie podwójnie i zamiast kółka jest krzyżyk lub odwrotnie, czasem widac że zmiana następuje podwójnie. wydaje mi sie że bufor się nie czyści, jeśli mam racje , jak to poprawić?

tu skrócony kod programu( chce dodać przycisk reset, lub resetować w przypaku wygranej, to nie ważne, ważne czemu pobiera podwojne przyciśnięcie?):

public class KolkoKrzyzyk extends JFrame implements ActionListener {

    public Component p1;
    public Component p2;
    public Container p;
    String kto = ("O"); 
    int fontSize=40;
    public Font font=new Font("Helvetica", Font.BOLD, fontSize);
    public Font font2=new Font("Helvetica", Font.HANGING_BASELINE, 100);
        String gracz="p1";
        String ruch="ruch oddaje: ";
        public KolkoKrzyzyk(){
 
                
              
 
                  Dol.setLayout(new GridLayout(1,5,1,5));
 
                Dol.add(lab2);
 
                add(Dol, BorderLayout.SOUTH);
 
                setSize(450, 450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        p = new Panel();
        p.setLayout(new GridLayout(3, 3, 10, 10));
        p.setBackground(Color.black);
        add(p, BorderLayout.WEST);
        p1 = (new Button(" "));
        p2 = (new Button(" "));
 
        p1.setBackground(Color.white);
        p2.setBackground(Color.white);
 
        p1.setFont(font2);
        p2.setFont(font2);
 
        p.add(p1);
        p.add(p2);
 
        ((Button)p1).setActionCommand("p1");
        ((Button)p1).addActionListener(this);
        ((Button)p2).setActionCommand("p2");
        ((Button)p2).addActionListener(this);
 
        Container cp = getContentPane();
        cp.add(p);
        setVisible(true);
        }
 
    public static void main(String[] args) {
        new KolkoKrzyzyk();
    }
 
 
 
    public void actionPerformed(ActionEvent zrodlo) {
        String polecenie = zrodlo.getActionCommand();
        String cmd= zrodlo.getActionCommand();
 
         
 
        if (polecenie.equals("p1")) {
            ((Button)p1).setLabel(kto);
            ((Button)p1).removeActionListener(this);
        }
        } else if (polecenie.equals("p2")) {
            ((Button)p2).setLabel(kto);
            ((Button)p2).removeActionListener(this);
           
        }
 

    }
}
0

A po cholerę dodajesz po raz kolejny obsługę zdarzenia ? :>

0
 ((Button)p1).removeActionListener(this);

bo tu ją usuwam by dwa kliknięcia nie zmieniały znaku, więc muszę dodać, mylę się ? zresztą prubowałem i bez eo, jednak wtedy dzia łały tylko niektóre przyciski, i to w dziwny losowy sposób lub żaden nie reaował, dy dodałem obsługę działają wszystkie ale w dziwny sposob, może byc sytuacja że kólko trafia sie 3 razy pod żad a moze byc tak że zamieni sie kolejność, brak jakiejś zasady, losowo,

0

Nie zauważyłem tego "remove", opierałem się na pierwszym fragmencie kodu.

0

Na podstawie zamieszczonych fragmentów kodu poprawnej odpowiedzi udzieli wróżka. Pomysł z usuwaniem i dodawaniem listenera jest bardzo osobliwy, chyba masz skopany projekt.

0

Oddziel dane i (osobno) logikę gry od GUI. To nie interfejs gry masz resetować, ale dane gry. GUI wyświetli Ci stan gry i nie trzeba tam nic resetować. Zauważ, że większość gier zrobionych w jakimś asynchronicznym GUI ma niezwykle prosty interfejs (często pojedyncze okienko/panel). Przypatrz się pod tym kątem prostym grom (np. tych dołączonych do systemu Windows).

0

ale jak to zrobic? hmm, przecież to na buttonach ma sie wyswietlac kolko i krzyżyk, nawet jak dam jakies zmienne to co to zmieni? hm hm myslalem zeby dodawac dane do tablicy i tam robic porównania ale to i tak nic nie da, przeciez dane i tak bede musiał wyswietlic na przyciskach

0

W takiej grze jeżeli chcesz użyć buttonów jako elementów grafiki, to stają się one elementem stałym. Wyświetlasz je zawsze, rejestrujesz obsługę zdarzeń tylko raz inicjując program gry. Jedyne co im się zmienia, to ich rozmiar który dopasowuje się do rozmiarów okna w którym zawsze powinny się mieścić i wypełniać całość. Danymi gry będą wyłącznie: stan zaznaczonych pól (czyli jakiś enum kółko/krzyżyk/puste, standardowo dziewięciu) i strona gracza wykonującego ruch. Tylko to resetujesz przy nowej grze i jednocześnie robisz invalidate na panelu z buttonami, żeby się zaktualizowały (czasem trzeba im pomóc przez dodatkowe validate i repaint).

0

wpadlem na to zanim to przeczytalem :P nie usuwalem action listenera, dodalem warunek ze label zmienia sie tylko wtedy gdy pole jest puste, resetuje tylko zawartosc label i kolor buttonow, wszystko dziala. Czy metody invalidate , repaint , validate sa mi konieczne jesli wszystko działa? chodzi mi o to czy zawsze bedzie dzialac bez tych metod, czy sa istotne?

0

Są o tyle istotne, że obiekty, które tworzysz w Swingu nie zawsze są tym co widzisz na ekranie. To co widzisz na ekranie są komponentami graficznymi, którymi te obiekty sterują. W przypadku komponentów lightweight (lekkich) są one połączone tak ściśle, że można je często utożsamiać, a metody te są wykonywane z automatu kiedy trzeba (np. zmieni się stan obiektu lub zmieni się coś od strony systemu operacyjnego), jednak w przypadku obiektów heavyweight (cieżkich) komponent ekranowy jest wyłączną własnością systemu i obiekt Swinga tylko pośrednio na niego wpływa. Tymi drugimi obiektami są wszystkie okienka najwyższego poziomu takie jak np. JFrame. Trzeba też uważać z mieszaniem obiektów AWT poniewaz wszystkie komponenty AWT są "ciężkie", czyli też są własnością OS-a. Generalnie powinieneś przeczytać javadoca wszystkich trzech metod (bo tam jest to wytłumaczone najlepiej) i ściśle się do niego stosować.

0

dzieki za pomoc

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