IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

[ShapeIntersect] Comment binder ?


Sujet :

JavaFX

  1. #1
    Candidat au Club
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut [ShapeIntersect] Comment binder ?
    Bonjour,

    Je développe actuellement une petite application en JavaFX et je rencontre un problème que je n'arrive pas à résoudre... Je m'explique. Je crée des lignes, que j'intersectionne ensuite avec diverses formes. Ces lignes sont censées bouger, je le fait sans problème lorsque je n'intersectionne rien du tout, mais dès que l'intersection est faite, plus rien ne bouge !

    Je vous donne le code que j'utilise :
    Code : 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
    import javafx.scene.shape.Rectangle;
    import javafx.scene.transform.Rotate;
    import javafx.animation.Timeline;
    import javafx.animation.KeyFrame;
    import javafx.animation.Interpolator;
     
    /**
     * @author Bastien Pietropaoli
     */
     
    public class SpecialLine {
     
        protected var stroke:Integer = 5;
        protected var length:Integer = 1000;
        protected var angle:Integer = 45;
        protected var x:Integer = 0;
        protected var y:Integer = 0;
     
        protected var line = Rectangle {
            x: bind x, y: bind y
            width: bind length, height: bind stroke;
            transforms: [Rotate { pivotX : 0.0, pivotY : 0.0, angle: bind angle }]
        }
     
        protected var animation = Timeline {
            repeatCount: Timeline.INDEFINITE
            keyFrames : [
                KeyFrame {
                    time : 2s
                    values : {[x => x+40 tween Interpolator.LINEAR
                              y => y+40 tween Interpolator.LINEAR]}
                }
            ]
        }
    }
    Code : 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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    import javafx.stage.*;
    import javafx.scene.*;
    import javafx.scene.shape.*;
    import javafx.animation.*;
     
    /**
     * @author Bastien Pietropaoli
     */
     
    /*
     * The circle in the center :
     */
    var circle = Circle {
        centerX: 320, centerY: 240
        radius: 100
    }
     
    /*
     * The four parts of the scene :
     */
    var rectTopLeft = Rectangle {
        x: 0, y: 0
        width: 320, height: 240
    }
    var rectTopRight = Rectangle {
        x: 320, y: 0
        width: 320, height: 240
    }
    var rectBottomLeft = Rectangle {
        x: 0, y: 240
        width: 320, height: 240
    }
    var rectBottomRight = Rectangle {
        x: 320, y: 240
        width: 320, height: 240
    }
     
    /*
     * The four lists of lines :
     */
    var topLeftLines:SpecialLine[] = for(i in [0..60]){
        SpecialLine{
            x: 100 - i*15
            y: 100 - i*15
            angle: -225
        }
    }
    var bottomLeftLines:SpecialLine[] = for(i in [0..60]){
        SpecialLine{
            x: 305 - i*15
            y: 305 - i*15
            angle: 45
        }
    }
    var topRightLines:SpecialLine[] = for(i in [0..60]){
        SpecialLine{
            x: 297 - i*15
            y: 297 - i*15
            angle: 45
        }
    }
    for(line in topRightLines){
        line.animation = Timeline {
            repeatCount: Timeline.INDEFINITE
            keyFrames : [
                KeyFrame {
                    time : 2s
                    values : {[line.x => line.x-40 tween Interpolator.LINEAR
                              line.y => line.y-40 tween Interpolator.LINEAR]}
                }
            ]
        };
    }
    var bottomRightLines:SpecialLine[] = for(i in [0..60]){
        SpecialLine{
            x: 108 - i*15
            y: 108 - i*15
            angle: -225
        }
    }
    for(line in bottomRightLines){
        line.animation = Timeline {
            repeatCount: Timeline.INDEFINITE
            keyFrames : [
                KeyFrame {
                    time : 2s
                    values : {[line.x => line.x-40 tween Interpolator.LINEAR
                              line.y => line.y-40 tween Interpolator.LINEAR]}
                }
            ]
        };
    }
     
    /*
     * The intersections :
     */
    var topLeftCorner = bind ShapeIntersect {
        a: [ShapeSubtract {
            a: rectTopLeft
            b: circle
        },ShapeSubtract {
            a : circle
            b : [rectTopLeft,rectTopRight,rectBottomLeft]
        }]
        b: bind [for(line in topLeftLines){line.line}]
    }
    var topRightCorner = bind ShapeIntersect {
        a: [ShapeSubtract {
            a: rectTopRight
            b: circle
        },ShapeSubtract {
            a : circle
            b : [rectTopLeft,rectBottomRight,rectTopRight]
        }]
        b: bind [for(line in topRightLines){line.line}]
    }
    var bottomLeftCorner = bind ShapeIntersect {
        a: [ShapeSubtract {
            a: rectBottomLeft
            b: circle
        },ShapeSubtract {
            a : circle
            b : [rectBottomLeft,rectBottomRight,rectTopLeft]
        }]
        b: bind [for(line in bottomLeftLines){line.line}]
    }
    var bottomRightCorner = bind ShapeIntersect {
        a: [ShapeSubtract {
            a: rectBottomRight
            b: circle
        },ShapeSubtract {
            a : circle
            b : [rectBottomLeft,rectBottomRight,rectTopRight]
        }]
        b: bind [for(line in bottomRightLines){line.line}]
    }
     
    /*
     * Just play the animation :
     */
    for(line in topLeftLines){line.animation.play()};
    for(line in topRightLines){line.animation.play()};
    for(line in bottomLeftLines){line.animation.play()};
    for(line in bottomRightLines){line.animation.play()};
     
    /*
     * The stage :
     */
    Stage {
        title: "Optical illusion"
        width: 640
        height: 480
        scene: Scene {
            content: //[for(line in topLeftLines){line.line}]
                     [topRightCorner
                     topLeftCorner
                     bottomLeftCorner
                     bottomRightCorner]
        }
    }
    Je suis persuadé que cela vient d'un problème de bind mal placé, j'ai essayé à peu près tout ce qu'il était possible de bind... J'avoue ne pas trouver la solution et je commence un peu à craquer :p

    Je vous préviens, le résultat pique un peu les yeux, c'est le but ;p

    Merci d'avance si certains peuvent m'aider !

  2. #2
    Membre éclairé Avatar de guitariste
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 245
    Par défaut
    salut.

    j'ai pas vraiment cherché dans tes codes ..mais ce que je remarque pour tes
    KeyFrames que tu utilises une seule keyFrame. Moi j'utilise une pour definir la position de depart et une pour la position finale (comme tu fais )

    je propose que tu ajoutes une keyFrame, a chaque fois, comme celle la :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    KeyFrame {
                    time : 0s
                    values : {[x => positionDepartX tween Interpolator.LINEAR
                              y => positionDepartY tween Interpolator.LINEAR]}
                }
    ou tu prescise dans la variable positionDepart l'etat initial de chaque variables.

    bon courage.

  3. #3
    Candidat au Club
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par défaut
    Effectivement, je n'ai pas mis de KeyFrame à l'instant t = 0s. C'est qu'en fait, j'ai remarqué que lorsqu'on ne précise pas de valeur initiale lors d'une Timeline, il lance l'interpolation à partir de t=0s tout seul, et donc, pas besoin de redéfinir la position de départ !

    En plus, du fait que je fais tourner l'application en boucle, il conserve tout seul la valeur initiale de x et de y.

    Le problème d'animation qui ne se fait pas lorsque j'intersectionne mes surfaces persiste, et j'avoue ne pas savoir pourquoi... J'ai essayé à peu près tous les binds possibles, j'ai essayé de préciser les KeyFrame, j'ai essayé tout à la fois et toutes les combinaisons possibles, rien n'y fait

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Yep les valeurs a 0s sont automatiquement defines sans avoir besoin de specifer la KeyFrame. Evidement, parfois ca vaut la peine de l'ecrire.

    Desole pas le temps ces jours-ci de voir et tester du JFX (je fais du C++ la).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 64
    Par défaut
    Je confirme, les opérations de CAG semblent faites une fois et pas mises à jour. Peut-être pour des raisons de performance (même histoire avec les dégradés).
    Démonstration :
    Code : 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
    var circle1 = Circle
    {
      centerX: 100
      centerY: 100
      radius:  50
    }
    var ellipse1 = Ellipse
    {
      centerX: 100
      centerY: 130
      radiusX: 30
      radiusY: bind tradius + 10
    }
     
    var circle2 = Circle
    {
      centerX: 200
      centerY: 100
      radius:  50
    }
    var ellipse2 = Ellipse
    {
      centerX: 200
      centerY: 130
      radiusX: 30
      radiusY: bind tradius + 10
    }
    var ellipse3 = Ellipse
    {
      centerX: 300
      centerY: 130
      radiusX: 30
      radiusY: bind tradius + 10
      fill: Color.LIGHTBLUE
    }
     
    // ShapeSubstract doesn't follow binding
    var shapeS = ShapeSubtract
    {
      a: circle1
      b: ellipse1
      fill: Color.LIGHTGREEN
    }
    var shapeI = ShapeIntersect
    {
      a: circle2
      b: ellipse2
      fill: Color.LIGHTGREEN
    }
     
    def BASE_SIZE = 300;
    def MARGIN = BASE_SIZE / 30;
    def RADIUS = BASE_SIZE / 2 - MARGIN * 4;
    var a = 0;
    Stage
    {
      title:   "ShapeXxx Test"
      visible: true
      scene:   Scene
      {
        width:   BASE_SIZE * 1.618
        height:  BASE_SIZE
        fill:    Color.web('#00BABE')
        content:
        [
          shapeS,
          shapeI,
          ellipse3
        ]
      }
    }
     
    var tradius;
    var animation = Timeline
    {
      keyFrames:
      [
        KeyFrame
        {
          time: 0s
          values: tradius => 10
        }
        KeyFrame
        {
          time: 10s
          values: tradius => 100
        }
      ]
    };
    animation.play();
    Tiens, je vois pas ça dans Kenai, je vais faire un bug... => RT-5524 (pas le droit de voir mon propre bug...)

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 900
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par PhiLho Voir le message
    je vais faire un bug... => RT-5524 (pas le droit de voir mon propre bug...)
    Yep ca m'arrive souvent ca... generalement apres qq jours ils le debloquent mais j'ai postee une Request for Enhancement concernant leur moteur d'i18n/l10n (qui fonctionne bien de base mais n'est pas vraiment gerable en l'etat si on utilise de TRES long messages -cause dupliquer le TRES long message dans tous les fichiers de traduc c'est la porte ouverte a toutes les erreurs lorsqu'on change le contenu du message- si on a pas un fichier de langue par defaut comme c'est le cas en Java), mais cette Rfe n'a jamais ete debloquee.

    J'ai bien peur qu'il ne faille faire un binding sur une valeur arbitraire suivie un on replace qui regenerera la forme en question (cote optimisation apparement faire comme ca est de toute maniere preferable a trop de binding directs).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Comment binder une table à un resultset.
    Par Evenmor dans le forum JSF
    Réponses: 2
    Dernier message: 20/05/2008, 10h00
  2. comment binder un dataList avec une ArrayList
    Par inno007 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 03/03/2008, 17h55
  3. [WPF][Binding] Comment binder un fichier XML sur un treeview?
    Par bakonu dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 26/11/2007, 17h09
  4. [WPF] Comment binder une sous-collection d'une collection ?
    Par BruceWayne dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 04/06/2007, 16h55
  5. Réponses: 2
    Dernier message: 09/08/2006, 03h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo