如何在游戏中避免对子弹的“机枪”效应?

时间:2014-10-03 23:26:44

标签: javafx sprite keyevent eventhandler

前几天我问过这个问题:  How to have multiple instances on the screen of the same sprite at the same time with javafx2 并部分解决了阐述珠宝的建议的问题。

我现在有这个障碍:当按下一把钥匙来“射击”子弹时,武器射击子弹和机枪一样快。 我想限制我的游戏英雄的武器可以射击的子弹数量......例如,决定每0.5秒射击一颗子弹,或者只是按下一把钥匙,而不是总是有机枪效果。 .. 在我的游戏中,控制“火”效果的程序部分是这样的:

        scene.setOnKeyTyped(new EventHandler<KeyEvent>() {  
            @Override  
            public void handle(KeyEvent event2) {  

            if (event2.getCode()==KeyCode.F); { .........

在我尝试使用setOnKeyPressed和setOnKeyReleased以及相同的结果之前.. 那么我还可以尝试射击子弹同时按下“F”键或限制子弹的数量? 提前谢谢你,再见!

1 个答案:

答案 0 :(得分:0)

我已经通过使用Timeline作为计时器并启动它并在按下的键和键释放时停止它来完成此操作:

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class KeyEventTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        Pane root = new Pane();
        Scene scene = new Scene(root, 400, 400);

        Duration firingInterval = Duration.millis(500);
        Timeline firing = new Timeline(
                new KeyFrame(Duration.ZERO, event -> fire()),
                new KeyFrame(firingInterval));
        firing.setCycleCount(Animation.INDEFINITE);

        scene.setOnKeyPressed(event -> {
            if (event.getCode() == KeyCode.F && firing.getStatus() != Animation.Status.RUNNING) {
                firing.playFromStart();
            }
        });

        scene.setOnKeyReleased(event -> {
            if (event.getCode() == KeyCode.F) {
                firing.stop();
            }
        });

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void fire() {
        // dummy implementation:
        System.out.println("Fire!");
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这很容易适应这一点,以便随时限制屏幕上的项目符号数量等。