[JAVA FX] Actualiser une Variable pendant une compilation !

Actualiser une Variable pendant une compilation ! [JAVA FX] - Java - Programmation

Marsh Posté le 15-04-2020 à 16:35:06    

Bonjour / Bonsoir !
 
J'ai commencer Java Fx, et j'ai plutôt bien avancer sur le projet que je dois faire, seulement y'a 1 seul petit problème qui persiste et je n'arrive pas à le régler.
 
Objectif du projet : Faire une animation Java FX ou une balle rebondit partout sur l'écran, et ou sa taille et sa vitesse varie continuellement.
 
Vous verrez mon code en dessous.
 
J'arrive à tous faire, sauf à faire varier la vitesse de ma balle.
Enfaîte le problème est plutôt bête, puisque quand je compile, ma balle à une vitesse prédéfinis par ma fonction " speedVariation() ", sauf qu'une fois le programme compilé, elle garde cette même vitesse...
 
Je voudrais que ma variable vitesse change tous les x secondes par exemples quand le programme est lancé !  
 
Voici mon code ::

Code :
  1. package application;
  2. import javafx.animation.Interpolator;
  3. import javafx.animation.KeyFrame;
  4. import javafx.animation.ScaleTransition;
  5. import javafx.animation.Timeline;
  6. import javafx.animation.TranslateTransition;
  7. import javafx.application.Application;
  8. import javafx.event.ActionEvent;
  9. import javafx.event.EventHandler;
  10. import javafx.geometry.Bounds;
  11. import javafx.scene.Scene;
  12. import javafx.scene.layout.Border;
  13. import javafx.scene.layout.BorderPane;
  14. import javafx.scene.paint.Color;
  15. import javafx.scene.shape.Circle;
  16. import javafx.stage.Stage;
  17. import javafx.util.Duration;
  18. public class Main extends Application {
  19. public boolean speedVariation() {
  20.  int number = (int) (1 + (Math.random()*((100-1)+1)));
  21.  if (number>=50) {
  22.   return true;
  23.  };
  24.  return false;
  25. }
  26. @Override
  27. public void start(Stage primaryStage) {
  28.  try {
  29.   BorderPane root = new BorderPane();
  30.   Scene scene = new Scene(root, 1280, 660, Color.YELLOW);
  31.   Circle cercle = new Circle(20, Color.RED);
  32.   Bounds bounds = root.getBoundsInLocal();
  33.   ScaleTransition scaleAnimation = new ScaleTransition(Duration.seconds(1), cercle);
  34.   cercle.relocate(10, 10);
  35.   root.getChildren().add(cercle);
  36.   primaryStage.setTitle("JavaFx Project" );
  37.   primaryStage.setScene(scene);
  38.   primaryStage.show();
  39.   // Here there are the different functions for my ball to change size continuously
  40.   scaleAnimation.setAutoReverse(true);
  41.   scaleAnimation.setCycleCount(Timeline.INDEFINITE);
  42.   scaleAnimation.setFromX(1);
  43.   scaleAnimation.setToX(2);
  44.   scaleAnimation.setFromY(1);
  45.   scaleAnimation.setToY(2);
  46.   scaleAnimation.setInterpolator(Interpolator.LINEAR);
  47.   scaleAnimation.play();
  48.   Timeline timeline = new Timeline(new KeyFrame(Duration.millis(20), new EventHandler<ActionEvent>() {
  49.    double dx = speedVariation() ? 8 : 1;
  50.    double dy = speedVariation() ? 8 : 1;
  51.    // Fr : La balle bouge et rebondit / En : My ball move and bounces  
  52.    @Override
  53.    public void handle(ActionEvent t) {
  54.     cercle.setLayoutX(cercle.getLayoutX() + dx);
  55.     cercle.setLayoutY(cercle.getLayoutY() + dy);
  56.     // Si la balle touche le mur de droit ou de gauche, elle rebondit
  57.     if (cercle.getLayoutX() <= (bounds.getMinX() + cercle.getRadius())
  58.       || cercle.getLayoutX() >= (bounds.getMaxX() - cercle.getRadius())) {
  59.      dx = -dx;
  60.     }
  61.     // Si la balle touche le mur de bas ou du haut, elle rebondit
  62.     if ((cercle.getLayoutY() >= (bounds.getMaxY() - cercle.getRadius()))
  63.       || (cercle.getLayoutY() <= (bounds.getMinY() + cercle.getRadius()))) {
  64.      dy = -dy;
  65.     }
  66.    }
  67.   }));
  68.   timeline.setCycleCount(Timeline.INDEFINITE);
  69.   timeline.play();
  70.  } catch (Exception e) {
  71.   e.printStackTrace();
  72.  }
  73. }
  74. public static void main(String[] args) {
  75.  launch(args);
  76. }
  77. }


 
 
J'espère que mon code est plutôt clair, et je vous remercie déjà pour l'attention que vous allez apporter à mon problème.
Xameal.

Reply

Marsh Posté le 15-04-2020 à 16:35:06   

Reply

Marsh Posté le 16-04-2020 à 11:13:17    

j'y connais pas grand chose en java mais deux choses :
 
tu devrais rajouter 2 variables vx et vy (qui seront les vitesse en x et y  du cercle)
dx et dy ne doivent valoir que -1 ou 1
et tu auras :
cercle.setLayoutX(cercle.getLayoutX() + dx*vx);
cercle.setLayoutY(cercle.getLayoutY() + dy*vy);
 
comme ça, le changement de vitesse n'affectera pas la direction du cercle
il faudra aussi modifier :

Code :
  1. double dx = speedVariation() ? 8 : 1;
  2. double dy = speedVariation() ? 8 : 1;


 
par
 

Code :
  1. double vx = speedVariation() ? 8 : 1;
  2. double vy = speedVariation() ? 8 : 1;


 
sortir ces 2 lignes du timeline, et les ajouter dans un new keyframe avec duration = 1000ms par exemple
(enfin ça c'est d'apres ce que j'ai pu comprendre de javafx)
 

Reply

Marsh Posté le 17-04-2020 à 13:52:17    

En général, quand on utilise une fonction random dans les langages de dév, faut souvent initialiser le générateur de nb aléatoires (généralement via la date/heure du PC). Sinon, à chaque lancement, c'est la même séquence de nb qui sort.
 
Et j'ai pas trop compris l'intérêt de faire ((100-1)+1)  :whistle:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 20-04-2020 à 18:52:39    

Pour faire 99* le chiffre de Math Random si ma mémoire est bonne :), j'ai désormais réussi en m'inspirant de "citation", et oui j'ai initialiser à la valeur " temps " du PC pour le random.  
Et j'ai aussi trouvé une autre méthode pour les intéressés : TranslateTransition(), elle marche plutôt bien aussi.
 
Merci à vous pour vos réponses, je vous souhaite une bonne journée, et une bonne santé en ce confinement !
 

Reply

Marsh Posté le 20-04-2020 à 18:54:27    

((100-1)+1) ça fait 100, pas 99 :D
Si tu veux faire 99* ben mais le directement.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-04-2020 à 10:01:08    

Il veut un chiffre de 1 à 100 alors que Random renvoie 0 à 1, il s'est juste trompé dans ses parenthèse...


---------------
D3
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed