Код IT
← Каталог

Python — Ping Pong — Этап 9 — угол отскока от места удара

Фрагмент из «Python — Ping Pong»: Этап 9 — угол отскока от места удара.

python spinoffencyclopedia9-04-razrabotka-igr-praktikum-razrabotki-igr-3 embed URL статья в энциклопедии
Python main.py
    def collide_paddle(self, paddle):
        if not self.rect.colliderect(paddle.rect):
            return False

        approaching = (self.vx > 0 and paddle.rect.centerx > S.MARGIN + S.FIELD_W // 2) or (
            self.vx < 0 and paddle.rect.centerx < S.MARGIN + S.FIELD_W // 2
        )
        if not approaching:
            return False

        half = paddle.rect.height / 2
        relative_hit = (self.rect.centery - paddle.rect.centery) / half
        relative_hit = max(-1.0, min(1.0, relative_hit))

        self.vy = S.BALL_SPEED * relative_hit * 0.85
        self.vx = -self.vx

        speed = (self.vx ** 2 + self.vy ** 2) ** 0.5
        if speed > 0:
            scale = min(S.BALL_SPEED * 1.15, speed) / speed
            self.vx *= scale
            self.vy *= scale

        if self.vx > 0:
            self.rect.left = paddle.rect.right
        else:
            self.rect.right = paddle.rect.left
        return True
    def collide_paddle(self, paddle):
        if not self.rect.colliderect(paddle.rect):
            return False

        approaching = (self.vx > 0 and paddle.rect.centerx > S.MARGIN + S.FIELD_W // 2) or (
            self.vx < 0 and paddle.rect.centerx < S.MARGIN + S.FIELD_W // 2
        )
        if not approaching:
            return False

        half = paddle.rect.height / 2
        relative_hit = (self.rect.centery - paddle.rect.centery) / half
        relative_hit = max(-1.0, min(1.0, relative_hit))

        self.vy = S.BALL_SPEED * relative_hit * 0.85
        self.vx = -self.vx

        speed = (self.vx ** 2 + self.vy ** 2) ** 0.5
        if speed > 0:
            scale = min(S.BALL_SPEED * 1.15, speed) / speed
            self.vx *= scale
            self.vy *= scale

        if self.vx > 0:
            self.rect.left = paddle.rect.right
        else:
            self.rect.right = paddle.rect.left
        return True