代码之家  ›  专栏  ›  技术社区  ›  Jeroen

为什么同一个类有两个行为不同的实例?

  •  0
  • Jeroen  · 技术社区  · 8 年前

    我有一个ball类和该类的两个实例。该类中有一个directions方法,根据按下的箭头键,该方法可以将球向左或向右加速。现在我的问题是,只有第一个实例球可以由箭头键控制。同一类的两个实例的行为如何可能不同?我应该改变什么才能控制两个球?我更愿意在课堂上控制球。

    这是我的代码:

    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()
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   bgse    8 年前

    不太熟悉 pygame ,但从 documentation 我想说的问题是,当你打电话时,你的第一个球会清空事件队列 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)