2017-05-08 1 views
0

그래서 내 캐릭터가 더 부드럽게 움직 이도록 도와주세요. 문제는 내가 키를 누를 때 문자가 한 픽셀 씩 움직이며 그 후 1 초 후에 그는 "부드럽게"실행된다는 것입니다. 1 초를 기다릴 필요없이 처음부터 순조롭게 돌아갈 수 있도록 어떻게 수정할 수 있습니까? 도움을 주셔서 감사 드리며 직접 감사드립니다.부드럽게 움직이게하려면 어떻게해야합니까?

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) { 
+4

'if (KB [0] = true)'는'(KB [0] == true)'이어야합니까? 또는 단지'if (KB [0])' – samgak

+0

그리고 왜 당신은'keyPressed'에서 다른 로직을 가지고 있습니까? 추 신 :'paintComponent'에서 repaint()을 호출하는 것이 가장 좋은 아이디어는 아닙니다. – AxelH

+0

애니메이션을 제어하려면'스윙 타이머 (Swing Timer) '를 사용해야합니다. [키보드를 사용한 동작] (https://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/)을 참조하십시오. 'KeyboardAnimation.java' 예제는 제어 할 수있는 부드러운 애니메이션을위한'Swing Timer' 사용법을 보여줍니다. – camickr

답변

0

귀하의 update 방법이 잘못 되었기 때문입니다. 조건에 == 대신 = 연산자를 사용하십시오.

if (KB[0] = true) 

따라서 모든 값은 당신의 if 내부 true로 설정됩니다 KB[0]true를 할당하고 true로 평가합니다. 값을 할당하지 않으려면 조건으로 사용할 때 ===으로 변경하십시오.

+0

아 감사합니다. 그것은 나를 도왔다! btw 내 코드에서 타이머를 사용할 수있는 방법을 알고 있습니까? 선생님이 내가 갖고 싶어하기 때문에 감사하겠습니다. D –

+0

@MushiMushi 환영합니다.이 작은 자습서 (https://docs.oracle.com/javase/tutorial/uiswing/misc/timer)를 살펴보십시오. html. 내 대답이 당신의 문제를 해결하는 데 도움이된다면 올바른 대답으로 받아 들일 수 있습니다. –

1

KeyListener을 사용하고 How to Use Key Bindings을 사용하는 것이 좋습니다. KeyListener으로 포커스 관련 문제를 해결하고 훨씬 더 재사용 가능한 솔루션을 제공합니다.

keyPressed도 첫 번째 키 누름과 첫 번째 반복 키 스트로크 사이의 초기 지연을 가지며 키를 눌렀다 놓을 때 플래그를 설정하여이를 극복 할 수 있습니다. 당신의 paintComponentupdate를 호출하지 마십시오 자세한 내용

에 대한 this example를 참조하십시오, 그림은 당신이 통제하지 않는 월, 여러가지 이유로 발생할 수 있습니다, 이것은 부드러운 애니메이션을 유지하는 문제를 일으킬 수 있습니다.

상태를 업데이트하고 다시 그리기를 예약하는 "메인"루프가 필요합니다. 간단한 해결책으로 스레 킹 Timer을 사용하면 스레딩 문제를 발생시키지 않으면 서 UI 상태를 내부에서 업데이트 할 수 있습니다.

자세한 내용은 How to use Swing Timers을보십시오.

이미 언급했듯이 에 if(KB[0])을 사용하십시오. =은 평가가 아니며 배정되었습니다. 첫 번째 양식을 사용하면 실수로 실수로 이런 종류의 실수를 범할 가능성이 없어집니다.

+0

도와 주셔서 감사합니다! –

관련 문제