2017-08-05 1 views
1

J'ai fait un class Ball avec deux instances: ballOne et ballTwo. Lorsque j'appelle ballTwo.update() puis ballOne.update(), la dernière bille appelée disparaît parfois sur certaines images, comme si elle scintillait et s'éteignait parfois. Puis-je avoir une aide s'il vous plait?Pourquoi mon deuxième ballon appelé dans pygame scintille?

import pygame, sys 


pygame.init() 

red = (255,0,0) 
black = (0,0,0) 
white = (255,255,255) 
blue = (0,0,255) 
green = (0,255,0) 

pygame.mouse.set_visible(0) 
clock = pygame.time.Clock() 

displaySize = (800,600) 

screen = pygame.display.set_mode(displaySize) 

g = 50 
dt = 0.05 

Cd = 0.01 
m = 5 

class ball: 
    def __init__(self, x, y, vx, vy, r,ax,ay, color): 

     self.Fx = 0 
     self.Fy = 0 

     self.Dx = 0 
     self.Dy = 0 

     self.ay = ay 
     self.ax = ax 

     self.x = x 
     self.y = y 
     self.r = r 
     self.color = color 

     self.vx = vx 
     self.vy = vy 



    def update(self): 

     self.x, self.y = self.physics() 
     pygame.draw.circle(screen, self.color, (int(round(self.x)),int(round(self.y))), self.r) 
     pygame.display.update() 





    def physics(self): 


     self.x +=self.vx*dt 
     self.y +=self.vy*dt 

     self.vy += self.ay*dt 
     self.vx += self.ax*dt 

     self.ay = self.Fy/m 
     self.ax = self.Fx/m 

     self.Fy = m*g - self.Dy 
     self.Fx = -self.Dx 

     self.Dy = Cd*self.vy*abs(self.vy) 
     self.Dx = Cd*self.vx*abs(self.vx) 

     if self.x <= self.r: 
      self.vx *= -0.7 

     if self.x >= displaySize[0]- self.r: 
      self.vx *= -0.7 

     if self.y <= self.r: 
      self.vy *= -0.7 

     if self.y >= displaySize[1] - self.r: 
      self.vy *= -0.7 

     return self.x, self.y 


ballOne = ball(100,100,50,-100,30,0,0,red) 
ballTwo = ball(500,500,-75,0,45,0,0,green) 
while 1: 
    clock.tick(60) 
    screen.fill(blue) 
    ballTwo.update() 
    ballOne.update() 
+0

Veuillez fournir un [exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve). – r0the

+0

Votre code est très étrange: les méthodes manquent 'def' et' update() 'manque le paramètre' self', 'class' devrait être en minuscules. – r0the

+0

j'espère que c'est mieux maintenant – Jeroen

Répondre

0

Vous appelez pygame.display.update() pour chaque objet, ce qui est à l'origine du scintillement. Supprimez ces appels et utilisez pygame.display.flip() dans la boucle de jeu.

Je recommande également de séparer la mise à jour et le dessin des objets. Plus tard, vous souhaiterez peut-être dessiner les objets dans un ordre différent de celui que vous souhaitez mettre à jour les objets.

Une boucle de jeu typique effectue les opérations suivantes:

  1. événements Processus
  2. Calculer nouvelle position des objets
  3. prochain tirage cadre
  4. Affichage cadre

En Python, le jeu La boucle pourrait ressembler à ceci:

objects = [ballOne, ballTwo] 
while True: 
    # 1. handle events 

    # 2. update objects 
    for object in objects: 
     object.update() 

    # 3. draw frame 
    screen.fill(blue) 
    for object in objects: 
     object.draw() 

    # 4. display frame 
    pygame.display.flip() 
    clock.tick(60)