Diskuze: Pohyb obrázku

Java Java Pohyb obrázku

Avatar
Johnn195
Neregistrovaný
Avatar
Johnn195:

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
Redaktor
Avatar
Odpovídá na Johnn195
Hartrik:

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:

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
Redaktor
Avatar
Odpovídá na Johnn195
Hartrik:

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:

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
Redaktor
Avatar
Odpovídá na Johnn195
Hartrik:

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

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

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
Redaktor
Avatar
Odpovídá na Johnn195
Honza Bittner:

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
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Johnn195
Neregistrovaný
Avatar
Odpovídá na Honza Bittner
Johnn195:

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
Redaktor
Avatar
Odpovídá na Johnn195
Hartrik:

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:

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.