2017-08-06 94 views
0

所以我有一個球類和該類的兩個實例。在課堂內是一種方向方法,根據按下的方向鍵,將球向左或向右加速。現在我的問題是,只有第一個球可以通過箭頭鍵來控制。同一個類的兩個實例的行爲有什麼不同?我應該改變什麼才能控制兩個球?我最好希望在課堂上保持球的控制。爲什麼同一個類的兩個實例的行爲不同?

這裏是我的代碼:

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) 




    def directions(self): 
     for event in pygame.event.get(): 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_UP: 
        self.ay +=-1000 
       if event.key == pygame.K_LEFT: 
        self.ax += -1000 
       if event.key == pygame.K_RIGHT: 
        self.ax += 1000 



    def physics(self): 

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

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

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

     self.directions()      

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

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


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

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

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

     if self.y >= displaySize[1] - self.r: 
      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) 

    ballOne.update() 
    ballTwo.update() 

    pygame.display.flip() 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
+0

此外,爲什麼不窗口,當我按下關閉按鈕關閉?我明確地爲它寫了代碼。它在我的其他程序中工作,現在它不... – Jeroen

回答

2

沒有真正熟悉pygame,但是從documentation我想說的問題是,你的第一個球清空事件隊列,當你調用update()

當您在第二個球上撥打update()時,隊列將變空,因此它不會移動,因爲沒有任何事件要求它移動。

與退出條件相同的問題我會說,當您到達代碼中的那一點時,從不會有適當的事件在隊列中。

快速解決方法是在主循環(檢查退出條件)中執行所有事件處理,然後更改球,以便僅通知玩家輸入。

def playerinput(self, key): 
    if key == pygame.K_UP: 
     self.ay += -1000 
    ... 

在你的主循環,假設所有的球都是在列表中playerobjects

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     pygame.quit() 
     sys.exit() 
    if event.type == pygame.KEYDOWN: 
     for player in playerobjects: 
      player.playerinput(event.key) 
相關問題