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

Physique Discussion :

Faire sauter une entité 2D


Sujet :

Physique

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 37
    Points : 31
    Points
    31
    Par défaut Faire sauter une entité 2D
    Bonjour,

    Je m'exerce actuellement a la création de jeux 2d sur windows avec delta engine.

    J'ai crée une classe abstraite permettant de se déplacer de droit a gauche et l'inverse, je suis maintenant rendu a l'étape du Saut !

    J'ai réussi à faire à peut de chose près ce que je voulais le bloc saute est retombe, mais je pense que je me suis compliquer la vie, pouriez-vous regarder mon code afin de m'aider à l'améliorer ?

    Ma classe abstraite :

    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
     
    using DeltaEngine.Commands;
    using DeltaEngine.Datatypes;
    using DeltaEngine.Entities;
    using DeltaEngine.Input;
    using DeltaEngine.Rendering2D;
    using DeltaEngine.ScreenSpaces;
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace FirstBattleRpgOpenTk.AbstractClass
    {
    	public class Humanoïd : Sprite, Updateable
    	{
    		#region # Properties #
    		private int life;
    		private int mana;
    		public int Life
    		{
    			get { return life; }
    			set { life = value; }
    		}
    		public int Mana
    		{
    			get { return mana; }
    			set { mana = value; }
    		}
    		#endregion
     
    		float coeff_densite = 0.5f;
    		float coeff_frottement = 1.5f; // friction
    		float gravite = 0.981f;
     
    		public Vector2D Acceleration;
    		public Vector2D Velocity;
     
    		public bool jumping = false;
    		private Game game; // accés a un label débug (temporaire)
    		private Vector2D positionBase; 
     
    		public Humanoïd(Game game, Vector2D position)		
    			: base(new DeltaEngine.Content.Material(new Size(10, 30), Color.LightGray), new Rectangle(position.X, position.Y, 0.05f, 0.08f))
    		{
    			this.game = game;
    			this.positionBase = position;
    			Displacement();
    		}
     
    		public virtual void Displacement()
    		{			
    			new Command(Command.MoveLeft, () => MoveLeft());
    			new Command(Command.MoveRight, () => MoveRight());
    			new Command(TestJump).Add(new KeyTrigger(Key.Space, State.Pressing));
    		}
     
    		public void TestJump()
    		{
    			if (!jumping)
    			{
    				Velocity = new Vector2D(0f, 1f); // reset base speed
    				Acceleration = Vector2D.Zero; // reset acceleration
    				jumping = true;
    			}
    		}
    		public virtual void MoveLeft()
    		{
    			if (this.TopLeft.X <= 0)
    				Center = new Vector2D(Center.X, Center.Y);
    			else
    				Center -= new Vector2D(Time.Delta * 0.5f, 0);
    		}
     
    		public virtual void MoveRight()
    		{
    			if (this.TopLeft.X + this.Size.Width >= ScreenSpace.Current.Right - 0.02f)
    				Center = new Vector2D(Center.X, Center.Y);
    			else
    				Center += new Vector2D(Time.Delta * 0.5f, 0);
    		}
     
    		public virtual void Update()
    		{
    			game.SetDebug("velocity : " + Velocity + " | pos : " + Center + " | acc : " + Acceleration + " | jump : " + jumping);
     
    			if (jumping)
    			{
    				if (Acceleration.Y >= 0)
    				{
    					this.Acceleration = new Vector2D(0, gravite * coeff_densite - coeff_frottement * Velocity.Y);
    					this.Velocity += this.Acceleration * Time.Delta;
    					Center -= new Vector2D(0, this.Velocity.Y * Time.Delta);
    				}
    				else
    				{
    					if (Math.Round(Center.Y, 2) <= positionBase.Y)
    					{
    						this.Velocity -= new Vector2D(0f, gravite + coeff_densite) * Time.Delta;
     
    						if (Math.Round(Center.Y, 2) > positionBase.Y) // essai pour limiter la chute a la position de base en Y
    							Center = new Vector2D(0, positionBase.Y);
    						else
    							Center -= new Vector2D(0, this.Velocity.Y * Time.Delta);
    					}
    					else
    					{
    						jumping = false;
    					}
    				}
    			}
    		}
     
    		public bool IsPauseable { get { return true; } }
    	}
    }
    Merci.

    Quentin.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 917
    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 917
    Points : 220 488
    Points
    220 488
    Billets dans le blog
    127
    Par défaut
    Bonjour,

    J'ai un peu de mal avec votre façon de coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void TestJump()
    		{
    			if (!jumping)
    			{
    				Velocity = new Vector2D(0f, 1f); // reset base speed
    				Acceleration = Vector2D.Zero; // reset acceleration
    				jumping = true;
    			}
    		}
    Si la fonction s'appelle "test", c'est qu'elle test quelque chose, non ?
    Là, déjà, pour moi elle ne test rien dans le sens, elle ne renvoie pas de boolean. Et en plus, pour un test, elle modifie un tas de paramètre.
    J'imagine donc que le nom n'est pas correctement choisi.

    Est-ce que le coefficient de frottement est vraiment nécessaire ? Je pense que c'est un peu superflu pour un jeu (on peut le négliger).

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Pour la fonction TestJump() il est vrai que j'aurais du l'appeler autrement mais c'était juste pour faire un test sa ne restera pas comme cela.

    Pour le coef de frottement je l'ai inclue pour voir comment cela fonctionnais mais comme je l'ai dit je suis pas encore rendu au stade de developpement d'un super jeu video je fait cela afin de comprendre et de m'améliorer ^^.

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    je pense pas que ce soit une bonne idée de créer des nouveaux vecteurs un peu partout. Je ne connais pas DeltaEngine mais tu dois avoir des méthodes du type ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Center.add(Time.Delta * 0.5f, 0);

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Salut,
    je pense pas que ce soit une bonne idée de créer des nouveaux vecteurs un peu partout. Je ne connais pas DeltaEngine mais tu dois avoir des méthodes du type ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Center.add(Time.Delta * 0.5f, 0);
    Non ^^.

    https://deltaengine.codeplex.com/Sou...es/Vector2D.cs

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Arf, j'avais pas vu que c'était du C# et je ne connais pas bien ce langage. J'imagine qu'il y a des optimisations dynamiques sinon je ne comprends pas pourquoi la surcharge d'opérateurs oblige à créer un nouveau vecteur à passer à une méthode qui retourne elle-même un nouveau vecteur ça pique. En général en modifie plutôt vector1. (En plus les références/pointeurs vers le premier vecteurs ne sont plus valides après une opération)

    D'autant que la classe Vector est une classe utilisée partout dans un jeu temps réel. Pour optimiser, certaines libs collent même x, y, z de Vector en public.

    Bref, je dois me tromper quelque part car là je ne comprends pas le code source de cette classe niveau perfs.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 37
    Points : 31
    Points
    31
    Par défaut
    Je t'avourais que j'ai un peu de mal avec cette engine mais commencer directement par sharpdx n'est pas dans mes compétences .

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    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 408
    Points : 20 542
    Points
    20 542
    Par défaut
    salut que veux-tu faire comme type de saut ?
    Le saut c'est pas si évident que ça à programmer.
    Si l'objet ou perso saute de haut en bas ça va ; si c'est un saut parabolique là c'est un peu plus pointu, il faut gérer la masse de l'objet.
    Rechercher dans google l'équation de portée d'un canon par exemple ou une trajectoire parabolique

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2013, 20h58
  2. Réponses: 4
    Dernier message: 31/05/2010, 17h33
  3. [DOM] [Xerces] Insertion d'une entité
    Par Traroth dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/05/2008, 10h28
  4. [débutant]Faire appel à une action d'une ActionList
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/03/2004, 23h53
  5. Faire respecter une DTD !!!
    Par haypo dans le forum Valider
    Réponses: 3
    Dernier message: 12/07/2003, 20h20

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