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

Développement 2D, 3D et Jeux Discussion :

[Physique] Deplacer mario avec effet vitesse


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut [Physique] Deplacer mario avec effet vitesse
    Salut,

    dans le but de creer un petit Mario Like, je cherche un petit morceau de code permettant de faire deplacer Mario a droite et a gauche avec un effet de vitesse (comme le vrai en gros )
    je me doute qu il y a un peu de physique et du coup suis un peu perdu

    un morceau de code a proposer peut etre ?

    merci

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Pourrais tu être un peu plus précis ?

    Pour le déplacement de Mario, je te propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mario_position.X++; // à droite
    mario_position.X--; //à gauche
    Blague à part ... si tu veux un effet "graphique" de déplacement, tu peux essayé un motion blur en 2D...
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  3. #3
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Citation Envoyé par franck06 Voir le message
    je me doute qu il y a un peu de physique et du coup suis un peu perdu
    En effet, en utilisant les lois basiques de la physique, tu peux rapidement arriver à l'effet que tu veux.

    Ton joueur doit posséder les variables, accélération, vitesse et position et tu dois pouvoir récupérer le delta t (qui correspond au temps passé entre 2 calculs de mouvements).

    En gros ça fait :
    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
     
    Player::Move() 
    {
    	if (stand) { // stand est une variable booléenne qui indique si le joueur est à l'arrêt
    		ax = 0;
    		vx *= 0.94; // si le joueur est à l'arret, sa vitesse décroît
    	}
    	else {
    		if (right) { // si le joueur va à droite
    			ax = acceleration; // acceleration est une constante = 0.001
    		}
    		else if (left) {
    			ax = -acceleration;
    		}
    	}
     
     
    	int delta_t = timer.GetTimer() - timer_move;
    	timer_move = timer.GetTimer();
     
    	vx += ax * delta_t; // Calcul de la vitesse
     
    	if (vx > speed) { // speed est une constante qui représente la vitesse max = 0.2
     		vx = speed;
    	}
    	if (vx < -speed) {
    		vx = -speed;
    	}
     
    	x += vx * delta_t; // Calcul de la position
    }
    C'est un modèle qui me convient la plupart du temps, mais on peut aller plus loin avec les frottements.

    Le plus important c'est :
    1. Calcul de l'accélération
    2. Calcul de la vitesse
    3. Calcul de la position

    Après si tu fais un mario-like, il faut gérer le saut, mais c'est quasiment la même chose, il faut juste donner une valeur négative à vy lors d'un saut.

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Franck06 tu n'as pas forcément besoin de te lancer dans des trucs compliqués de physique.
    Tous les x ms il suffit de faire varier la position x du personnage.
    Si tu veux quelque chose de plus sophistiqué tu peux faire jouer l'accélération qui variera au cours du temps..

    Citation Envoyé par raptor70 Voir le message
    Blague à part ... si tu veux un effet "graphique" de déplacement, tu peux essayé un motion blur en 2D...
    D'accord.
    Mais comment fait-on un motion blur en 2d cela m'intéresse...

  5. #5
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Mais comment fait-on un motion blur en 2d cela m'intéresse...
    Je sais pas ... mais pourquoi ne pourrait on pas...?? Ca reste un effet de flou dans un direction donnée sur une image. avec des élements exclu.. Tu pourrais très faire une trainée sur ton fond 2D .. puis après dessiner par dessus ton personange qui court.
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Pour un motion blur basique, tu peux garder un historique de la position de ton perso sur (par exemple) les 2 dernières frame (ou n-2 et n-4, ou n'importe quoi d'autre dont tu apprécie le rendu ). Ensuite, il te suffit de le dessiner autant de fois que tu as d'entrées dans ton historique avec une augmentation progressive de l'opacité. Par contre, fait gaffe à ne pas combiner par une addition mais par un remplacement, sinon tu auras une augmentation sérieuse de luminosité qui va rendre particulièrement bizarre

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par Polyfructol Voir le message
    En effet, en utilisant les lois basiques de la physique, tu peux rapidement arriver à l'effet que tu veux.

    Ton joueur doit posséder les variables, accélération, vitesse et position et tu dois pouvoir récupérer le delta t (qui correspond au temps passé entre 2 calculs de mouvements).

    En gros ça fait :
    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
     
    Player::Move() 
    {
    	if (stand) { // stand est une variable booléenne qui indique si le joueur est à l'arrêt
    		ax = 0;
    		vx *= 0.94; // si le joueur est à l'arret, sa vitesse décroît
    	}
    	else {
    		if (right) { // si le joueur va à droite
    			ax = acceleration; // acceleration est une constante = 0.001
    		}
    		else if (left) {
    			ax = -acceleration;
    		}
    	}
     
     
    	int delta_t = timer.GetTimer() - timer_move;
    	timer_move = timer.GetTimer();
     
    	vx += ax * delta_t; // Calcul de la vitesse
     
    	if (vx > speed) { // speed est une constante qui représente la vitesse max = 0.2
     		vx = speed;
    	}
    	if (vx < -speed) {
    		vx = -speed;
    	}
     
    	x += vx * delta_t; // Calcul de la position
    }
    C'est un modèle qui me convient la plupart du temps, mais on peut aller plus loin avec les frottements.

    Le plus important c'est :
    1. Calcul de l'accélération
    2. Calcul de la vitesse
    3. Calcul de la position

    Après si tu fais un mario-like, il faut gérer le saut, mais c'est quasiment la même chose, il faut juste donner une valeur négative à vy lors d'un saut.
    ok pas teste pour le saut, mais pour vx ca marche nickel
    merci bien !!!

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2004
    Messages : 398
    Points : 710
    Points
    710
    Par défaut
    Citation Envoyé par IrmatDen Voir le message
    Salut,

    Pour un motion blur basique, tu peux garder un historique de la position de ton perso sur (par exemple) les 2 dernières frame (ou n-2 et n-4, ou n'importe quoi d'autre dont tu apprécie le rendu ). Ensuite, il te suffit de le dessiner autant de fois que tu as d'entrées dans ton historique avec une augmentation progressive de l'opacité. Par contre, fait gaffe à ne pas combiner par une addition mais par un remplacement, sinon tu auras une augmentation sérieuse de luminosité qui va rendre particulièrement bizarre
    oula, faites gaffe parceque le dessin avec Opacite, cést bien gourmand !

  9. #9
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par franck06 Voir le message
    oula, faites gaffe parceque le dessin avec Opacite, cést bien gourmand !
    Ca ne reste que du blending en 2D ... avec une valeur d'alpha ... ce n'est plus gourmand sur les machines actuelles
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  10. #10
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Sinon, si tu utilises des "sprites" ou assimilé, tu peux créer un sprite spécial pour la vitesse, avec Mario TOUT flou et semi-transparent.

    Ensuite, tu dessines ce sprite tout flou, puis le sprite "normal" par dessus.

    A vitesse normale, tu dessines les 2 sprites exactement au même endroit => on ne voit que mario normal.

    Plus le personnage va vite, plus tu decale le dessin des deux sprites => plus la trainée est grande.

    L'avantage, c'est que :
    - pas de calculs recursifs, de transparence etc...
    - tu peux utiliser des sprites en RGBA avec alpha pré-multiplié, ça va très vite à l'affichage
    - tu peux dessiner la trainée comme tu veux avec Photoshop
    - performances stables : quelque soit la vitesse, tu fait exactement la meme chose, du coup pas de risque de ralentissement graphique au moment où le joueur accelere (ce serait dommage)

  11. #11
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Le problème avec 2 sprites, c'est que tu n'auras pas une traînée, mais un fantôme à la traîne

    Tu as de la transparence dans ta méthode. Sinon, je ne vois pas comment tu comptes transposer la semi-transparence de ton sprite avec le background.
    Ensuite, le flou grossit le sprite et donnera une espèce de halo si ce sprite est quasiment au même endroit que l'autre. Dans le même type de problème (mais évitable...), il vaut mieux utiliser un flou horizontal uniquement (sinon va y avoir des effets vraiment bizarres verticalement). Mais du coup la force du flou horizontal ne dépendra pas de la vitesse, et ça perdra énormément en qualité.

    - performances stables : quelque soit la vitesse, tu fait exactement la meme chose, du coup pas de risque de ralentissement graphique au moment où le joueur accelere (ce serait dommage)
    Les perfs pour faire ça, y'a pas de soucis comme l'a dit raptor70. On est en 2008 quand même

  12. #12
    Inactif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 180
    Points : 148
    Points
    148
    Par défaut
    Il y a une manière simple de faire un flou général directement dans le buffer de pixels, il suffit de rendre l'arrière plan legerement transparent (disons 80%) et ne rien effacer entre deux frames.

    ainsi sur la boucle d'affichage:

    -tracé du fond transparent
    -tracé sprite1
    -tracé du sprite2
    -etc....

    et on recommence, le fond transparent va être retracé par dessus les sprites en laissant une légère trainée derrière eux


    alors c'est plus lourd que sans flou car le background est traité comme un sprite transparent mais la différence devait être significative à l'époque des process de 150 mhz sans rendu hardware...

  13. #13
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Mais du coup, t'obtiens pas un effet relativement marqué de rémanence sur le bg au lieu de te concentrer sur le sprite ?

  14. #14
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Merci pour les réponses
    Citation Envoyé par Camel LowFilter Voir le message
    -tracé du fond transparent
    ...
    Bon ok en 3 lignes de pseudo code ou C/C++ avec 2 boucles x= et y= peux tu me dire comment faire un flou ?
    Admettons que j'ai une SDL_Surface ou une DDrawSurface et que je puisse accéder aux pixels en x et y comment faire un flou tout simple avec un code tout simple ?
    Les autres aussi peuvent participer..

  15. #15
    Inactif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 180
    Points : 148
    Points
    148
    Par défaut
    Tout à fait IrmatDen, ça fait du motion blur sur le fond



    j'essaye de détailler l'algo (je fais sans tuiles pour cet exemple):

    c'est vraiment basique y'a rien de compliqué mais le code va beaucoup dépendre du moteur d'affichage que tu utilises

    normalement dans n'importe quel moteur d'affichage tu as une fonction qui sert à tracer un bitmap sur l'écran et à laquelle tu fais passer au minimum les coordonnées du bitmap et sa référence

    à la fin de chaque tour de boucle, tu rafraichis pas l'écran, tu trace le fond avec un alpha par exemple à 80 puis ensuite tous les sprites par dessus.

    là j'ai fait sans tiling pour simplifier le code:

    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
     
    //dans le singleton qui gère l'affichage:
     
    fonction routine_rendu //routine de retracage appelée à la fin de la routine générale
    {
     
     draw_image_on_screen(background_image,scrollX,scrollY,alpha=200)
     
     for each sprite
     {
        sprite.render()
     }
     
    }
     
     
    //dans la classe qui gère les sprites
     
     
    fonction routine_rendu
    {
     
     draw_image_on_screen(images[current_image_index],posX,posY,alpha=255)
     
    }

    si tu utilises un moteur de sprites tout fait qui gère cette routine en muet, regarde s'il ya moyen de désactiver le rafraichissement ou si l'effet trail n'est pas déjà prévu

  16. #16
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Voici une description de l'effet (tel que décris par Camel LowFilter) avec illustration en prime (principalement orienté XNA): http://blogs.msdn.com/shawnhar/archi...tion-blur.aspx

  17. #17
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Merci IrmaDen je vais étudier cela


    Citation Envoyé par Camel LowFilter Voir le message
    si tu utilises un moteur de sprites tout fait qui gère cette routine en muet, regarde s'il ya moyen de désactiver le rafraichissement ou si l'effet trail n'est pas déjà prévu
    Merci Camel Lowfilter mais mon moteur de jeu est 100% maison avec DirectDraw et qui sera converti vers d3d9
    Je vais m'inspirer de IrmaDen

Discussions similaires

  1. Copie physique de base avec nom instance différent
    Par Labienus dans le forum Administration
    Réponses: 3
    Dernier message: 25/06/2007, 15h18
  2. Réponses: 1
    Dernier message: 15/05/2007, 23h38
  3. [VBA] Deplacement texte avec la souris
    Par gust dans le forum IHM
    Réponses: 1
    Dernier message: 05/04/2007, 13h26
  4. besoin aide bouton avec effet zoom fonctionne pas.
    Par zicomoun dans le forum Flash
    Réponses: 3
    Dernier message: 13/06/2006, 08h15
  5. Diaporama avec effet de fondu ?
    Par sami_c dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/11/2005, 09h46

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