Diskuze: Vlákna v knihovně swing

Java Java Vlákna v knihovně swing

Avatar
T.vp
Člen
Avatar
T.vp:

Zdravím přátelé :)
Zkouším si vytvořit jednoduchou hru ve stylu arcanoid ( http://www.f-r-e-e-games.com/…ndes/102.jpg ).Udělal jsem si prostředí a hra zatím obsahuje Main třídu Arcanoid(JFra­me),Board(JPa­nel) a Ball extends Thread, mimo to výčtové typy a načítání obrázků. Takže teď k mému problému v třídě Arcanoid v mainu vytvořím a spustím nové vlákno třídy Ball tahle třída má za úkol pohyb míčku a to do té doby dokud nenastane konec hry. Problém je v tom, že chci měnit rychlost tohoto míčku a dělám to asi dost nešikovně, protože sleep(/čas/); mi sice uspí vlákno Ball, ale když mezitím chci posouvat destičku doleva a doprava, tak se změna projeví až po probuzení vlákna Ball. Přikládám část zdrojového kódu a prosím o radu jak uspat vlákno na nějáký čas, přičemž druhé vlákno by mohlo okamžitě(nebo s minimální prodlevou) reagovat na stisknutí klávesy. Díky moc :)

//Třída Arcanoid JFrame
public final void keyListener() {
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                super.keyPressed(e);
                int keyCode = e.getKeyCode();
                switch (keyCode) {
                    case KeyEvent.VK_UP:
                        System.out.println("nahoru");
                        break;
                    case KeyEvent.VK_DOWN:
                        System.out.println("dolů");
                        break;
                }
            }
        });
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException, InterruptedException {
        Arcanoid a = new Arcanoid(new Board());
        a.setBall(new Ball(a, a.getB().getBallX(), a.getB().getBallY()));
        a.setVisible(true);
        a.getBall().start();
    }
//třída Ball hodnota konce hry isEnd() je uložena v třídě Board
 @Override
    public void run() {
        super.run();
        moveBall();
        while (!getArcanoid().getB().isEnd()) {
            synchronized (getArcanoid().getB()) {
                if (getArcanoid().getB().isEnd()) {
                    break;
                }
            }
            moveBall();
            try {
               sleep(speed);
            } catch (Exception ex) {
                Logger.getLogger(Ball.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
 
Odpovědět 12.10.2013 9:10
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na T.vp
David Čápka:

Vlákna tady vůbec nejsou potřeba, jen si do aplikace zanášíš chyby. Stačí ti Timer.

Nahoru Odpovědět 12.10.2013 9:18
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
T.vp
Člen
Avatar
T.vp:

No o tom Timeru jsem něco četl, ale to co jsem zkoušl nefungovalo, neměl bys prosím nějákej příklad jak a hlavně kde ho použít?

 
Nahoru Odpovědět 12.10.2013 9:29
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na T.vp
David Čápka:

Vytvoříš si instanci Timeru a tomu předáš interval a anonymní třídu s metodou, co se má vykonat. Je to přímo součástí Swingu.

Nahoru Odpovědět 12.10.2013 9:55
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět 12.10.2013 9:56
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
T.vp
Člen
Avatar
T.vp:

Díky moc, teď už vím že jsem používal časovač z java.util místo z java.swing...

 
Nahoru Odpovědět 12.10.2013 10:56
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.