Как да направя по-плавно движение?

Така че имам нужда от помощ, за да накарам героя си да се движи по-плавно. Проблемът е, че героят се мести с един пиксел, когато натисна клавиш и след около една секунда той работи "гладко" след това. Как мога да го поправя, така че да не се налага да чакам тази секунда и той просто да работи гладко от самото начало? Оценявам всяка помощ и благодаря предварително!

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 източник
comment
if(KB[0] = true) трябва да бъде if(KB[0] == true) ? или просто if(KB[0])   -  person samgak    schedule 08.05.2017
comment
И защо имаш друга логика в keyPressed ? PS: Извикването на repaint() в paintComponent вероятно също не е най-добрата идея   -  person AxelH    schedule 08.05.2017
comment
Трябва да използвате Swing Timer, за да управлявате анимацията. Вижте Движение с помощта на клавиатурата. Примерът KeyboardAnimation.java показва как да използвате Swing Timer за плавна анимация, която можете да контролирате.   -  person camickr    schedule 08.05.2017


Отговори (2)


Бих препоръчал да не използвате KeyListener и да препоръчам използването на Как да използвам обвързвания на клавиши, той ще реши проблема, свързан с фокуса, с KeyListener и ще осигури много по-многократно използваемо решение.

keyPressed също ще има първоначално забавяне, когато е натиснат за първи път, между първото и повтарящото се натискане на клавиша, това може да бъде преодоляно чрез задаване на флаг, когато клавишът е натиснат и освободен. Вижте този пример за повече подробности

Не се обаждайте на update във вашия paintComponent, рисуването може да възникне поради различни причини, които може да не контролирате, това може да причини проблеми с поддържането на гладка анимация.

Вместо това се нуждаете от "главен" цикъл, който е отговорен за актуализирането на състоянието и планирането на пребоядисвания. Като просто решение можете да използвате Swing Timer, за да направите това, тъй като той е за актуализиране на състоянието на потребителския интерфейс отвътре, без да рискувате допълнителни проблеми с нишките

Разгледайте Как да използвате Swing Timers за повече подробности .

Както вече беше посочено, използвайте if(KB[0]) вместо if(KB[0] = true), тъй като = е присвояване, а не оценка. Използването на първата форма елиминира възможността за случайно допускане на подобни грешки

person MadProgrammer    schedule 08.05.2017
comment
Благодаря, че ми помогна! - person Mushi Mushi; 08.05.2017

Причината е, че вашият update метод е неправилен. Използвате оператора = вместо == във вашето състояние.

if (KB[0] = true)

ще присвои true на KB[0] и ще го оцени като true, следователно всички ваши стойности ще бъдат зададени на true във вашия if. Променете = на ==, когато го използвате като условие, освен ако не искате да присвоите стойността.

person Lajos Arpad    schedule 08.05.2017
comment
Ааа разбирам Благодаря! Помогна ми! между другото знаете ли как мога да използвам таймер в моя код, докато вие го правите? бих го оценил, тъй като учителят ми иска да имам такъв :D - person Mushi Mushi; 08.05.2017
comment
@MushiMushi, добре дошъл и можеш да погледнеш този малък урок: docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. Ако моят отговор ви е помогнал да решите проблема си, тогава може да искате да го приемете като правилния отговор. - person Lajos Arpad; 08.05.2017