Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 80% výuky zdarma!
birthday
Avatar
T.vp
Člen
Avatar
T.vp:12.10.2013 9:10

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:12.10.2013 9:18

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
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
T.vp
Člen
Avatar
T.vp:12.10.2013 9:29

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
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na T.vp
David Čápka:12.10.2013 9:55

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
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
David Čápka
Tým ITnetwork
Avatar
Nahoru Odpovědět
12.10.2013 9:56
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
T.vp
Člen
Avatar
T.vp:12.10.2013 10:56

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.