【问题标题】:How come there are two instances of the same class behaving differently?为什么同一类的两个实例表现不同?
【发布时间】:2017-08-06 15:48:35
【问题描述】:

所以我有一个球类和该类的两个实例。类中有一个方向方法,该方法从根本上使球向左或向右加速,具体取决于按下的箭头键。现在我的问题是,只有第一个实例球可以通过箭头键控制。同一个类的两个实例怎么可能表现不同?我应该改变什么才能控制两个球?我最好希望将球的控制保留在班级内。

这是我的代码:

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()

【问题讨论】:

  • 另外,为什么我按下关闭按钮时窗口没有关闭?我在最后清楚地为它编写了代码。它在我的其他程序中工作,现在它没有......

标签: python python-2.7 class pygame instance


【解决方案1】:

不是很熟悉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)

【讨论】:

    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多