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

Moteurs de jeux vidéo Discussion :

Godot Engine - Camera2D: Smooth mais effet de saccade


Sujet :

Moteurs de jeux vidéo

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Godot Engine - Camera2D: Smooth mais effet de saccade
    Bonjour à tous!

    Je suis en train de faire un petit jeu de plateforme 2D sur Godot, inspiré par ailleurs des tutos présents sur le forum (au passage, merci ). J'essaie de mettre en place des plate-formes se déplaçant à l'horizontal. Dans un premier temps, je constate que mon personnage, en étant sur la plateforme, ne suit pas le mouvement horizontal de celle-ci lorsqu'elle se déplace, je décide donc de faire un système de parentage/déparentage.
    Voici la partie du code concernée, le script est sur le personnage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	if (isGrounded() and !isJumping):
    			if (!currentGround.is_a_parent_of(self)):
    				self.get_parent().remove_child(self)
    				currentGround.add_child(self)
    		else:
    			if (!defaultParent.is_a_parent_of(self)):
    				self.get_parent().remove_child(self)
    				defaultParent.add_child(self)
    currentGround est l'objet correspondant à la plateforme mobile, que l'on obtient dans une autre partie du code, et defaultParent est la Node racine de la scène.

    Ça fonctionne, le personnage devient enfant de la plateforme, sauf que ça me donne un effet de saccade affreux! En effet, il se trouve que ma camera, qui est enfant du personnage, a un effet de smooth. Or celui-ci, visiblement, ne s'applique qu'au parent, et non au grand parent du coup, au moment du reparentage du personnage, la caméra se met instantanément de sorte à ce que le personnage soit au centre de l'écran.

    J'ai bien essayé de faire un système D, par exemple en récupérant la vitesse de la plateforme avec la méthode get_collider_velocity() (disponible si la plateforme est de type KinematicBody2D), mais cette méthode me renvoie toujours zéro.

    Quelqu'un aurait-il une idée pour résoudre le problème?

    (Si par hasard j'ai égaré des trucs importants pour la compréhension de la question, n'hésitez pas à me demander!)

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Utilisez-vous le moteur physique ? J'espérais qu'avec le moteur physique et qu'en donnant une force pour déplacer la plateforme, le joueur puisse suivre la plateforme, sans reparentage.
    Sinon, on peut déplacer la caméra que si le joueur arrive sur les bords de l'écran, mais je doute que cela soit une solution.
    La solution, serait plus lorsque le joueur est parenté à la plateforme, la caméra se voit fixer sa position en brut (plus aucun smooth). Cela ne donnerai pas mieux ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour, merci pour votre réponse

    Tout d'abord, j'ai fait une erreur d'algorithme: la méthode is_a_parent_of() retourne vrai pour le parent de la node, mais également pour le grand parent, etc. . Pour reparenter le personnage à la node de base, il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!defaultParent.is_a_parent_of(self)):
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (get_parent() != defaultParent):
    Ceci étant, le reparentage du personnage lorsqu'il saute ou tombe de la plateforme fonctionne, MAIS, pour la plateforme mobile(et pas les autres) cela ne fait que rajouter des problèmes . Ça ne fait rien, de ce côté c'était déjà bien mal parti.
    Je vais donc laisser tomber le système de parentage, et continuer sur l'autre piste.
    Le personnage est pour l'instant de type KinematicBody2D, mais j'utiliserai le type RigidBody2D si ça s'avère nécessaire.

    À suivre!

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Ça y est!

    L'idée, c'est d'appliquer une "force" au mouvement du personnage. J'ai ajouté une variable xForce(j'ai fait mieux en nom de variable) initialisée à zéro. Cette variable va être ajoutée à la valeur du vecteur de mouvement(ici, nommé velocity) du personnage.
    On récupère le script de la plateforme mobile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const plateform_patter_h_class = preload("plateforme_pattern_horizontal.gd")
    Celui-ci doit avoir, comme le script du personnage, un vecteur de mouvement. On peut en récupérer l'ordonnée (chez moi ce sera avec la méthode get_horizontal_velocity())

    On utilise xForce à chaque fois que nécessaire, par exemple si on veut aller à gauche, on aura:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (Input.is_action_pressed("ui_left")):
    		velocity.x = - WALK_SPEED+xForce
    On modifie xForce comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    func set_snapped_to(collider):
    	if(collider.get_script() == plateform_patter_h_class):
    		xForce=collider.get_horizontal_velocity()
    La méthode set_snapped_to(je vais changer les noms plus tard) est appelée dans la méthode isGrounded() lorsque le personnage entre en contact avec l'objet collider.

    On réinitialise xForce lorsque le personnage saute ou n'est plus en contact avec le sol:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    func _fixed_process(delta):
    	if(isJumping or !isGrounded()):
    		xForce=0
    Piège à patate:
    Attention! Si votre vecteur de mouvement du personnage prend déjà en compte la variable delta, xForce ne doit pas être égal à quelquechose*delta, sinon la "force" ne sera pas appliquée correctement!

    Voilà, j'espère avoir été à peu près clair et concis

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

Discussions similaires

  1. [SlideToogle] Effet de saccade sous IE
    Par tiamat59 dans le forum jQuery
    Réponses: 8
    Dernier message: 02/03/2011, 16h56
  2. Réponses: 2
    Dernier message: 19/04/2010, 21h46
  3. Même définition CSS mais effets différents
    Par scrouet dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 28/03/2008, 10h59
  4. Réponses: 8
    Dernier message: 21/09/2006, 23h33
  5. L'effet smooth
    Par Happy dans le forum OpenGL
    Réponses: 6
    Dernier message: 20/09/2005, 09h24

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