2016-12-17 1 views
0

임 내 중력 클래스에 문제가있어서 사용자가 점프 할 때마다베이스에 도달 할 때까지 y 좌표를 변경해야하지만 점프 버튼 (W)을 반복해서 누르면 버그가 발생하고 큐브는 베이스.자바 중력 버그

메인 클래스 :

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

@SuppressWarnings("serial") 
public class Frame extends JFrame implements Runnable{ //main class 

    static Panel panel; 
    static Frame frame; 

    //CONSTRUCTOR 
    Frame(){ //constructor 

     super("Game Frame"); 
     setLayout(new GridLayout(1,1)); 

     panel = new Panel(); 

     add(panel); 

    } //constructor 

    public static void main (String args[]){ //main method 

     frame = new Frame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.setResizable(true); 
     frame.setSize(500,300); 
     frame.setLocationRelativeTo(null); 
     Thread T1 = new Thread(frame); 
     T1.start(); 

    } //main method 


    public void run(){ //run method 

     frame.addKeyListener(new KeyListener(){ //key listener method 

      @Override 
      public void keyPressed(KeyEvent arg0) { //key pressed 

       switch(arg0.getKeyChar()){ 

       //A (LEFT) 
       case 'a': 
        panel.x -= 10; 
        panel.repaint();break; 

       //D (RIGHT) 
       case 'd': 
        panel.x += 10; 
        panel.repaint();break; 

       //W (UP) 
       case 'w': 
        panel.y -= 40; 
        panel.repaint(); 
        Thread T1 = new Thread(new Gravity()); 
        T1.start(); 

       } //switch 

      } //key pressed method 

      @Override 
      public void keyReleased(KeyEvent arg0) {} 

      @Override 
      public void keyTyped(KeyEvent arg0) {} 

     }); //key listener method 
    } //run method 
} //main class 

패널 클래스 :

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

@SuppressWarnings("serial") 
public class Panel extends JPanel{ //class 

    static BufferedImage bg; 
    static int x = 20; 
    static int y = 195; 


    //PAINT METHOD 
    public void paint(Graphics g){ //method 

     super.paint(g); 
     g.setColor(Color.ORANGE); 
     this.setBackground(Color.BLACK); 

     //IMPORTING IMAGES 
     try { 
      bg = ImageIO.read(getClass().getResourceAsStream("Background.png")); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     //DRAWING GAME 
     g.drawImage(bg, 0, 0,500,275,null); 
     g.fillRect(x, y, 50, 50); 

    } //method 




} //class 

중력 클래스 :

public class Gravity implements Runnable{ //class 

    @Override 
    public void run() { //run method 

      while(Frame.panel.y != 195){ //while loop 

       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { //catch exception 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } //catch exception 

       Frame.panel.y += 5; 
       Frame.panel.repaint(); 

      } //while loop 

    } //run method 

} //class 
+1

이것을 디버거에 넣거나 println 문을 써서 무슨 일이야. 여기에있는 사람들은 구체적인 질문에 기꺼이 대답하지만, 코드 세트를 가져 와서 디버깅하는 것은 덜 행복합니다. – arcy

+0

감사합니다. arcy. 나는 오랫동안 그것을 해결하려고 노력했다. 그래서 나는 이것을 여기에 올리려고했다. 자바에서 추적 테이블과 같은 것을 사용할 수있는 방법이 있습니까? 문법이 괜찮 으면 논리적 인 오류 일뿐입니다. –

+0

흥미로운 부분도 보이지 않는 것 같습니다. 'Gravity'는 어디에 사용됩니까? 내 권고안은 그들이 어떻게 작동하는지 정말로 모른다면'Thread's를 모두 건너 뛰는 것이다. 시뮬레이션을 만드는 가장 간단한 방법은 'paint','doPhysics','paint','doPhysics' 등을 인터리브하는 것입니다. – pingul

답변

1

내가 여러 스레드를 작성해서는 안 제안, 오히려 하나를 다시 사용합니다. 두 개의 팀이 Frame.panel.y를 수정한다는 것이 발생할 수 있습니다. 첫 번째는 195로 이동하고 두 번째는 자고 두 번째는 200으로 이동하고! = 195 조건이 충족됩니다. 나중에 프레임 외부에 페인팅하면 충돌이 발생합니다. 간단한 해결 방법은 "while (Frame.panel.y! = 195)"를 "while (Frame.panel.y < 195)"로 대체하는 것입니다.

+0

고마워 마틴 G. 나는 당신의 추론을 이해하고 동의하지만 어쨌든 그것은 작동하지 않았다. 논리 연산자를 <로 바꾸려고 시도했는데 여전히 똑같은 일을했다가 주 프로그램을위한 스레드를 제거하려고 시도했고 프로그램은 큐브를 움직일 때 런타임 오류를 발생 시켰습니다. –