0

私はPygameでPongゲームを書いています.これはこれまでの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 []  

プレーヤー (または AI) が得点した後、ボールはreinitメソッドを呼び出して、ボールを画面の中央に配置し、ベクトルをリセットします。

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)

しかし、どういうわけか、ボールは reinit が呼び出される前のベクトルを維持しています。したがって、ボールが (-5.0 -2.0) のようなベクトルで左側を通過すると、reinit 呼び出しですばやく変化し、(-5.0, -2.0) に戻ります。なぜこれが起こっているのか誰か教えてもらえますか?

4

1 に答える 1