2014-10-03 3 views
1

Несколько дней назад я спросил: How to have multiple instances on the screen of the same sprite at the same time with javafx2 и частично решил вопрос, излагая предложение jewelsea.Как избежать эффекта «пулемета» для пуль в моей игре?

У меня есть это препятствие сейчас: когда нажата клавиша «стрелять» пулями, стрелять оружием так же быстро, как пулемет. Я хотел бы ограничить количество пуль, что оружие героя моего игра может стрелять .. например, чтобы решить стрелять пулей каждые 0,5 секунды или просто при нажатии клавиши и не всегда иметь эффект пулемета ... В моей игре часть программы, которая управляет эффектом «огонь» как это:

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

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

Прежде чем я пробовал также с использованием setOnKeyPressed и setOnKeyReleased с теми же результатами .. Так что я мог попытаться стрелять только пули также держать прессу клавишу «F» или ограничить количество пуль в номере? Спасибо заранее и до свидания!

+0

Хорошо, я думаю, что альтернативы: ограничить количество пуль (они будут стрелять быстрее, если вы стреляете ближе к чему-то, что их устраняет, например стены), только обнаруживать ключ от события, отключать звук код за время (с использованием таймера) после выстрела пули ... Но я просто догадываюсь, так как я не знаю javafx. – Elric

ответ

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

Это довольно легко адаптировать это дополнительно ограничить количество пуль на экран в любое время и т. д.