Si të bëj lëvizje më të qetë?

Kështu që kam nevojë për ndihmë për ta bërë karakterin tim të lëvizë më mirë. Problemi është se personazhi lëviz një piksel kur unë shtyp një tast dhe pas një sekonde ai vrapon "i qetë" pas kësaj. Si mund ta rregulloj në mënyrë që të mos më duhet të pres atë një sekondë dhe ai thjesht të ecë pa probleme që në fillim? Unë e vlerësoj çdo ndihmë dhe faleminderit paraprakisht!

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 burimi
comment
if(KB[0] = true) duhet të jetë if(KB[0] == true)? ose vetëm if(KB[0])   -  person samgak    schedule 08.05.2017
comment
Dhe pse keni një logjikë të ndryshme në keyPressed? PS: Thirrja e repaint() në paintComponent nuk është ndoshta ideja më e mirë   -  person AxelH    schedule 08.05.2017
comment
Ju duhet të përdorni një Swing Timer për të kontrolluar animacionin. Shiko Lëvizja duke përdorur tastierën. Shembulli KeyboardAnimation.java tregon se si të përdorni një Swing Timer për animacion të qetë që mund ta kontrolloni.   -  person camickr    schedule 08.05.2017


Përgjigjet (2)


Unë do të rekomandoja të mos përdorni KeyListener dhe të rekomandoja përdorimin e Si të përdorni lidhjet kryesore, do të zgjidhë problemin e lidhur me fokusin me KeyListener dhe do të sigurojë një zgjidhje shumë më të ripërdorshme.

keyPressed do të ketë gjithashtu një vonesë fillestare kur shtypet për herë të parë, midis goditjes së parë dhe të përsëritur të tastit, kjo mund të tejkalohet duke vendosur një flamur kur tasti shtypet dhe lëshohet. Shiko këtë shembull për më shumë detaje

Mos telefononi updatepaintComponent tuaj, pikturimi mund të ndodhë për shumë arsye, të cilat mund të mos i kontrolloni, kjo mund të shkaktojë probleme me ruajtjen e një animacioni të qetë.

Në vend të kësaj ju nevojitet një lak "kryesor" i cili është përgjegjës për përditësimin e gjendjes dhe planifikimin e rilyerjeve. Si një zgjidhje e thjeshtë, mund të përdorni një Swing Timer për ta bërë këtë, pasi është për të përditësuar gjendjen e ndërfaqes së përdoruesit nga brenda pa rrezikuar probleme shtesë të filetimit

Hidhini një sy Si të përdorni Swing Timers për më shumë detaje .

Siç është thënë tashmë, përdorni if(KB[0]) mbi if(KB[0] = true), pasi = është një detyrë, jo një vlerësim. Përdorimi i formularit të parë eliminon mundësinë e kryerjes aksidentale të këtyre gabimeve të llojit og

person MadProgrammer    schedule 08.05.2017
comment
Faleminderit që më ndihmove! - person Mushi Mushi; 08.05.2017

Kjo është për shkak se metoda juaj update është e pasaktë. Ju përdorni operatorin = në vend të == në gjendjen tuaj.

if (KB[0] = true)

do të caktojë trueKB[0] dhe do ta vlerësojë si true, prandaj të gjitha vlerat tuaja do të vendosen si të vërteta brenda if tuaj. Ndrysho === kur e përdor si kusht, përveç nëse dëshiron të caktosh vlerën.

person Lajos Arpad    schedule 08.05.2017
comment
Ahh e shoh Faleminderit! Më ndihmoi! btw a e dini se si mund të përdor një kohëmatës në kodin tim ndërsa jeni në të? do ta vlerësoja pasi mësuesi im dëshiron që unë të kem një të tillë :D - person Mushi Mushi; 08.05.2017
comment
@MushiMushi ju jeni të mirëpritur dhe mund t'i hidhni një sy këtij tutoriali të vogël: docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. Nëse përgjigja ime ju ndihmoi të zgjidhni problemin tuaj, atëherë mund të dëshironi ta pranoni atë si përgjigjen e saktë. - person Lajos Arpad; 08.05.2017