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

Java ME Discussion :

problème sur les sprites


Sujet :

Java ME

  1. #1
    Membre averti
    Inscrit en
    Août 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 13
    Par défaut problème sur les sprites
    Bonsoir.s'il vous plaît j'ai besoin d'aide.voici ci dessous un bout de code.En fait le bout de code présent comme vous
    le constater gère le déplacement du sprite.Ce qui se passe c'est que les déplacements à gauche comme à droite sont trop
    rapides.Il faut être très délicat avec la souris pour qu'à chaque click le sprite ne se déplace que d'un cercle sinon le
    sprite se déplace de 2 voir 3 cercles.Je ne sais donc pas comment faire pour qu'à chaque fois qu'on appuie que ce soit
    à gauche ou à droite que le sprite se déplace d'un cercle à chaque fois.J'aimerais savoir ce qu'il faut que j'ajoute pour
    que les déplacements soient ordonnés.
    Merci de me répondre.

    public static final int keyDelay = 10;

    private boolean[] isDown = {false, false, false, false};

    private long[] keyTick = {0, 0, 0, 0};

    private int[] keyValue = {GameCanvas.LEFT_PRESSED, GameCanvas.RIGHT_PRESSED, GameCanvas.FIRE_PRESSED, GameCanvas.UP_PRESSED};

    private boolean isRunning = true;

    public void checkKeys(int iKey, long currTick) {
    long elapsedTick = 0;
    //loop through the keys
    for (int i = 0; i < 4; i++) {
    // by default, key not pressed by user
    isDown[i] = false;
    // is user pressing the key
    if ((iKey & keyValue[i]) != 0) {
    elapsedTick = currTick - keyTick[i];
    //is it time to toggle key state?
    if (elapsedTick >= keyDelay) {
    // save the current time
    keyTick[i] = currTick;
    // toggle the state to down or pressed
    isDown[i] = true;
    }
    }
    }
    }

    public void run(){
    c1= a+y;//a correspond à la position en x du sprite et y correspond au diamètre de chaque cercle
    int iKey = 0;
    long lCurrTick = 0;
    // current system time in milliseconds;
    load();
    g = getGraphics();
    while (isRunning) {
    lCurrTick = System.currentTimeMillis();
    iKey = getKeyStates();
    checkKeys(iKey, lCurrTick);
    if (isDown[fireKey]) {
    isRunning = false;
    }
    // position actuelle du van
    int cx = Van.getX();
    int cy = Van.getY();


    if (((iKey & GameCanvas.LEFT_PRESSED) != 0) & (cx >= c1)) {
    Van.setFrame(1);
    // déplacer le van vers la gauche
    cx -= y;
    }

    if (((iKey & GameCanvas.RIGHT_PRESSED) != 0) & (cx < c1)) {
    Van.setFrame(1);
    //déplacer le van vers la droite
    cx += y;
    }
    }

    Van.setPosition(cx, cy);

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut, il faut que tu mettes en place un déplacement qui ne soit pas dépendant du nombre de frame mais du temps. Tu peux le faire avec quelquechose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int deltaTime;
    while(true)
    {
        long startTime = System.getCurrentTimeMillis();
     
        // traitement
     
        repaint();
     
        deltaTime = System.getCurrentTimeMillis() - startTime;
    }
    Une fois que tu as ca, tout tes déplacement seront fonction de deltaTime. Que le framerate soit a 10fps ou a 60fps, le déplacement des sprites se fera a la même vitesse.

    Pour ton déplacement tu as donc une constante en pixel par seconde par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static final int SPRITE_SPEED = 100 // 100 pixel/s
     
    //...
     
    cx += deltaTime * SPRITE_SPEED >> 10;
    Et la tu as un déplacement controlable totalement independant du framerate. Pour bien faire il faut que tu implémentes la position en virgule fixe (je te laisse te renseigner) sinon pour les framerate haut le déplacement par frame sera de 0 et ton sprite ne bougera pas (dans l'exemple ci dessus si deltaTime est inferieur a 11, tu te retrouve avec un déplacement nul)

    [EDIT] Pardon en fait je crois que je ne résoud pas ton problème car tu cherche pas des déplacement continu mais des déplacements de distance fixe a chaque appuie. En fait c'est que tu gères mal ton buffer de touche.

    le getKeyState() te rencoie en fait l'état des touches soit appuyé soit relaché. Ce que tu veux toi c'est le passage d'un état relaché a un état appuyé (le fait d'appuyer sur une touche pas le fait de garder la touche enfoncé)

    Pour ca il suffit de regarder du coté de l'algebre de Bool :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    long keyDown; // touche enfoncé
    long keyPressed; // appuie sur une touche
     
    while(true)
    {
    long oldKeyDown = keyDown
    keyDown = getKeyState();
    keyPressed = ~oldKeyDown & keyDown; // 1 seulement si oldKeyDown est 0 et keyDown est 1
     
    //...
     
    }
    En utilisant ce keyPressed, le sprite se déplacera de 1 cercle a chaque appui sur la touche voulue.
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

Discussions similaires

  1. Problème sur les dates
    Par Littlecoda dans le forum Oracle
    Réponses: 7
    Dernier message: 07/07/2006, 11h39
  2. problème sur les threads et les sémaphores
    Par ramislebob dans le forum Windows
    Réponses: 1
    Dernier message: 29/06/2006, 11h52
  3. Probleme de transparance sur les sprites
    Par drcd dans le forum OpenGL
    Réponses: 2
    Dernier message: 02/05/2006, 20h31
  4. Réponses: 6
    Dernier message: 31/03/2006, 17h05
  5. j'ai un problème sur les hinstances
    Par ramaro dans le forum C++
    Réponses: 9
    Dernier message: 26/02/2006, 14h32

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