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