Java交换机案例延迟
我正在编写一个2d小游戏。事实上,我正忙于跳跃功能。当我按下向上箭头键时,我想让我的播放器跳起来。我设法让他跳了起来,但至少延迟了一秒钟。对于其他操作(如向左或向右移动),此dealy不存在。你知道它是从哪里来的吗 跳跃的代码在keyReaction方法中Java交换机案例延迟,java,switch-statement,Java,Switch Statement,我正在编写一个2d小游戏。事实上,我正忙于跳跃功能。当我按下向上箭头键时,我想让我的播放器跳起来。我设法让他跳了起来,但至少延迟了一秒钟。对于其他操作(如向左或向右移动),此dealy不存在。你知道它是从哪里来的吗 跳跃的代码在keyReaction方法中 public class John<I> extends AbstractGame<I> { //lists List<ImageObject<I>> floor = new ArrayList
public class John<I> extends AbstractGame<I> {
//lists
List<ImageObject<I>> floor = new ArrayList<>();
//variables
double jumpHeight = 0;
//boolean
boolean jump = false;
//fix values
int blockHeight = 40;
int blockWidth = 40;
public John(double width, double height) {
//getPlayer()
super(new ImageObject<>("player.png", new Vertex(120, height - 200), new Vertex(0, 0)), width, height);
//floor objects
for(int i=0; i<getWidth(); i+=blockWidth)
floor.add(new ImageObject<>("brick.png", new Vertex(i, getHeight() - blockHeight)));
//add arrays to canvas
getGOss().add(floor);
}
@Override
public void doChecks() {
for(ImageObject<I> f:floor) {
//gravity
if(!(jump) && !(getPlayer().touches(f)))
getPlayer().getMotion().y++;
//stop y-motion on ground
if(getPlayer().touches(f)){
getPlayer().getPos().y = getHeight() - blockHeight - getPlayer().getHeight();
getPlayer().getMotion().y = 0;}
}
}
@Override
public boolean isStopped(){
return false;
}
@Override
public void keyReaction(KeyCode keycode){
switch (keycode) {
//move left
case LEFT_ARROW:
getPlayer().getMotion().x = -2;
break;
case VK_A:
getPlayer().getMotion().x = -2;
break;
//move right
case RIGHT_ARROW:
getPlayer().getMotion().x = 2;
break;
case VK_D:
getPlayer().getMotion().x = 2;
break;
//jump
case UP_ARROW:
jump = true;
if(jumpHeight < 100){
jumpHeight += 5;
getPlayer().getPos().y -=5;
} else if (jumpHeight < 200){
jumpHeight +=5;
getPlayer().getPos().y +=5;
}
break;
case VK_W:
break;
case SPACE:
break;
}
}
@Override
public void keyReactionReleased(KeyCode keycode){
switch (keycode) {
//move left
case LEFT_ARROW:
getPlayer().getMotion().x = 0;
break;
case VK_A:
getPlayer().getMotion().x = 0;
break;
//move right
case RIGHT_ARROW:
getPlayer().getMotion().x = 0;
break;
case VK_D:
getPlayer().getMotion().x = 0;
break;
//jump
case UP_ARROW:
jump = false;
jumpHeight = 0;
break;
case VK_W:
jump = false;
break;
case SPACE:
break;
}
}
//test main
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new SwingScreen(new John<>(1800, 600)));
f.pack();
f.setVisible(true);
}
}
关键反应:
setOnKeyPressed((ev)->{
logic.keyReaction(KeyCode.fromCode(ev.getCode().impl_getCode()));
ev.consume();
});
setOnKeyReleased((ev)->{
logic.keyReactionReleased(KeyCode.fromCode(ev.getCode().impl_getCode()));
ev.consume();
});
在你的跳跃高度方法中,你有
jump = true;
if(jumpHeight < 100){
jumpHeight += 5;
getPlayer().getPos().y -=5;
} else if (jumpHeight < 200){
jumpHeight +=5;
getPlayer().getPos().y +=5;
}
break;
jump=true;
如果(跳线高度<100){
跳跃高度+=5;
getPlayer().getPos().y-=5;
}否则,如果(跳线高度<200){
跳跃高度+=5;
getPlayer().getPos().y+=5;
}
打破
在第4行中,位置a-=5。可能还有另一种方法可以防止YPO低于0。然后你按下向上箭头,它被发送了40次(200/5),最终跳跃高度大于200,然后玩家才开始向上移动 这与switch语句无关。当你使用它时,没有神奇的延迟感谢你的回答。我的球员在跳跃前的位置是y=560。当向上箭头键激活时,播放机应移到屏幕的上方。我注释掉了doChecks()中的所有方法,以查看我的类中是否存在阻止玩家移动的其他方法。jumpheight是我在类文件顶部声明的一个变量。它应该从0开始,在+5步中计数,如果达到200,则重置。如果我删除它周围的“如果”,该功能会立即工作。如果我把一个类似于1==1的条件作为条件,它甚至有一个延迟。你能用“如果”和“没有”来发布你的代码吗?把它添加到我的StartPost中jumpheight变量的用途是什么它超过了40,但你从不重置它?
setOnKeyPressed((ev)->{
logic.keyReaction(KeyCode.fromCode(ev.getCode().impl_getCode()));
ev.consume();
});
setOnKeyReleased((ev)->{
logic.keyReactionReleased(KeyCode.fromCode(ev.getCode().impl_getCode()));
ev.consume();
});
jump = true;
if(jumpHeight < 100){
jumpHeight += 5;
getPlayer().getPos().y -=5;
} else if (jumpHeight < 200){
jumpHeight +=5;
getPlayer().getPos().y +=5;
}
break;