Kā padarīt kustības vienmērīgākas?

Tāpēc man ir vajadzīga palīdzība, lai mans varonis kustētos raitāk. Problēma ir tāda, ka varonis pārvietojas par vienu pikseļu, kad es nospiežu taustiņu, un pēc kādas sekundes viņš skrien "gludi" pēc tam. Kā es varu to salabot, lai man nebūtu jāgaida šī viena sekunde, un viņš no sākuma skriet gludi? Es novērtēju jebkuru palīdzību un pateicos jau iepriekš!

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 avots
comment
if(KB[0] = true) jābūt if(KB[0] == true)? vai vienkārši if(KB[0])   -  person samgak    schedule 08.05.2017
comment
Un kāpēc jums ir cita loģika keyPressed? PS: izsaukt repaint() paintComponent, iespējams, arī nav tā labākā ideja   -  person AxelH    schedule 08.05.2017
comment
Lai vadītu animāciju, jāizmanto Swing Timer. Skatiet sadaļu Kustība, izmantojot tastatūru. Piemērā KeyboardAnimation.java ir parādīts, kā izmantot Swing Timer vienmērīgai animācijai, kuru varat kontrolēt.   -  person camickr    schedule 08.05.2017


Atbildes (2)


Es ieteiktu nelietot KeyListener un ieteiktu izmantot Kā izmantot taustiņu saistījumus<. /a>, tas atrisinās ar fokusu saistīto problēmu ar KeyListener un nodrošinās daudz vairāk atkārtoti lietojamu risinājumu.

keyPressed būs arī sākotnējā aizkave, kad tas pirmo reizi tiek nospiests, starp pirmo un atkārtoto taustiņu sitienu. To var pārvarēt, iestatot karodziņu, kad taustiņš tiek nospiests un atlaists. Plašāku informāciju skatiet šo piemēru.

Nezvaniet update savā paintComponent, gleznošana var notikt dažādu iemeslu dēļ, no kuriem jūs nekontrolējat. Tas var radīt problēmas ar vienmērīgas animācijas uzturēšanu.

Tā vietā jums ir nepieciešama "galvenā" cilpa, kas ir atbildīga par stāvokļa atjaunināšanu un pārkrāsošanas plānošanu. Kā vienkāršu risinājumu varat izmantot Swing Timer, jo tas ir paredzēts lietotāja interfeisa stāvokļa atjaunināšanai no iekšpuses, neriskējot ar papildu pavedienu problēmām.

Lai iegūtu plašāku informāciju, skatiet Kā izmantot Swing Timers. .

Kā jau minēts, izmantojiet if(KB[0]) virs if(KB[0] = true), jo = ir uzdevums, nevis novērtējums. Pirmās formas izmantošana novērš iespēju nejauši pieļaut šādas kļūdas

person MadProgrammer    schedule 08.05.2017
comment
Paldies, ka palīdzējāt man! - person Mushi Mushi; 08.05.2017

Tas ir tāpēc, ka jūsu update metode ir nepareiza. Jūs savā stāvoklī izmantojat operatoru =, nevis ==.

if (KB[0] = true)

piešķirs true KB[0] un novērtēs to kā true, tāpēc visas jūsu vērtības tiks iestatītas uz patiesu jūsu if. Mainiet = uz ==, ja ​​izmantojat to kā nosacījumu, ja vien nevēlaties piešķirt vērtību.

person Lajos Arpad    schedule 08.05.2017
comment
Ahh es redzu Paldies! Tas man palīdzēja! btw vai jūs zināt, kā es varu izmantot taimeri savā kodā, kamēr jūs to izmantojat? būtu pateicīgs, jo mana skolotāja vēlas, lai man tāda būtu :D - person Mushi Mushi; 08.05.2017
comment
Laipni lūdzam @MushiMushi, un varat apskatīt šo nelielo pamācību: docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. Ja mana atbilde jums palīdzēja atrisināt jūsu problēmu, iespējams, vēlēsities to pieņemt kā pareizo atbildi. - person Lajos Arpad; 08.05.2017