Java中简单的侧滚游戏中的延迟
我最近用java开发了我的第一个简单的侧滚游戏,但是我遇到了一些延迟,我不知道为什么。当我侧向移动我的角色时,它似乎在改变速度,大多数时候速度很快,但有时会变慢。这让比赛的感觉很奇怪。我希望有人能在这里为我指出正确的方向,我将在下面发布我的课程: 主要类别:Java中简单的侧滚游戏中的延迟,java,swing,timer,lag,side-scroller,Java,Swing,Timer,Lag,Side Scroller,我最近用java开发了我的第一个简单的侧滚游戏,但是我遇到了一些延迟,我不知道为什么。当我侧向移动我的角色时,它似乎在改变速度,大多数时候速度很快,但有时会变慢。这让比赛的感觉很奇怪。我希望有人能在这里为我指出正确的方向,我将在下面发布我的课程: 主要类别: public class MainGame { public static void main(String[] args) { Frame frame = new Frame(); } } 框架类别:
public class MainGame {
public static void main(String[] args) {
Frame frame = new Frame();
}
}
框架类别:
import javax.swing.JFrame;
public class Frame extends JFrame{
public Frame(){
add(new Board());
setTitle("2-D Test Game");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800,325);
this.setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}
}
董事会级别:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Board extends JPanel implements ActionListener{
private Player p;
private Timer timer;
private Image background;
public Board(){
super();
p = new Player();
addKeyListener(new ActionListener());
setFocusable(true);
ImageIcon i = new ImageIcon("C:/test.png");
background = i.getImage();
timer = new Timer(5,this);
timer.start();
}
public void actionPerformed(ActionEvent arg0) {
p.move();
repaint();
}
public void paint(Graphics g){
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(background,p.nx,0,null);
g2d.drawImage(p.getImage(), 350, p.getY(), null);
}
private class ActionListener extends KeyAdapter{
public void keyReleased(KeyEvent e){
p.keyReleased(e);
}
public void keyPressed(KeyEvent e){
p.keyPressed(e);
}
}
}
球员级别:
import java.awt.Image;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Player {
private Image img;
int x,y,dx,dy,nx;
long time;
private final int SPEED = 2;
private final int GRAV = 1;
boolean left,right,isJumping;
public Player(){
ImageIcon i = new ImageIcon("C:/plager.png");
img = i.getImage();
x = 350;
y = 160;
dx = 0;
dy = 0;
nx = 0;
left = false;
right = false;
isJumping = false;
}
public void move(){
x += dx;
nx = (nx-dx);
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public Image getImage(){
return img;
}
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
if(code == KeyEvent.VK_LEFT){
left = false;
if(right){
dx = SPEED;
}else{
dx = 0;
}
}else if(code == KeyEvent.VK_RIGHT){
right = false;
if(left){
dx = -SPEED;
}else{
dx = 0;
}
}
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == KeyEvent.VK_LEFT){
left = true;
dx = -SPEED;
}else if(code == KeyEvent.VK_RIGHT){
right = true;
dx = SPEED;
}
}
}
计时器没有实时保证。因此,您应该计算与上次调用move的时间差,并将其乘以您正在移动的数量。它将使数字变小,因此我将添加另一个常量使其变大。实际上,最好在actionPerformed(或其他流程方法)中获取时间增量,并将其传递给所有流程或移动方法,以便所有操作都使用相同的时间增量进行移动。在设置
计时器时,您是否尝试过使用更高的ms值?通常,计时的准确度不低于15毫秒左右。多线程还可能带来一些潜在的复杂性:dx
在关键事件的Swing事件调度线程(EDT)上更改,但它也用于Player.move()
的计时器线程。计时器线程中的dx
值可能不是最新的。然而,由于你的角色确实在移动,但不是以正确的速度移动,你的主要问题可能是其他的,比如上面提到的计时器不准确。使用AtomicInteger dx
可以解决同步问题。这确实是一个计时问题,当我设置一个更高的值时,问题就消失了。非常感谢你!我要提醒你,这可能是一个短期解决方案,你应该在移动计算中使用时间的变化。