Vector 为什么我的球向量在重新输入后仍保留其分量?

Vector 为什么我的球向量在重新输入后仍保留其分量?,vector,pygame,pong,Vector,Pygame,Pong,我正在用Pygame编写一个乒乓球游戏,这是到目前为止我的Ball类的代码: class Ball(pygame.sprite.Sprite): def __init__(self, game, vector=Vec2D.Vec2D()): super(Ball, self).__init__() self.image = pygame.Surface((BALL_RADIUS*2, BALL_RADIUS*2)) self.rect

我正在用Pygame编写一个乒乓球游戏,这是到目前为止我的Ball类的代码:

class Ball(pygame.sprite.Sprite):

    def __init__(self, game, vector=Vec2D.Vec2D()):
        super(Ball, self).__init__()

        self.image = pygame.Surface((BALL_RADIUS*2, BALL_RADIUS*2))
        self.rect = self.image.get_rect()
        self.__draw_ball()

        screen = pygame.display.get_surface()
        self.area = screen.get_rect().inflate(-GAP*2, 0)

        self.vector = vector
        self.game = game
        self.reinit()

    def __draw_ball(self):
        self.image.fill(BLACK)
        self.image.set_colorkey(BLACK, RLEACCEL)
        pygame.draw.circle(self.image, WHITE, (self.rect.centerx, self.rect.centery), BALL_RADIUS)

    def reinit(self):
        self.rect.centerx = self.area.centerx
        self.rect.centery = self.area.centery
        self.vector = Vec2D.Vec2D.from_magn_and_angle(BALL_SPEED, 0)

    def update(self):
        self.rect = self.calcnewpos()
        self.handle_collision()

    def calcnewpos(self):
        (dx, dy) = self.vector.get_xy()
        return self.rect.move(dx, dy)

    def handle_collision(self):
        (dx, dy) = self.vector.get_xy()

        if not self.area.contains(self.rect):
            if self.__hit_topbottom():
                dy = -dy
            elif self.__hit_leftright():
                self.game.increase_score()
                self.reinit()
        else:
            for paddle in self.hit_paddle(dx):
                if dx < 0: self.rect.left = GAP + PADDLE_WIDTH
                elif dx > 0: self.rect.right = SCREEN_WIDTH - (GAP + PADDLE_WIDTH)

                dx = -dx
                dy = paddle.hitpos / 4
                paddle.collided = True

        self.vector = Vec2D.Vec2D(dx, dy)

    def _hit_topbottom(self):
        return self.rect.top < 0 or self.rect.bottom > SCREEN_HEIGHT

    def _hit_leftright(self):
        return self.rect.left < self.area.left or self.rect.right > self.area.right

    def hit_paddle(self, dx):
        if dx < 0: paddle = self.game.paddles['left']
        elif dx > 0: paddle = self.game.paddles['right']

        if self.rect.colliderect(paddle.rect): return [paddle]
        else: return []  

但是,不知何故,球仍然保持着它被调用之前的向量。因此,当球以类似(-5.0-2.0)的向量通过左侧时,它会在reinit调用中快速变化,然后变回(-5.0,-2.0)。有人能告诉我为什么会发生这种情况吗?

问题出在您的
处理冲突的方法中

短篇小说:
函数要做的第一件事是将dx和dy设置为当前向量。然后它调用
reinit()
。然后,它将它们设置回函数末尾的第一个

要修复:
改变

def handle_冲突(自):

(dx,dy)=self.vector.get_xy()#可能是每次都将球设置为相同的向量。从我在发布的代码中看到的情况来看,您根本不会更改或随机选择向量。@每次向量碰到墙或手柄碰撞方法中的某个挡板时,阴影都会更改。但当得分时,我希望reinit始终将向量设置为相同的向量
Vec2D.Vec2D。从_magn_和_角度(球的速度,0)
@Shade,向量实际上会发生变化!它只是很快地恢复到以前的状态,然后可能还有什么东西在处理向量,在向量重置后“完成”。这似乎不太可能,但是。。。还有一些突出的地方,
dy=palle.hitpos/4
可能总是被截断为一个整数,而dx将永远(从我所看到的)等于dx或-dx。好的,我看到了。我会发布一个答案后,我键入它outSorry,它的工作!但我还是不明白。你能进一步解释一下为什么会这样吗?我现在明白了!谢谢,夏德。
def reinit(self):
    self.rect.centerx = self.area.centerx
    self.rect.centery = self.area.centery
    self.vector = Vec2D.Vec2D.from_magn_and_angle(BALL_SPEED, 0)
def handle_collision(self):
    (dx, dy) = self.vector.get_xy() # <-- It first sets (dx, dy) to the old vector

    if not self.area.contains(self.rect):
        if self.__hit_topbottom():
            ...
        elif self.__hit_leftright():
            ...  # <-- here is where the reinit gets called, which changes the vector to new values.
    else:
        for paddle in self.hit_paddle(dx):
            ...

    self.vector = Vec2D.Vec2D(dx, dy)  # <-- Then the vector gets changed again, to the OLD vector saved above in (dx, dy)
def handle_collision(self):
    (dx, dy) = self.vector.get_xy()

    if not self.area.contains(self.rect):
        if self.__hit_topbottom():
            ...
        elif self.__hit_leftright():
            ...
            return  # <-- With the return here, the parsing never gets to change it back
    else:
        for paddle in self.hit_paddle(dx):
            ...

    self.vector = Vec2D.Vec2D(dx, dy)