2017-10-10 4 views
2

J'essaie de faire tomber des objets comme ils le feraient sur terre. Je les ai déjà fait exploser là où je les voulais mais je n'arrive pas à les animer.Pygame: Comment faire tomber mon image?

Tel est l'objet que je veux tomber

import pygame 

class circle(): 

    def __init__(self, screen): 
     planet_color = (255,0,0) 
     planet_radius = 20 
     self.screen = screen 
     ev = pygame.event.get() 

     self.image = pygame.image.load('../images/jupiter.bmp') 
     self.image = pygame.transform.scale(self.image, (80, 80)) 


    def blitme(self): 
     self.x = pygame.mouse.get_pos() 
     self.rect = self.image.get_rect() 
     self.rect.center = self.x 
     self.screen.blit(self.image, self.rect) 

Et ceci est le code qui l'exécute. Lorsque l'on clique sur la souris, une petite image de Jupiter est faite là où la souris a été cliquée. Comment puis-je faire tomber cette image?

import pygame 
import gravfunc as gf 
from gravfunc import circle 
import sys 


def run_game(): 
    screen_height = 670 
    screen_width = 1270 
    pygame.init() 
    screen = pygame.display.set_mode((screen_width, screen_height)) 
    screen.fill((10,10,30)) 
    running = True 

    circ = circle(screen) 


    while running: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       sys.exit() 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_q: 
        sys.exit() 
      elif event.type == pygame.MOUSEBUTTONDOWN: 
       circ.blitme() 


     pygame.display.flip() 


run_game() 

Répondre

2

Donnez votre classe un attribut self.speed_y et ajoutez le GRAVITY à lui chaque image afin d'accélérer l'objet. J'ai également ajouté un attribut self.pos_y car pygame.Rect ne peut pas avoir de nombres à virgule flottante comme coordonnées. Ainsi,

  1. augmentation de la vitesse
  2. ajouter la vitesse à la position (self.pos_y)
  3. associez le self.pos_y-self.rect.y.

Puisque vous utilisez déjà une classe, je recommande d'en faire une sous-classe d'image-objet pygame (hériter de pygame.sprite.Sprite). Ensuite, vous pouvez ajouter tous les cercles à un pygame.sprite.Group et les mettre à jour et les dessiner en appelant le sprite_group.update() et le sprite_grop.draw(screen).

import pygame 


GRAVITY = .2 # Pretty low gravity. 

class Circle(pygame.sprite.Sprite): 

    def __init__(self, pos, screen): 
     super().__init__() 
     self.screen = screen 
     self.image = pygame.Surface((80, 80), pygame.SRCALPHA) 
     pygame.draw.circle(self.image, (30, 90, 150), (40, 40), 40) 
     self.rect = self.image.get_rect(center=pos) 
     self.pos_y = pos[1] 
     self.speed_y = 0 

    def update(self): 
     self.speed_y += GRAVITY 
     self.pos_y += self.speed_y 
     self.rect.y = self.pos_y 

     if self.pos_y > self.screen.get_height(): 
      self.kill() # Remove off-screen circles. 


def run_game(): 
    pygame.init() 
    screen = pygame.display.set_mode((1270, 670)) 
    clock = pygame.time.Clock() 
    running = True 
    circles = pygame.sprite.Group(Circle((600, 0), screen)) 

    while running: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       return 
      elif event.type == pygame.MOUSEBUTTONDOWN: 
       circles.add(Circle(event.pos, screen)) 

     circles.update() 

     screen.fill((10, 10, 30)) 
     circles.draw(screen) 

     pygame.display.flip() 
     clock.tick(60) 


run_game() 
pygame.quit() 
+1

est ici un [sprite pygame et tutoriel groupe sprite] (http://programarcadegames.com/index.php?chapter=introduction_to_sprites&lang=en#section_13). – skrx