java - Java 中简单的横向卷轴游戏出现滞后

标签 java swing timer lag side-scroller

我最近用 java 构建了我的第一个简单的横向卷轴游戏,但我遇到了一些滞后,我不知道为什么。当我向侧面移动角色时,它的速度似乎正在改变,大多数时候速度很快,但有时会减慢。这使得游戏的感觉非常奇怪。我希望有人能在这里为我指明正确的方向,我将在下面发布我的类(class):

主类:

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;
            }
        }

}

最佳答案

定时器没有实时保证。因此,您应该计算与上次调用移动的时间差,并将其乘以您移动的量。它会使数字变小,所以我会添加另一个常量以使其变大。实际上,最好在 actionPerformed(或其他流程方法)中获取时间增量,并将其传递给所有流程或移动方法,以便所有内容都使用相同的时间增量移动。

关于java - Java 中简单的横向卷轴游戏出现滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8608544/

相关文章:

java - 创建包含数据库值的列表并将其存储在 DTO 中

java - 如何在 Sparkjava 中启动服务器?

java - 为什么即使在设置 JPanel 的大小后,我的框布局也会更改大小

python - 我可以在 Python 中同时运行多个计时器吗?

java - 使用 DropWizard 计时器查找代码块的执行时间

c# - 计时器线程进入休眠状态会发生什么

java - GMT0 区域解析

java - 为什么要给一个JLabel加上JPanel,什么情况下会出现这种情况呢?

java - 借鉴Java重量级swing组件

java - 在窗口最大化的情况下启动 Eclipse 3.x RCP 应用程序?