Daha hamar hərəkəti necə edə bilərəm?

Ona görə də xarakterimin daha rəvan hərəkət etməsi üçün köməyə ehtiyacım var. Problem ondadır ki, mən düyməyə basdığım zaman personaj bir piksel hərəkət edir və bir saniyədən sonra o, bundan sonra “rəvan” işləyir. Mən bunu necə düzəldə bilərəm ki, bir saniyə gözləməyim və o, əvvəldən rəvan qaçsın? Hər hansı bir kömək üçün təşəkkür edirəm və əvvəlcədən təşəkkür edirəm!

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 mənbə
comment
if(KB[0] = true) if(KB[0] == true) olmalıdır? və ya sadəcə if(KB[0])   -  person samgak    schedule 08.05.2017
comment
Bəs niyə keyPressed-də fərqli məntiqiniz var? PS : paintComponent-də repaint() funksiyasına zəng etmək də yəqin ki, ən yaxşı fikir deyil   -  person AxelH    schedule 08.05.2017
comment
Animasiyaya nəzarət etmək üçün Swing Timer istifadə etməlisiniz. Klaviaturadan istifadə edilən hərəkətə baxın. KeyboardAnimation.java nümunəsi nəzarət edə biləcəyiniz hamar animasiya üçün Swing Timer-dən necə istifadə olunacağını göstərir.   -  person camickr    schedule 08.05.2017


Cavablar (2)


KeyListener istifadə etməməyi və Açar Bağlamalardan Necə İstifadə Etməyi< istifadə etməyi tövsiyə edərdim. /a>, o, KeyListener ilə diqqət mərkəzində olan problemi həll edəcək və daha çox təkrar istifadə edilə bilən həlli təmin edəcək.

keyPressed ilk dəfə basıldıqda, ilk və təkrarlanan düymə vuruşları arasında ilkin gecikmə də olacaq, bu düymə basıldıqda və buraxıldıqda bayraq təyin etməklə aradan qaldırıla bilər. Ətraflı məlumat üçün bu nümunəyə baxın

paintComponent-də update-ə zəng etməyin, rəngləmə hər hansı bir səbəbə görə baş verə bilər, buna nəzarət etmədiyiniz ola bilər, bu, hamar animasiyanın saxlanmasında problemlər yarada bilər.

Bunun əvəzinə vəziyyəti yeniləmək və yenidən rəngləmə planlaşdırmaq üçün cavabdeh olan "əsas" döngəyə ehtiyacınız var. Sadə bir həll yolu olaraq, bunu etmək üçün Swing Timer istifadə edə bilərsiniz, çünki bu, əlavə iplik problemləri riski olmadan UI vəziyyətini daxildən yeniləməkdir.

Ətraflı təfərrüatlar üçün Swing Timers-dan necə istifadə olunacağına nəzər salın. .

Artıq qeyd edildiyi kimi, if(KB[0] = true) üzərində if(KB[0]) istifadə edin, çünki = qiymətləndirmə deyil, tapşırıqdır. Birinci formadan istifadə təsadüfən bu cür səhvlərə yol vermə ehtimalını aradan qaldırır

person MadProgrammer    schedule 08.05.2017
comment
Mənə kömək etdiyiniz üçün təşəkkür edirəm! - person Mushi Mushi; 08.05.2017

Bunun səbəbi update metodunuzun yanlış olmasıdır. Siz öz vəziyyətinizdə == əvəzinə = operatorundan istifadə edirsiniz.

if (KB[0] = true)

true-ni KB[0]-a təyin edəcək və onu true kimi qiymətləndirəcək, ona görə də bütün dəyərləriniz if daxilində doğru olaraq təyin olunacaq. Dəyər təyin etmək istəmirsinizsə, onu şərt kimi istifadə edərkən =-u == olaraq dəyişdirin.

person Lajos Arpad    schedule 08.05.2017
comment
Ahh gördüm təşəkkürlər! Mənə kömək etdi! btw bilirsinizmi mən kodumda taymerdən necə istifadə edə bilərəm? müəllimim mənə sahib olmağımı istədiyi üçün minnətdar olardı :D - person Mushi Mushi; 08.05.2017
comment
@MushiMushi xoş gəlmisiniz və bu kiçik dərsliyə nəzər sala bilərsiniz: docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. Əgər mənim cavabım probleminizi həll etməyə kömək etdisə, onu düzgün cavab kimi qəbul etmək istəyə bilərsiniz. - person Lajos Arpad; 08.05.2017