Bonjour,

je poste aujourd'hui parce que nous sommes tombé sur plusieurs problèmes relative à la gravité (Je précise que nous travaillons sur un jeu 2D).
Nous avons mis en place une fonction permettant le saut du personnage :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
public void Jump(GameTime gameTime)
{
if (isOnFloor)
{
LastPosition = new Vector2(Position.X, Position.Y);
Position.Y -= 8f;
Velocity.Y -= 0.6f;
isOnFloor = false;
}
}
- isOnFloor -> Définit si le joueur est au sol ou non

- LastPosition -> Retiens la position avant le saut du joueur

On décrémente la position en Y de 8px pour faire décoller le joueur du sol puis on décrémente la vélocité pour donner une impression d'impulsion et de chute plus ou moins réaliste.
Ma première question est pourquoi la hauteur du saut est différente pour chacun des membres de l'équipe en sachant que nos ordinateur n'affiche pas le même nombre de FPS (Un affiche 150 FPS, l'autre 600FPS et le dernier plus de 2000FPS) ?

Notre méthode concernant la gravité :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
public void ApplyGravity(GameTime gameTime, float Acceleration = 0.002f, float CriticalFallSpeed = 2.5f)
{
if (!isOnFloor)
{
Velocity.Y += Acceleration * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
Velocity.Y = MathHelper.Clamp(Velocity.Y, -CriticalFallSpeed * (float)gameTime.ElapsedGameTime.TotalMilliseconds, CriticalFallSpeed * (float)gameTime.ElapsedGameTime.TotalMilliseconds);
}
else isOnFloor = false;
this.Position += (Direction * Speed * (float)gameTime.ElapsedGameTime.TotalMilliseconds) + Velocity;
}
- Acceleration -> Définit la vitesse de chute du joueur par update()

- CriticalFallSpeed -> Définit la valeur maximale et minimale du vecteur Velocity

Je ne sais pas si cette méthode vous sera utile à répondre à la question mais je vous la donne quand même.
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
public static bool TouchTopOf(this Rectangle r1, Rectangle r2)
{
return (r1.Bottom >= r2.Top &&
r1.Bottom <= r2.Top + (r2.Height / 2) &&
r1.Right >= r2.Left + r2.Width / 5 &&
r1.Left <= r2.Right - r2.Width / 5);
}
public static bool TouchBottomOf(this Rectangle r1, Rectangle r2)
{
return (r1.Top <= r2.Bottom + (r2.Height / 5) &&
r1.Top >= r1.Bottom - 1 &&
r1.Right >= r2.Left + (r2.Width / 5) &&
r1.Left <= r2.Right - (r1.Width / 2));
}
public static bool TouchLeftOf(this Rectangle r1, Rectangle r2)
{
return (r1.Right <= r2.Right &&
r1.Right >= r2.Left - 5 &&
r1.Top <= r2.Bottom - (r2.Width / 4) &&
r1.Bottom >= r2.Top + (r2.Width / 4));
}
public static bool TouchRightOf(this Rectangle r1, Rectangle r2)
{
return (r1.Left >= r2.Left &&
r1.Left <= r2.Right + 5 &&
r1.Top <= r2.Bottom - (r2.Width / 4) &&
r1.Bottom >= r2.Top + (r2.Width / 4));
}
Voici la méthode pour détecter les collisions entre deux Rectangle.
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
public void HandleCollision(GameTime gameTime, Sprite s, float Acceleration = 0.08f, float CriticalFallSpeed = 2f)
{
if (s.SpriteType == SpriteType.Solid)
{
if (HitBox.TouchTopOf(s.HitBox))
{
Position.Y = s.HitBox.Top - HitBox.Height;
Velocity.Y = 0;
isOnFloor = true;
}
if (HitBox.TouchLeftOf(s.HitBox))
{
Position.X = HitBox.Left;
}
if (HitBox.TouchRightOf(s.HitBox))
Position.X = s.Position.X + s.HitBox.Width;
if (HitBox.TouchBottomOf(s.HitBox))
{
Velocity.Y = 1f;
}
}
}
Et enfin, voici notre plus grande source de problème : La gestion des collisions. Le personnage rentre à moitié dans les blocs, enfin une grande quantité de travail doit encore être faite.

Ici ma question est : Est-ce que vous avez une solution au problème lié à la gravité et aux collisions ? Est-ce que nos méthodes sont bonnes ?

Je précise aussi que la sprite Player est de 32px (de largeur) par 64px (de hauteur) (La taille de joueur sera amené à changer et la taille de chaque bloc est de 32px par 32px.

Cordialement.