Java 有没有办法在我的游戏中增加一个跳远技工?

Java 有没有办法在我的游戏中增加一个跳远技工?,java,Java,我一直在尝试为矩形(播放器)添加一种方法,使其上升到130像素,并增加延迟,而不是下降130像素。我试着让它上升,thread.sleep,然后让它下降,但是屏幕不刷新,也不工作。例如,我添加了几个sys out,看到它上下浮动,但在thread.sleep期间似乎没有刷新帧 package com.cookie.clicker; import java.awt.EventQueue; import javax.swing.JFrame; import java.awt.Color; im

我一直在尝试为矩形(播放器)添加一种方法,使其上升到130像素,并增加延迟,而不是下降130像素。我试着让它上升,thread.sleep,然后让它下降,但是屏幕不刷新,也不工作。例如,我添加了几个sys out,看到它上下浮动,但在thread.sleep期间似乎没有刷新帧

package com.cookie.clicker;

import java.awt.EventQueue;

import javax.swing.JFrame;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class ChromeOfflineGame extends JPanel {
public static Timer t;
static int x = 0;
static int y = 900;
static int width = 1920;
static int height = 250;

static int pX = 50;
static int pY = 800;
static int pW = 50;
static int pH = 100;

static Rectangle ground = new Rectangle(x,y,width,height);
static Rectangle player = new Rectangle(pX,pY,pW,pH);
static JFrame frame = new JFrame();

public ChromeOfflineGame() {
    frame.setUndecorated(true);
    frame.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if (keyCode==KeyEvent.VK_ESCAPE) {
                System.exit(0);
            } else if (keyCode==KeyEvent.VK_SPACE) {
                if (player.getY()<ground.getY()) {
                    //method to jump
                }
            }
            
            
            
        }
    });
}

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ChromeOfflineGame finder = new ChromeOfflineGame();
                
                
                frame.getContentPane().add(finder);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                
                
                t = new Timer(2,(ActionEvent e)->{
                    finder.redraw();
                    ground.setBounds(x,y,width,height);
                    player.setBounds(pX,pY,pW,pH);
                });
                t.start();                    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(1920, 1080);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    
    g.setColor(Color.green); 
    g.fillRect (
        (int)ground.getX(),
        (int)ground.getY(),
        (int)ground.getWidth(),
        (int)ground.getHeight()
    );  
    
    
    

    g.setColor(Color.black);
    g.fillRect((int)player.getX(),(int) player.getY(), (int)player.getWidth(), (int)player.getHeight());
}
public void redraw() {
    this.repaint();
}

public void jump() {
    //Makes player -=130;
    //than makes player +=130;
}

}
package com.cookie.clicker;
导入java.awt.EventQueue;
导入javax.swing.JFrame;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Rectangle;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.geom.Ellipse2D;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类ChromeOfflineGame扩展了JPanel{
公共静态定时器t;
静态int x=0;
静态积分y=900;
静态整数宽度=1920;
静态整数高度=250;
静态int pX=50;
静态int-pY=800;
静态int pW=50;
静态int pH=100;
静态矩形地面=新矩形(x、y、宽度、高度);
静态矩形播放器=新矩形(pX、pY、pW、pH);
静态JFrame=新JFrame();
公共ChromeOfflineGame(){
框架。设置未装饰(真实);
frame.addKeyListener(新的KeyAdapter(){
@凌驾
按下公共无效键(按键事件e){
int keyCode=e.getKeyCode();
if(keyCode==KeyEvent.VK_ESCAPE){
系统出口(0);
}else if(keyCode==KeyEvent.VK_空间){
if(player.getY(){
finder.redraw();
地面.立根(x,y,宽度,高度);
球员退场(pX,pY,pW,pH);
});
t、 start();
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
@凌驾
公共维度getPreferredSize(){
返回新维度(19201080);
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(Color.green);
g、 fillRect(
(int)接地。getX(),
(int)ground.getY(),
(int)ground.getWidth(),
(int)ground.getHeight()
);  
g、 设置颜色(颜色为黑色);
g、 fillRect((int)player.getX(),(int)player.getY(),(int)player.getWidth(),(int)player.getHeight());
}
公共无效重绘(){
这个。重新绘制();
}
公共跳转{
//使玩家-=130;
//使玩家+=130;
}
}

您必须以这样一种方式执行此操作,即您不会让ui线程等待跳转操作完成。计时器是一种方法。降低y坐标(一次全部或一次一点),当计时器被触发时,再次将其返回。使用计时器是有意义的,但问题是,如何停止它并使其返回?你能展示一些这样的代码示例吗?为什么你不试试计时器,如果你做不到,就用一个问题来回答你的尝试。