2016-12-17 10 views
0

私の重力クラスに問題があります。ユーザがジャンプするたびにベースに達するまでy座標を変更する必要がありますが、ジャンプボタン(W)を繰り返し押すとバグが発生し、キューブはベース。Javaの重力バグ

メインクラス:

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 

Panelクラス:

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。私はこれをここに投稿しようとした理由を長年解決しようとしました。私はJavaでトレーステーブルのようなものを使用することができます何らかの方法はありますか?構文は問題ないので、論理エラーのちょっとした並べ替え –

+0

あなたは興味深い部分も表示していないようです。 'Gravity'はどこに使われますか?私がお勧めするのは、実際にどのように動作しているのか分からなければ、 'Thread'sをすべてスキップすることです。シミュレーションを作成する最も簡単な方法は、 'paint'、' doPhysics'、 'paint'、' doPhysics'などをインターリーブすることです。 – pingul

答えて

1

私はあなたが1を再利用ではなく、複数のスレッドを作成しないでください示唆しています。 2つのtheadsがFrame.panel.yを変更することがあります。最初は195に移動し、2つ目は寝ており、2つ目が200に移動し、!= 195の条件が満たされます。クラッシュは後でフレームの外側にペイントすることによって発生します。簡単な回避策は、 "while(Frame.panel.y!= 195)"を "while(Frame.panel.y < 195)"に置き換えることです。

+0

ありがとうMartin G。私はあなたの推理を理解し、私は同意するが、それはとにかく仕事をしなかった。私は論理演算子を<に変えようとしましたが、それでもやはり同じことをした後、メインプログラムのスレッドを削除しようとしました。プログラムはキューブを移動しようとすると何らかのランタイムエラーを出しました –