Problème de sauts avec la 2eme loi de Newton

a marqué ce sujet comme résolu.

Bonjour,

Je me suis lancer dans ma première programmation d'un saut grâce aux lois de Newton mais je bloque déjà XD

En fait je ne comprends pas très bien pourquoi mais j'ai l'impression que mon personnage se fiche royalement de la gravité …

Voici mes différentes parties:

 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
# -*- coding: cp1252 -*-
import pygame
from math import sqrt, cos, sin
import time as time

class Newton():

    def __init__(self):

        pygame.init()
        self.g = 9.81
        self.m = 10

    def sauter(self,x,y,t,perso):

        if x == 0:
            a = 90

        else:
            a = 45

        y = y/self.m
        x = x/self.m
        v0 = sqrt(pow(x,2) + pow(y,2))
        vx = v0*cos(a)
        h = 0  #Je ne sais pas comment déterminer la hauteur h ici :/
        vy = self.g * t + v0* sin (a)
        y = 1/2*self.g*pow(t,2)+v0*(sin(a)) *t + h 
        x = v0*cos(a) * t

        rect = perso.move(x,y)
        return rect

import pygame from Newton import *

class perso():

 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
def __init__(self):
    pygame.init()
    self.allie = pygame.sprite.Group()
    self.ennemi = pygame.sprite.Group()
    self.gravitee = Newton()

def princi(self,coord):

    self.perso = pygame.sprite.Sprite()
    self.perso.image = pygame.image.load("Images/Mob/Perso/dk_bas.png").convert_alpha()
    self.perso.rect = self.perso.image.get_rect()
    self.perso.rect = self.perso.rect.move(coord)
    self.allie.add(self.perso)

def avancer(self,coord,typ):

    if typ == "princi":
        self.perso.rect = self.perso.rect.move(coord)

def saut(self,x,y,t,perso):

    if perso == "princi":
        self.perso.rect = self.gravitee.sauter(x,y,t,self.perso.rect)




def afficher(self,fen):

    try:
        self.allie.draw(fen)
    except AttributeError:
        pass
 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
import pygame
from perso import *
import time as time



class moteur():
    def __init__(self):

        pygame.init()

        self.pers = perso()
        taille_x = 500
        taille_y = 500
        self.fenetre = pygame.display.set_mode((taille_x,taille_y),pygame.RESIZABLE)
        self.decor = pygame.sprite.Group()


    def add(self, typ,coord):

        if typ == "mur":

            self.mur = pygame.sprite.Sprite()
            self.mur.image = pygame.image.load("Images/Decor/Objets/mur.png").convert_alpha()
            self.mur.rect = self.mur.image.get_rect()
            self.mur.rect = self.mur.rect.move(coord)
            self.decor.add(self.mur)

        if typ == "perso":
            princi = self.pers.princi(coord)


    def add_fond(self,fond):
        self.fond = pygame.image.load(fond).convert()

    def partie(self):
        boucle = True

        fin = time.time() + 20

        x = 0
        y = 10

        while boucle:
            pygame.time.Clock().tick(30)
            debut = time.time()
            t = fin - debut
            if fin - debut > 0:
                fin = fin - 1
                self.pers.avancer((x,y),"princi")
                self.pers.saut(x,y,t,"princi")

            for event in pygame.event.get():

                if event.type == pygame.QUIT:
                    boucle = False



            self.fenetre.blit(self.fond,(0,0))
            self.decor.draw(self.fenetre)
            self.pers.afficher(self.fenetre)
            pygame.display.flip()

Quelqu'un pourrait m'aider a corriger mes calculs ?

Merci d'avance pour votre aide :)

+0 -0

Bon alors bonne nouvelle, J'obtiens maintenant une trajectoire parabolique mais elle est à l'envers … En plus lorsque je met que x = 0 et que donc a = 90 ° j'obtiens le meme type de parabole que avec a = 45° Voici les modifs dans le code : Newton:

 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
# -*- coding: cp1252 -*-
import pygame
from math import sqrt, cos, sin
import time as time

class Newton():

    def __init__(self):

        pygame.init()
        self.g = 9.81
        self.m = 10

    def sauter(self,x,y,t,perso):

        if x == 0:
            a = 90

        else:
            a = 45

        y = y/self.m
        x = x/self.m
        v0 = sqrt(pow(x,2) + pow(y,2))
        vx = v0*cos(a)
        h = 0  #Je ne sais pas comment déterminer la hauteur h ici :/
        vy = self.g * t + v0* sin (a)
        y = 1/2*self.g*pow(t,2)+v0*(sin(a)) *t + h 
        x = v0*cos(a) * t

        rect = perso.move(x,y)
        return rect
+0 -0

Si elle est à l'envers, il ne te suffit pas de prendre la formule opposee pour la vitesse ?

Et peut être que je me trompe, mais les fonctions trigonométriques n'utiliseraient-elles pas un encodage du parametre en radian plutôt qu'en degré ?

Que cherche tu à calculer avec la hauteur ? C'est l'origine du saut ? Je pense qu'il y a quelques soucis sur la conception !

Salut alexandre, J'ai corrigé mon problème depuis hier :), voici le nouveau code:

 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
# -*- coding: cp1252 -*-
import pygame
from math import sqrt, cos, sin
import time as time

class Newton():

    def __init__(self):

        pygame.init()
        self.g = 9.81
        self.m = 10

    def sauter(self,x,y,t,perso):

        pi = 3.141592654

        if x == 0:
            a = 90*pi/180

        else:
            a = 45*pi/180

        y = y/self.m
        x = x/self.m
        v0 = sqrt(pow(x,2) + pow(y,2))
        vy = self.g * t + v0* sin (a)
        y = -1*(vy- 0.5*self.g*pow(t,2))
        x = v0*cos(a) * t

        rect = perso.move(x,y)
        return rect

Cependant je ne comprends pas pourquoi mon calcul de y était erroné (j'ai l'impression que c'était la trajectoire d'une chute libre …)

Tu as une idée de pourquoi ?

+0 -0

puisque ton temps t est décroissant je suppose : t = fin - debut. (où début est en fait le temps courant). En général, on fait plutot de cette manière (en pseudo-code python, c'est pour l'idée) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
date_debut_saut = None
while ...:
    t = time.time()
    if date_debut_saut is not None:
        saut(x,y,t-date_debut_saut)
        # tester la fin du saut

    if key_pressed and key==SPACE: 
        if date_debut_saut is not None:
            date_debut_saut = time.time()

D'ailleurs, tu fais des manipulations bizarres avec fin en le décrémentant ! (mais je crois comprendre que tu as enlevé cette partie ? )

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte