IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
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 Hartinger
Vlastník
Avatar
Odpovídá na T.vp
David Hartinger: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
New kid back on the block with a R.I.P
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
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na T.vp
David Hartinger: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
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Nahoru Odpovědět
12.10.2013 9:56
New kid back on the block with a R.I.P
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.