Java重力错误

时间:2016-12-17 11:22:31

标签: java game-physics

我的引力类有问题,它应该改变y坐标,直到它到达基地时,无论何时用户跳跃,但是当我反复按下跳跃按钮(W)时,它会发出错误,并且立方体会在基座下方停留。 / p>

主要课程:

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 个答案:

答案 0 :(得分:1)

我建议您不要创建多个线程,而应重用一个。可能发生的是两个theads修改Frame.panel.y。第一个移动到195而第二个移动到睡眠,然后第二个移动到200并且满足你的!= 195条件。之后在画框外画画会发生撞击。一个简单的解决方法是将“while(Frame.panel.y!= 195)”替换为“while(Frame.panel.y< 195)”

相关问题