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

3D Java Discussion :

[JMonkey 3] Question sur JME 3 Tutorial (4) - Hello Update Loop


Sujet :

3D Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [JMonkey 3] Question sur JME 3 Tutorial (4) - Hello Update Loop
    Bonjour,

    j'essaie de suivre le tutoriel suivant:
    http://jmonkeyengine.org/wiki/doku.p...ain_event_loop

    Dans la section "Exercice", point 3 - Can you make a cube that pulsates? (grows and shrinks), je ne vois pas du tout comment y arriver.
    Je pensais d'un point de vue algo procéder de la manière suivante:
    - Mesurer le temps (je ne sais pas de quelle manière, avec la variable tpf ?)
    - déclarer un attribut dans ma classe HelloLoop de type Interger (Par exemple, Interger grow) pour dire si mon cube (Par exemple: Geometry cube) doit grossir ou rétrécir
    - Si le temps écoulé est de 1 seconde, alors
    Si "grow" = 1, la taille du cube augmente de 10% (Par exemple: cube.scale(1.10f));
    Si "grow" = -1, la taille du cube diminue de 10% (Par exemple: cube.scale(0.90f));
    j'incrémente un compteur (Par exemple: i += 1)
    Si "i" > 5, alors
    i = 0;
    "grow" = "grow" x -1;

    La limite de cet algo:
    - Je ne sais pas si se baser sur le "temps écoulé" est un bonne chose (précision sur une longue série d'exécution du code).
    - Ajouter 10%, puis retirer 10%, n'est pas forcément juste. Si la base "100" est la taille de mon objet initial c'est bon, mais si je retire les 10% à l'objet "grossit", je ne retrouverai pas la taille initiale.

    Je veux bien de l'aide sur la technique (comment l'écrire) mais aussi sur la bonne façon de répondre au problème (je ne trouve pas ma méthode correcte)

    Bonne soirée.
    Salokine.

  2. #2
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 816
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 816
    Points : 7 648
    Points
    7 648
    Par défaut
    Salut

    Citation Envoyé par salokine Voir le message
    - Ajouter 10%, puis retirer 10%, n'est pas forcément juste. Si la base "100" est la taille de mon objet initial c'est bon, mais si je retire les 10% à l'objet "grossit", je ne retrouverai pas la taille initiale.
    Tout à fait. Ce qui est normal, vu que l'inverse de "multiplier par 1.10", ce n'est pas "multiplier par 0.9", mais plutôt "diviser par 1.10"...
    Et là de suite, ça fonctionne beaucoup mieux!

    Pour le reste... pourquoi pas? Il faudrait voir comment tu gères le temps écoulé...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [RESOLU]
    Merci pour la règle mathématique !

    Voici mon exemple de méthode "SimpleUpdate", mais rien n'empêche de proposer une autre façon de faire !

    Salokine

    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
     
    package jme3test.helloworld;
     
    import com.jme3.app.SimpleApplication;
    import com.jme3.font.BitmapText;
    import com.jme3.material.Material;
    import com.jme3.math.ColorRGBA;
    import com.jme3.math.Vector3f;
    import com.jme3.scene.Geometry;
    import com.jme3.scene.shape.Box;
     
    /** Sample 4 - how to trigger repeating actions from the main update loop.
     * In this example, we make the player character rotate. */
    public class HelloLoop extends SimpleApplication {
     
        final static long timeElapsedMax = 20;
        protected Geometry objectBlue;
        protected Geometry objectGreen;
        protected Integer isGrow = 1;
        protected Integer objectGrowNumberCurrent = 0;
        protected Integer objectScaleLimitMax = 50;
        protected BitmapText labelText;
        protected Integer loopNumberFromBegin = 0;
        protected long timeApplicationCurrent;
        protected long timeApplicationCheckPoint;
        protected float objectGrowPercent = 2;
        protected float coefGrown;
        protected float coefReduce;
        protected String textTitle;
     
        public static void main(String[] args) {
            HelloLoop app = new HelloLoop();
            app.start();
        }
     
        @Override
        public void simpleInitApp() {
     
            //Création du cube blue
            Box b = new Box(Vector3f.ZERO, 1, 1, 1);
            objectBlue = new Geometry("blue cube", b);
            Material mat = new Material(assetManager,
                    "Common/MatDefs/Misc/Unshaded.j3md");
            mat.setColor("Color", ColorRGBA.Blue);
            objectBlue.setMaterial(mat);
            objectBlue.move(new Vector3f(-2, 0, 0));
            rootNode.attachChild(objectBlue);
     
            //Création du cube vert
            Box b2 = new Box(Vector3f.ZERO, 1, 1, 1);
            objectGreen = new Geometry("green cube2", b2);
            Material mat2 = new Material(assetManager,
                    "Common/MatDefs/Misc/Unshaded.j3md");
            mat2.setColor("Color", ColorRGBA.Green);
            objectGreen.setMaterial(mat2);
            objectGreen.move(new Vector3f(2, 0, 0));
            rootNode.attachChild(objectGreen);
     
            // Display a line of text with a default font
            guiNode.detachAllChildren();
            guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
            labelText = new BitmapText(guiFont, false);
            labelText.setSize(guiFont.getCharSet().getRenderedSize());
            labelText.setText("Hello World");
            labelText.setLocalTranslation(300, labelText.getLineHeight(), 0);
            guiNode.attachChild(labelText);
     
            //Initialisation des coefficients de redimensionnement
            coefGrown = 1 + (objectGrowPercent / 100);
            coefReduce = 1 / coefGrown;
     
            //Initialisation de la mesure du temps:
            timeApplicationCheckPoint = System.currentTimeMillis();
        }
     
        /* This is the update loop */
        @Override
        public void simpleUpdate(float tpf) {
     
            //Récupération du temps système
            timeApplicationCurrent = System.currentTimeMillis();
     
            //Détermination du temps écoulé depuis la dernière boucle
            long timeElapsed = timeApplicationCurrent - timeApplicationCheckPoint;
     
            //Si le temps écoulé est suffisant, réalisation des tâches suivantes
            if (timeElapsed >= HelloLoop.timeElapsedMax) {
     
                //Incrémentaton du compteur de boucle
                loopNumberFromBegin += 1;
                textTitle = "Boucle n°" + loopNumberFromBegin.toString();
     
                //Doit-on agrandir ou diminuer le cube ?
                switch (isGrow) {
     
                    //Agrandissement du cube
                    case 1:
                        objectBlue.scale(coefGrown);
                        labelText.setText(textTitle + " - " + "Agrandissement");
                        break;
     
                    //Réduction du cube    
                    case -1:
                        objectBlue.scale(coefReduce);
                        labelText.setText(textTitle + " - " + "Réduction");
                        break;
                }
                //Incrémentation du nombe de fois qu'on vient de réaliser
                //la même opréation
                objectGrowNumberCurrent += 1;
     
                //A-t-on réalisé suffisament de fois la même opréation ?
                if (objectGrowNumberCurrent == objectScaleLimitMax) {
     
                    //On inverse le sens (agrandissement <-> réduction
                    isGrow *= -1;
     
                    //On réinitialise le compteur d'opération
                    objectGrowNumberCurrent = 0;
                }
     
                //Enregistrement du temps écoulé
                timeApplicationCheckPoint = timeApplicationCurrent;
            }
            objectBlue.rotate(2 * tpf, 0, 2 * tpf);
            objectGreen.rotate(-2 * tpf, 0, -2 * tpf);
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur tutorial sur Word, Access et Outlook.
    Par hayabusa63 dans le forum Microsoft Office
    Réponses: 1
    Dernier message: 11/08/2009, 23h26
  2. Importer des packages non standard et question sur JME
    Par juju0287 dans le forum Java ME
    Réponses: 3
    Dernier message: 02/11/2008, 21h35
  3. Question sur le tutorial de traduction
    Par gudul dans le forum Delphi
    Réponses: 2
    Dernier message: 06/07/2006, 15h10
  4. Question sur le Tutorial d'instalation de TDLPortIO...
    Par G-DiE dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/02/2004, 09h08
  5. Réponses: 2
    Dernier message: 11/08/2002, 22h27

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