IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

tondeurh

JavaFX Demo BouncingBall avec les effets 3D JavaFX

Noter ce billet
par , 25/05/2016 à 22h28 (1207 Affichages)
Ci dessous une démo réalisée en JavaFX :

Une application qui montre une BouncingBall avec images de fond et sphère 3D et effet Phong en moins de 80 lignes.

Nom : 2016-05-25_22h18_05.png
Affichages : 1573
Taille : 720,3 Ko

Téléchargez cette démo, le code source projet Netbeans se trouve sur le github à l'adresse suivante :
https://github.com/tondeur-h/JFXBouncingBall

A j'oubliai, j'ai intégré à l'intérieur de cette appli un moteur d'interprétation du langage Groovy, qui permet de lire un script externe Groovy, d'initialiser des variables que l'on passe directement à notre application (juste pour tester!).

Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
 
package jfxbouncingball;
 
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import groovy.util.ResourceException;
import groovy.util.ScriptException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.paint.PhongMaterial;
import javafx.scene.shape.Sphere;
import javafx.stage.Stage;
import javafx.util.Duration;
 
 
public class JFXBouncingBall extends Application {
 
   // public static Circle ball;
    public static Sphere ball;
    public static Pane canvas;
    double deltaX=3;
    double deltaY=3;
 
    @Override
    public void start(final Stage primaryStage) {
 
        try {
            //**********************************************************
            Binding sharedVar=new Binding();
            String pathScript=System.getProperty("user.dir");
            GroovyScriptEngine engine=new GroovyScriptEngine(pathScript);
            sharedVar.setVariable("imgNumber", "1");
            sharedVar.setVariable("vitesse", 10);
            sharedVar.setVariable("ballRayon", 10);
            engine.run("monScript.groovy", sharedVar);
            int numimg=Integer.parseInt(sharedVar.getVariable("imgNumber").toString(),10);
            int vitesse=Integer.parseInt(sharedVar.getVariable("vitesse").toString(),10);
            int ballRayon=Integer.parseInt(sharedVar.getVariable("ballRayon").toString(),10);
 
            //***********************************************************
 
            canvas = new Pane();
            Image img=new Image(getClass().getResourceAsStream("bball"+numimg+".jpg"));
            ImageView imgv=new ImageView(img);
 
            final Scene scene = new Scene(canvas, 800, 450);
 
            primaryStage.setResizable(false);
 
            primaryStage.setTitle("Boucing Ball JavaFX");
            primaryStage.setScene(scene);
            primaryStage.show();
 
            //ball = new Circle(10, Color.BLUEVIOLET);
            ball=new Sphere(ballRayon);
            PhongMaterial phong=new PhongMaterial();
            phong.setSpecularMap(new Image(getClass().getResourceAsStream("imp32.jpg")));
            phong.setDiffuseMap(new Image(getClass().getResourceAsStream("imp32.jpg")));
            //phong.setSelfIlluminationMap(new Image(getClass().getResourceAsStream("imp32.jpg")));
 
            phong.setSpecularPower(1.0);
            ball.setMaterial(phong);
 
            ball.relocate((int)(Math.random()*700), (int)(Math.random()*400));
 
            canvas.getChildren().addAll(imgv,ball);
 
            final Timeline boucle = new Timeline(new KeyFrame(Duration.millis(vitesse), (final ActionEvent t) -> {
                ball.setLayoutX(ball.getLayoutX() + deltaX);
                ball.setLayoutY(ball.getLayoutY() + deltaY);
 
                final Bounds limites = canvas.getBoundsInLocal();
                final boolean atRightBorder = ball.getLayoutX() >= (limites.getMaxX() - ball.getRadius());
                final boolean atLeftBorder = ball.getLayoutX() <= (limites.getMinX() + ball.getRadius());
                final boolean atBottomBorder = ball.getLayoutY() >= (limites.getMaxY() - ball.getRadius());
                final boolean atTopBorder = ball.getLayoutY() <= (limites.getMinY() + ball.getRadius());
 
                if (atRightBorder || atLeftBorder) {
                    deltaX *= -1;
                }
                if (atBottomBorder || atTopBorder) {
                    deltaY *= -1;
                }
            }));
 
            boucle.setCycleCount(Timeline.INDEFINITE);
            boucle.play();
        } catch (IOException | ResourceException | ScriptException ex) {
            Logger.getLogger(JFXBouncingBall.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
 
    public static void main(final String[] args) {
        launch(args);
    }
}


et le petit script Groovy, vraiment très simple qui permet d'initialiser les variables :
int numimg=Integer.parseInt(sharedVar.getVariable("imgNumber").toString(),10);
int vitesse=Integer.parseInt(sharedVar.getVariable("vitesse").toString(),10);
int ballRayon=Integer.parseInt(sharedVar.getVariable("ballRayon").toString(),10);
Code Groovy : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
imgNumber=2
//*****************
imgNumber=(int)(Math.random()*10)
if (imgNumber>3) imgNumber=3
if (imgNumber<=0) imgNumber=1

//*****************

vitesse=(int)(Math.random()*50)
ballRayon=(int)(Math.random()*30)

println ("Numero d'image : "+imgNumber)
println ("Vitesse : "+vitesse)
println ("Rayon : "+ballRayon)

Ce petit script permet de donner une taille aléatoire à la balle, ainsi que sa vitesse, et d'afficher aléatoirement une image de fond différente à chaque démarrage de l'application...

Groovy est vraiment sympa également...

FIN

Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog Viadeo Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog Twitter Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog Google Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog Facebook Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog Digg Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog Delicious Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog MySpace Envoyer le billet « JavaFX Demo BouncingBall avec les effets 3D JavaFX » dans le blog Yahoo

Commentaires