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

Programmation multimédia/Jeux Python Discussion :

[Pygame] Problème de sauts avec la 2eme loi de Newton


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 23
    Points
    23
    Par défaut [Pygame] Problème de sauts avec la 2eme loi de Newton
    Bonjour,

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

    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:

    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
    # -*- 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
    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
    import pygame
    from Newton import * 
     
    class perso():
     
        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
    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
    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

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    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:
    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
    # -*- 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
    Une idée ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    Salut,
    Alors j'ai apporter quelques modifs comme la conversion des angles en radians et la valeur de t mais le problème est toujours la :/

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 23
    Points
    23
    Par défaut
    c'est bon j'ai corrigé :

    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
    # -*- 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 ...)

    Quelqu'un pour m'expliquer ?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Je ne suis pas sur d'avoir bien compris le code (ça commence bien) cependant il me semble que tu a pris "g" comme accélération ce qui dans le cadre de la deuxième loi de Newton correspond à une chute libre.

    Rappel : D’après la deuxième loi de Newton la résultante des forces appliquées à un point matériel est égale à la dérivée au temps de sa quantité de mouvement soit sa masse fois son accélération, dans notre cas "g". Le poids vaut la masse fois "g" donc on a
    masse x "g" = masse * accélération
    soit accélération = "g"

Discussions similaires

  1. [PYGAME]Problème avec une fonction
    Par Purota dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 09/01/2015, 00h24
  2. [Toutes versions] Problème de syntaxe avec MERGEFIELD et condition Si ALORS et saut de ligne
    Par dany13 dans le forum Word
    Réponses: 1
    Dernier message: 23/07/2013, 13h55
  3. Problème de saut de ligne avec un echo d'un output d'une commande
    Par death_style dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 11/04/2012, 14h38
  4. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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