Понг - мяч изменяет размеры и искажается без какого-либо кода для этого

Я следовал этому руководству: http://kivy.org/docs/tutorials/pong.html. .

Когда я копирую и запускаю код в разделе «Добавить анимацию мяча», мяч действительно двигается и подпрыгивает, но это действительно странно. Мяч периодически меняет размер, при этом кажется, что он вращается по горизонтали, а затем по вертикали. Мяч обычно перемещается довольно далеко от экрана при движении вверх, и прямо перед тем, как отскочить назад, мне нужен способ заставить его отскакивать от сторон, а не отскакивать немного после того, как он достигнет их. Я почти уверен, что знаю, какую часть кода мне нужно изменить(), чтобы это произошло, но я понятия не имею, почему мяч искажается. Код ниже.

main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import NumericProperty, ReferenceListProperty,\
 ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
from random import randint

class PongGame(Widget):
    ball = ObjectProperty(None)

    def serve_ball(self):
        self.ball.center = self.center
        self.ball.velocity = Vector(4, 0).rotate(randint(0, 360))

    def update(self, dt):
        self.ball.move()

     # Bounce off top and bottom
    if (self.ball.y < 0) or (self.ball.top >= self.height):
        self.ball.velocity_y *= -1

    # Bounce off left and right
    if (self.ball.x < 0) or (self.ball.right >= self.width):
        self.ball.velocity_x *= -1

class PongBall(Widget):
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    def move(self):
        self.pos = Vector(*self.velocity) + self.pos



class PongApp(App):
    def build(self):
        game = PongGame()
        game.serve_ball()
        Clock.schedule_interval(game.update, 1.0/60.0)
        return game


if __name__ == '__main__':
    PongApp().run()

понг.кв

#:kivy 1.0.9

<PongBall>:
    size: 50, 50
    canvas:
        Ellipse:
            pos: self.pos
            size: self.pos

<PongGame>:
    ball: pong_ball

    canvas:
        Rectangle:
            pos: self.center_x - 5, 0
            size: 10, self.height

    Label:
        font_size: 70  
        center_x: root.width / 4
        top: root.top - 50
        text: "0"

    Label:
        font_size: 70  
        center_x: root.width * 3 / 4
        top: root.top - 50
        text: "0"

    PongBall:
        id: pong_ball
        center: self.parent.center

Спасибо, что прочитали это.

РЕДАКТИРОВАТЬ: я только что понял, что причина того, что мяч не отскакивает справа и сверху правильно, вероятно, заключается в том, что он постоянно искажается. Я все еще не уверен, что вызывает искажения, хотя.


person rabbitrabbit    schedule 03.09.2014    source источник


Ответы (1)


Вы устанавливаете размер мяча в соответствии с его положением. В понг.кв

<PongBall>:
size: 50, 50
canvas:
    Ellipse:
        pos: self.pos
        size: self.pos

должно быть

<PongBall>:
size: 50, 50
canvas:
    Ellipse:
        pos: self.pos
        size: self.size
person Ryan Fitzpatrick    schedule 03.09.2014