Java重力错误

标签 java game-physics

我的重力等级有问题,每当用户跳跃时,它应该改变 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

最佳答案

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

关于Java重力错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41198043/

相关文章:

java - 免费在线 SMPP 服务器

ios - 完美的 Swift3 Boing

algorithm - 实现 2D 多体碰撞解决方案

algorithm - 如何化解这种与冲动的肉体碰撞?

java - Axis 中的数组序列化

java - 如何让两个数组以完全相同的方式排序,以便

java - Spring - 调用了错误的方法

java - hibernate 批量插入 - 冲洗如何工作?

ios - Spritekit物理: One ball hit another ball

java - 与移动障碍物的碰撞响应(2D)