Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

Diskuze: Pohyb obrázku

Aktivity
Avatar
Johnn195
Neregistrovaný
Avatar
Johnn195:28.10.2013 21:15

Zdravím,
potřeboval bych pomoci s pohybem obrázku. Obrázek a vykreslování mám, ale místo toho, aby se přesunul, tak se vždy vykreslí na novo.

public class Grafika extends JPanel {
    Image img1 = Toolkit.getDefaultToolkit().getImage("src/img/test2.png");
    private int x = 0, y = 0;

    public void paint(Graphics g) {
        super.paint(g);
        g2d.drawImage(img1, x, y, null);
    }
    public void moveH() {
        x += 10;
    }
}

a volám ho z hlavní třídy po stisku klávesy

private void formKeyPressed(java.awt.event.KeyEvent evt) {
        switch(evt.getExtendedKeyCode()) {
            case KeyEvent.VK_D:
                grafika.moveH();
                grafika.paint((Graphics2D)jPanel1.getGraphics());
                break;
        }
    }

Problém je tedy ten, že místo pohybu vždy zůstává i stará souřadnice obrázku, takže ten obrázek tam mm pak vícekrát. Zkoušel jsem to vyřešit voláním repaint v metodě paint a nebo moveH, ale bez výsledku.

 
Odpovědět
28.10.2013 21:15
Avatar
Hartrik
Tvůrce
Avatar
Odpovídá na
Hartrik:28.10.2013 21:43

Musíš starý obrázek nejprve překreslit. Třeba pomocí metody fillRect(int x, int y, int width, int height).

Tvá třída Grafika nemusí dědit z JPanel.

 
Nahoru Odpovědět
28.10.2013 21:43
Avatar
Johnn195
Neregistrovaný
Avatar
Odpovídá na Hartrik
Johnn195:28.10.2013 21:58

Nejsem si jist zda rozumím. Metoda fillRect slouží k nakreslení obdelníku. Jak s ní tedy mohu překreslit obrázek?
Zkoušel jsem ji tedy vyvolat, ale jediné, co se stalo, že se mi nakreslil obdélník. K překreslení obrázku nedošlo.

 
Nahoru Odpovědět
28.10.2013 21:58
Avatar
Hartrik
Tvůrce
Avatar
Odpovídá na
Hartrik:28.10.2013 22:14

Starý obrázek překreslíš tím obdélníkem, a poté vykreslíš obrázek na nové pozici.

 
Nahoru Odpovědět
28.10.2013 22:14
Avatar
Johnn195
Neregistrovaný
Avatar
Johnn195:28.10.2013 22:22

To jakože ten obrázek zakryji tím obdélníkem, který bude mít stejnou barvu jako pozadí. Chápu to tak správně?

 
Nahoru Odpovědět
28.10.2013 22:22
Avatar
Hartrik
Tvůrce
Avatar
Odpovídá na
Hartrik:28.10.2013 22:30

Ano, je to snadné a univerzální řešení.

 
Nahoru Odpovědět
28.10.2013 22:30
Avatar
Johnn195
Neregistrovaný
Avatar
Johnn195:28.10.2013 22:34

Aha, díky za radu.
Přesto neexistuje nějaké efektivnější řešení? Kdybych takové animace měl více, tak by to takto bylo dosti komplikované.

 
Nahoru Odpovědět
28.10.2013 22:34
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na
Honza Bittner:28.10.2013 22:46

překreslíš celou plochu tím fillRect(int x, int y, int width, int height) a znovu vše vykreslíš na nové pozici

Nahoru Odpovědět
28.10.2013 22:46
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Johnn195
Neregistrovaný
Avatar
Odpovídá na Honza Bittner
Johnn195:28.10.2013 22:51

Dobře díky.
Jenom ještě poslední otázka. Když to bude takto řešené, nebude to časem zabírat příliš místa v paměti? Vzhledem k tomu, že všechno bude zůstávat nakreslené

 
Nahoru Odpovědět
28.10.2013 22:51
Avatar
Hartrik
Tvůrce
Avatar
Odpovídá na
Hartrik:29.10.2013 13:58

Určitě ne, jinak to ani v AWT řešit nelze.

 
Nahoru Odpovědět
29.10.2013 13:58
Avatar
goddard
Člen
Avatar
goddard:29.10.2013 14:02

Hartrik radi dobre, je to klasicky vykreslovaci algoritmus a pouziva se v pocitacove grafice neustale. Pokud to chces lehce optimalizovat, muzes prekreslovat jen plochu shodnou s velikosti a (novymi) souradnicemi obrazku.

 
Nahoru Odpovědět
29.10.2013 14:02
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 11 zpráv z 11.