Cum fac o mișcare mai lină?

Așa că am nevoie de ajutor pentru ca personajul meu să se miște mai ușor. Problema este că personajul se mișcă cu un pixel când apăs pe o tastă și după aproximativ o secundă merge „liniște” după aceea. Cum pot să o repar, astfel încât să nu mai fie nevoie să aștept o secundă și el pur și simplu merge lin de la început? Apreciez orice ajutor și mulțumesc înainte!

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 sursă
comment
if(KB[0] = true) ar trebui să fie if(KB[0] == true) ? sau doar if(KB[0])   -  person samgak    schedule 08.05.2017
comment
Și de ce aveți o logică diferită în keyPressed? PS: Apelarea repaint() în paintComponent nu este probabil cea mai bună idee   -  person AxelH    schedule 08.05.2017
comment
Trebuie să utilizați un Swing Timer pentru a controla animația. Consultați Mișcare folosind tastatura. Exemplul KeyboardAnimation.java arată cum să utilizați un Swing Timer pentru o animație fluidă pe care o puteți controla.   -  person camickr    schedule 08.05.2017


Răspunsuri (2)


Aș recomanda să nu folosiți KeyListener și să recomand să utilizați Cum să utilizați legăturile de taste, va rezolva problemele legate de focalizare cu KeyListener și va oferi o soluție mult mai reutilizabilă.

keyPressed va avea, de asemenea, o întârziere inițială atunci când este apăsată prima dată, între prima apăsare și repetarea tastei, aceasta poate fi depășită prin setarea unui steag când tasta este apăsată și eliberată. Consultați acest exemplu pentru mai multe detalii

Nu apelați update în paintComponent, pictura poate apărea din mai multe motive, pe care nu le controlați, acest lucru ar putea cauza probleme cu menținerea unei animații fluide.

În schimb, aveți nevoie de o buclă „principală” care este responsabilă pentru actualizarea stării și programarea revopsirilor. Ca o soluție simplă, puteți folosi un Swing Timer pentru a face acest lucru, deoarece este pentru a actualiza starea interfeței de utilizare din interior fără a risca probleme suplimentare de threading

Aruncă o privire la Cum se utilizează Swing Timer pentru mai multe detalii .

După cum sa spus deja, utilizați if(KB[0]) peste if(KB[0] = true), deoarece = este o sarcină, nu o evaluare. Utilizarea primei forme elimină posibilitatea de a face accidental aceste greșeli

person MadProgrammer    schedule 08.05.2017
comment
Mulțumesc că m-ați ajutat! - person Mushi Mushi; 08.05.2017

Se datorează faptului că metoda dvs. update este incorectă. Folosiți operatorul = în loc de == în starea dvs.

if (KB[0] = true)

va atribui true la KB[0] și îl va evalua ca true, Prin urmare, toate valorile dvs. vor fi setate la adevărat în interiorul dvs. if. Schimbați = în == când îl utilizați ca condiție, cu excepția cazului în care doriți să atribuiți valoarea.

person Lajos Arpad    schedule 08.05.2017
comment
Ahh vad multumesc! M-a ajutat! btw știi cum pot folosi un cronometru în codul meu în timp ce ești la el? as aprecia pentru ca profesorul meu vrea sa am unul :D - person Mushi Mushi; 08.05.2017
comment
@MushiMushi sunteți binevenit și puteți arunca o privire la acest mic tutorial: docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. Dacă răspunsul meu v-a ajutat să vă rezolvați problema, atunci poate doriți să-l acceptați ca răspuns corect. - person Lajos Arpad; 08.05.2017