Java游戏角色移动太快

Java游戏角色移动太快,java,Java,所以我在做这个java 2d游戏是为了好玩。youtube上有人在做这件事,我只是在听他的教程。问题是,当我尝试移动我的角色时,它会在屏幕上快速移动。我的setVelX值为-1,但它的移动量远不止这个。我试着将输入移动速度提高到两倍,但如果速度提高到两倍,他就永远不会移动 public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); for(entity en: Game.handler.entity) {

所以我在做这个java 2d游戏是为了好玩。youtube上有人在做这件事,我只是在听他的教程。问题是,当我尝试移动我的角色时,它会在屏幕上快速移动。我的setVelX值为-1,但它的移动量远不止这个。我试着将输入移动速度提高到两倍,但如果速度提高到两倍,他就永远不会移动

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    for(entity en: Game.handler.entity)
    {
    switch(key){
    case KeyEvent.VK_W:
        if (en.jumping==false)
        {
            en.jumping = true;
            en.gravity = 10.0;
        }
        break;
    case KeyEvent.VK_S:
        break;
    case KeyEvent.VK_A:
        en.setVelX(-1);
        break;
    case KeyEvent.VK_D:
        en.setVelX(1);
        break;
    }
    }
主要集中在A或D上,以尝试降低速度

public void setVelX(double velX) {
    this.velX = velX;
}



public void tick() {
    x+=velX;


 while (running)
        {
            long now = System.nanoTime();
            delta+=(now-lastTime)/1000000000;
            lastTime = now;
            while(delta >= 1)
            { 
                tick();
                ticks++;
                delta--;
            }
            render();
            frames++;

            if (System.currentTimeMillis()-timer>1000)
            {
                timer+=1000;
                System.out.println(frames + " FPS " + ticks + " Updates/sec");
                frames = 0;
                ticks = 0;
            }
        }
        stop();
    }

我看过其他类似的问题,但我找不到任何有帮助的。角色的移动速度远远超过1格,角色的动画速度也非常快。

我认为你应该重置速度,因为每次添加速度时,他移动速度都非常快(25 FPS=25次移动),我建议你只使用25 FPS的线程睡眠,否则每帧都会执行此操作,这意味着一切都会发生得更快,所以看起来他移动的速度要比这快得多。代码:

 try {
 Thread.sleep(33); //FPS 25
 } catch(InterruptedException bug) {
 Thread.currentThread().interrupt();
 System.out.println(bug);
 }
在空白处打勾:

 VelX=0;
重置速度

但目前我也在开发一款相同类型的java游戏,因此我为您准备了一个“教程”

import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.EventQueue;

class Player {
     public float health;
     public float yvel;
     public float xvel;
     public float x;
     public float y;
     public BufferedImage image;
     public void work(Graphics g, int[] keys) {
         g.drawImage(image,(int)x,(int)y,null);
         if (keys[0]==1) { //Is the UP-Key pressed
             yvel=yvel-1;
         }
         if (keys[1]==1) { //Is the DOWN-Key pressed
             yvel=yvel+1;
         }
         if (keys[2]==1) { //Is the LEFT-Key pressed
             xvel=xvel-1;
         }
         if (keys[3]==1) { //Is the RIGHT-Key pressed
             xvel=xvel+1;
         }
         x=x+xvel;
         y=y+yvel;
         xvel=xvel-(xvel/4); //One fourth gets lost
         yvel=yvel-(yvel/4); //One fourth gets lost
     }

     public Player(BufferedImage imagew,float xw, float yw, float healthw) {
         x=xw;
         y=yw;
         image=imagew;
         health=healthw;
     }
}
public class Game extends JFrame implements KeyListener {
     public BufferedImage playerimage;
     public Player player;
     public int[] keys=new int[4];

     public void keyTyped(KeyEvent e) {
             if (e.getKeyCode() == KeyEvent.VK_UP) {
                 keys[0]=1;
             }
             if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                 keys[1]=1;
             }
             if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                 keys[2]=1;
             }
             if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                 keys[3]=1;
             }
     }
     public void keyReleased(KeyEvent e) { 
             if (e.getKeyCode() == KeyEvent.VK_UP) {
                 keys[0]=0;
             }
             if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                 keys[1]=0;
             }
             if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                 keys[2]=0;
             }
             if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                 keys[3]=0;
             }
     }
     public void keyPressed(KeyEvent e) {
             if (e.getKeyCode() == KeyEvent.VK_UP) {
                 keys[0]=1;
             }
             if (e.getKeyCode() == KeyEvent.VK_DOWN) {
                 keys[1]=1;
             }
             if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                 keys[2]=1;
             }
             if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                 keys[3]=1;
             }
             if (e.getKeyCode() == KeyEvent.VK_SPACE) {
                 keys[4]=1;
             }
     } 
     public Game(){
          super("Game");
          try {
          playerimage = ImageIO.read(getClass().getClassLoader().getResource("player.gif")); //Player Image
          } catch(IOException bug) {
          System.out.println(bug);
          }

          player=new Player(playerimage,100,100,100);

          addKeyListener(this);

          setTitle("Game");

          setContentPane(new Pane());

          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          setSize(800, 600);

          setResizable(false);

          setVisible(true); 

          while (true){
              repaint();
              try {
              Thread.sleep(33);
              } catch(InterruptedException bug) {
              Thread.currentThread().interrupt();
              System.out.println(bug);
              }
          }
     }


     class Pane extends JPanel{
        public Pane() {
        }
        public void paintComponent(Graphics g){
            player.work(g,keys);
        }   
     }
     public static void main(String args[]){
            new Game();
     }
}
这很好,因为当摩擦时,通常只有四分之一会丢失,所以它确实会在屏幕上“滑动”

这是摩擦图:速度梯度非常低


您应该考虑每秒渲染的帧数,并使用Thread.sleep使循环步态一致,以便在一致的时间片上渲染。否则,正如您所看到的,由于设备之间的处理速度差异,角色的速度将因设备而异。请不要只遵循任何YT教程,而不知道代码的具体功能。如果你不懂Java,那就去正确地学习Java吧。如果您了解Java,首先尝试使用调试输出。在您的情况下,您显然从未重置
velX
,这就是为什么角色移动的速度越来越快的原因。使用调试输出,您可能不需要在这里询问就可以知道您正在调用tick inside tick??那该怎么办??还有什么聪明的把戏吗?