मी सुरळीत हालचाल कशी करू?

त्यामुळे माझे पात्र अधिक सहजतेने पुढे नेण्यासाठी मला मदतीची गरज आहे. समस्या अशी आहे की जेव्हा मी की दाबतो तेव्हा वर्ण एक पिक्सेल हलवतो आणि एक सेकंदानंतर तो "सुरळीतपणे" चालतो. मी ते कसे दुरुस्त करू शकतो जेणेकरून मला तो एक सेकंद थांबण्याची गरज नाही आणि तो सुरुवातीपासून सहजतेने धावेल? मी हात आधी कोणत्याही मदत आणि धन्यवाद प्रशंसा!

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 : paintComponent मध्ये repaint() कॉल करणे ही कदाचित सर्वोत्तम कल्पना नाही   -  person AxelH    schedule 08.05.2017
comment
अॅनिमेशन नियंत्रित करण्यासाठी तुम्हाला Swing Timer वापरण्याची आवश्यकता आहे. कीबोर्ड वापरून मोशन पहा. KeyboardAnimation.java उदाहरण तुम्ही नियंत्रित करू शकता अशा सहज अॅनिमेशनसाठी Swing Timer कसे वापरायचे ते दाखवते.   -  person camickr    schedule 08.05.2017


उत्तरे (2)


मी KeyListener वापरण्याविरुद्ध शिफारस करतो आणि की बाइंडिंग कसे वापरावे< वापरून शिफारस करतो. /a>, ते KeyListener सह फोकस संबंधित समस्या सोडवेल आणि अधिक पुन्हा वापरता येण्याजोगे समाधान प्रदान करेल.

keyPressed प्रथम दाबल्यावर प्रारंभिक विलंब देखील होईल, प्रथम आणि पुनरावृत्ती करणार्‍या की स्ट्रोक दरम्यान, जेव्हा की दाबली जाते आणि सोडली जाते तेव्हा ध्वज सेट करून यावर मात करता येते. अधिक तपशीलांसाठी हे उदाहरण पहा

तुमच्या paintComponent मध्ये update वर कॉल करू नका, पेंटिंग अनेक कारणांमुळे होऊ शकते, ज्यापैकी तुम्ही नियंत्रित करत नाही, यामुळे गुळगुळीत अॅनिमेशन राखण्यात समस्या येऊ शकतात.

त्याऐवजी तुम्हाला "मुख्य" लूपची आवश्यकता आहे जी स्थिती अद्यतनित करण्यासाठी आणि पुन्हा रंगविण्यासाठी शेड्यूल करण्यासाठी जबाबदार आहे. एक सोपा उपाय म्हणून, तुम्ही हे करण्यासाठी स्विंग Timer वापरू शकता, कारण ते अतिरिक्त थ्रेडिंग समस्यांना धोका न देता UI ची स्थिती अद्ययावत करण्यासाठी आहे.

अधिक तपशीलांसाठी स्विंग टाइमर कसे वापरावे पहा .

आधीच सांगितल्याप्रमाणे, 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 म्हणून मूल्यमापन करेल, त्यामुळे तुमची सर्व मूल्ये तुमच्या if मध्ये सत्य म्हणून सेट केली जातील. तुम्ही मूल्य नियुक्त करू इच्छित नसल्यास = ला == वर बदला.

person Lajos Arpad    schedule 08.05.2017
comment
अहो मी पाहतो धन्यवाद! त्याने मला मदत केली! btw तुम्हाला माहित आहे का की मी माझ्या कोडमध्ये टायमर कसा वापरू शकतो? माझ्या शिक्षिकेला माझ्याकडे एक असावे असे वाटत असल्याने त्याचे कौतुक होईल :D - person Mushi Mushi; 08.05.2017
comment
@MushiMushi तुमचे स्वागत आहे आणि तुम्ही हे छोटे ट्यूटोरियल पाहू शकता: docs.oracle.com/javase/tutorial/uiswing/misc/timer.html. जर माझ्या उत्तराने तुमची समस्या सोडवण्यास मदत केली असेल, तर तुम्ही ते योग्य उत्तर म्हणून स्वीकारू शकता. - person Lajos Arpad; 08.05.2017