Miten saisin sujuvamman liikkeen?

Joten tarvitsen apua saadakseni hahmoni liikkumaan sujuvammin. Ongelmana on, että hahmo liikkuu yhden pikselin kun painan näppäintä ja noin sekunnin kuluttua hän juoksee "pehmeästi" sen jälkeen. Miten voin korjata sen niin, että minun ei tarvitse odottaa sitä sekuntia ja hän vain kulkee sujuvasti alusta alkaen? Arvostan apua ja kiitos jo etukäteen!

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.setColor(Color.GREEN);
    g.fillRect(x, y, 30, 30);
    update();
}
private boolean[] KB = new boolean[4];
public void update(){ 
    if(KB[0] = true)
    {
        y -= 10;
    }
    if(KB[1] = true)
    {
        x -= 10;
    }
    if(KB[2] = true)
    {
        y += 10;
    }
    if(KB[3] = true)
    {
        x +=10;
    }
    repaint();
}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W)
    {
        KB[0] = true;
    }
    if(e.getKeyCode() == KeyEvent.VK_A)
    {
        x -= 10;
    }
    if(e.getKeyCode() == KeyEvent.VK_S)
    {
        y += 10;
    }
    if(e.getKeyCode() == KeyEvent.VK_D)
    {
        x += 10;
    }
}
public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

person Mushi Mushi    schedule 08.05.2017    source lähde
comment
if(KB[0] = true) pitäisi olla if(KB[0] == true) ? tai vain if(KB[0])   -  person samgak    schedule 08.05.2017
comment
Ja miksi sinulla on erilainen logiikka kohteessa keyPressed? PS: Repaint():n kutsuminen paintComponent:ssa ei ole myöskään ehkä paras idea   -  person AxelH    schedule 08.05.2017
comment
Sinun on käytettävä Swing Timer animaation ohjaamiseen. Katso Näppäimistön käyttäminen. Esimerkki KeyboardAnimation.java näyttää, kuinka Swing Timer:a käytetään sujuvaan animaatioon, jota voit hallita.   -  person camickr    schedule 08.05.2017


Vastaukset (2)


Suosittelen olemaan käyttämättä KeyListener:a ja suosittelen Näppäimien käyttö, se ratkaisee kohdistukseen liittyvän ongelman KeyListener:n kanssa ja tarjoaa paljon uudelleenkäytettävän ratkaisun.

keyPressed:lla on myös alkuviive, kun sitä painetaan ensimmäisen kerran, ensimmäisen ja toistuvan näppäinpainalluksen välillä. Tämä voidaan voittaa asettamalla lippu, kun näppäintä painetaan ja vapautetaan. Katso lisätietoja tästä esimerkistä.

Älä soita numeroon update paintComponent:ssäsi, maalaus voi tapahtua useista syistä, joita et voi hallita. Tämä voi aiheuttaa ongelmia sujuvan animaation ylläpitämisessä.

Sen sijaan tarvitset "pää"-silmukan, joka vastaa tilan päivittämisestä ja uudelleenmaalausten ajoittamisesta. Yksinkertaisena ratkaisuna voit käyttää Swingiä Timer, koska se päivittää käyttöliittymän tilan sisältä käsin ilman lisäketjutusongelmien riskiä.

Katso lisätietoja Swing-ajastimien käyttämisestä. .

Kuten jo todettiin, käytä if(KB[0]) yli if(KB[0] = true), koska = on tehtävä, ei arviointi. Ensimmäisen lomakkeen käyttäminen eliminoi mahdollisuuden tehdä tällaisia ​​virheitä vahingossa

person MadProgrammer    schedule 08.05.2017
comment
Kiitos että autoit minua! - person Mushi Mushi; 08.05.2017

Se johtuu siitä, että update-menetelmäsi on virheellinen. Käytät ehdossasi operaattoria = == sijaan.

if (KB[0] = true)

määrittää arvon true arvolle KB[0] ja arvioi sen arvoksi true. Siksi kaikki arvosi asetetaan arvoiksi tosi if:ssa. Muuta = arvoon ==, kun käytät sitä ehtona, ellet halua määrittää arvoa.

person Lajos Arpad    schedule 08.05.2017
comment
Ahh näen kiitos! Se auttoi minua! btw tiedätkö kuinka voin käyttää ajastinta koodissani, kun olet sitä? arvostaisin sitä, koska opettajani haluaa minulle sellaisen :D - person Mushi Mushi; 08.05.2017
comment
@MushiMushi, tervetuloa ja voit katsoa tätä pientä opetusohjelmaa: docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. Jos vastaukseni auttoi sinua ratkaisemaan ongelmasi, sinun kannattaa hyväksyä se oikeaksi vastaukseksi. - person Lajos Arpad; 08.05.2017