Partage
  • Partager sur Facebook
  • Partager sur Twitter

Saut d'une balle-Python-Pygame

Aide projet ISN

    15 janvier 2015 à 5:16:29

    Bjr, dans le cadre de l'ISN, j'aimerais créer un mini runner sous python en utilisant pygame et pour cela je voudrais faire en sorte que lorsque l'on appuie sur la touche "espace", la balle monte jusqu'à une certaine hauteur et retombe automatiquement seule. Est-ce que quelqu'un aurait une idée pour la syntaxe s'il vous plaît?

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 janvier 2015 à 8:06:16

      hauteur = 15 #en pixel
      pos_x = 0
      pox_y = 0
      for i in range(hauteur):
          pos_y += i #tu va monter tres haut au fur et à mesure,
          #en raison de la vitesse, c'est pourquoi je ferais plutot
      from math import fabs
      for i in range(-hauteur):
          pos_y += fabs(i)
      #de manière à monter vite au début et décélérer vers la fin

      pour descendre, c'est tout aussi facile, tu peux faire une autre boucle for ;)

      par contre pour quelle bouge en x, ca je te laisse faire :)

      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2015 à 22:20:31

        Merci, j'ai réussi à faire en sorte que lorsque l'on appuie sur espace la balle saute jusqu'à pos_y =200(puisque les y vont du haut vers le bas) avec pos_y = 360. Mais la vitesse est toujours rapide même avec la fonction fabs et en plus même en ajoutant une 2ème boucle, la balle redéscends pas ball_x = 300 ball_y = 362 if event.key == K_SPACE:

        			while ball_y > 200:
        				ball = pygame.image.load("ball.png").convert_alpha()
        				hauteur = 15 #en pixel
        				for i in range(hauteur):
        					ball_y -= fabs(i)
        			if ball_y <= 200:
        				ball = pygame.image.load("ball.png").convert_alpha()
        				hauteur = 15 #en pixel
        				for i in range(-hauteur):
        					ball_y += fabs(i)
        
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          16 janvier 2015 à 7:23:18

          c'est normal tu fabs, donc en fait tu met en valeur absolue : -44444 en absolu -> 44444

          donc ->

          ball_x = 300
          ball_y = 362
          
          if event.key == K_SPACE:
              while ball_y > 200:
                  ball = pygame.image.load("ball.png").convert_alpha()
                  hauteur = 15 #en pixel
                  for i in range(hauteur):
                      ball_y -= fabs(i)
                  if ball_y <= 200:
                      ball = pygame.image.load("ball.png").convert_alpha()
                  hauteur = 15 #en pixel
                  for i in range(-hauteur):
                      ball_y += i



          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            16 janvier 2015 à 17:08:22

            Pourquoi utilises-tu math.fabs au lieu de la fonction builtin abs ? Pourquoi tu load l'image à chaque itération ? Et même parfois deux fois par itération ? Pourquoi tu utilises range avec seulement un nombre négatif ? Tu es conscient que c'est équivalent à ne pas itérer (par défaut, range(x) retourne successivement de 0 à x, donc avec un nombre négatif...) ?

            Du coup je vais proposer ma solution:

            !/usr/bin/env python3

            -- coding: utf-8 --

            import pygame as pg from pygame.locals import *

            JUMP_HEIGHT = 60 # On fixe la hauteur du saut GRAVITY = 3.0 # Gravité GROUND = 530 # En bas de l'écran screen = pg.display.set_mode((600, 600))

            class Ball:

            def __init__(self, x, y, radius):
                self.x, self.y = x, y
                self.radius = radius
            
            def move(self):
                y_mov = lambda it: int(-(it**2) + ((JUMP_HEIGHT * GRAVITY)**0.5)*2*it)
                action = None
                while action is not K_ESCAPE:
                    action = yield (self.x, self.y)
            
                    if action is K_SPACE:
                        it = 1
                        oldy = self.y
                        while self.y <= GROUND:              # Tant que la balle n'a pas retouché le sol
                            self.x += GRAVITY
                            if self.y > 0:
                                self.y = oldy - y_mov(it)
                                if self.y > GROUND - self.radius:
                                    self.y = GROUND - self.radius
                            if self.y >= GROUND - self.radius:
                                break
                            action = yield (self.x, self.y)
                            it += 1
            
            def draw(self):                                  # Juste pour le fun
                if self.y == GROUND - self.radius:
                    pg.draw.ellipse(screen, 0xEF0311, (self.x, self.y, self.radius, self.radius/1.4))
                else:
                    pg.draw.ellipse(screen, 0xEF0311, (self.x, self.y, self.radius, self.radius*1.2))
            

            ball = Ball(0, GROUND-40, radius=40) movement = ball.move() ev = 0

            for pos in movement:

            pg.time.wait(50)
            ev = pg.event.poll().__dict__.get('key', 0)       # On reçoit la touche appuyée
            movement.send(ev)                                 # Envoi de cet évènement au générateur
            pg.draw.rect(screen, 0x000000, (0, 0, 800, 800))  # On efface l'écran (en fait on met une couche d noir sur tout l'écran)
            ball.draw()                                       # On dessine la balle
            pg.display.flip()                                 # On actualise l'affichage
            
            </pre>
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              16 janvier 2015 à 17:31:16 - Message modéré pour le motif suivant : Aucun effort sur l'orthographe


                21 janvier 2015 à 5:59:07

                Bjr, désolé j'étais occupé avec les révisions du bac blanc, j'ai vu ton code Alpha Zeta, il a l'air intéressant je vais essayer de bosser dessus ce weekend

                -
                Edité par Bak840 21 janvier 2015 à 5:59:40

                • Partager sur Facebook
                • Partager sur Twitter
                  27 mars 2015 à 10:25:02

                  Slt, j'ai étudié ton code Alpha-Zeta mais le problème c'est que ton code dessine la balle, moi j'ai déjà un fichier image de la balle et je voudrais en fait que ce soit cette image de balle qui soit rafraichie à chaque fois lors du saut. Aurais-tu une idée du code s'il te plaît?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    27 mars 2015 à 13:20:17

                    C'est simple, au lieu de dessiner une ellipse tu affiches l'image sur l'écran. Pour charger l'image tu fais pg.image.load("chemin/vers/ton/image") et pour l'afficher tu fais screen.blit(image, (position_x, position_y)). Va voir sur la documentation de PyGame, tout est expliqué.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 mars 2015 à 23:26:59

                      Apparemment il y a une erreur au niveau de la ligne 51, l’événement ne serait pas attribué. Tu aurais une idée?

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Saut d'une balle-Python-Pygame

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown