Как я могу исправить мой прыгающий мяч, просвечивающий в нижней части экрана? - PullRequest
0 голосов
/ 30 апреля 2019

Если вы запустите его, как только мяч вот-вот остановится, он начнет немного подпрыгивать и исчезнет через пол.

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

import kivy
kivy.require("1.10.1")

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 PongBall(Widget):
    velocity_x = NumericProperty(0)
    velocity_y = NumericProperty(0)
    velocity = ReferenceListProperty(velocity_x, velocity_y)

    def update_speed(self):
        self.velocity[1] = self.velocity[1] - 15/60

        self.pos = Vector(*self.velocity) + self.pos


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

    def serve_ball(self):
        self.ball.center = self.center
        self.ball.velocity = Vector(0, 0)

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

        if (self.ball.y < 0) or (self.ball.top > self.height):
            self.ball.velocity_y *= -1

        if (self.ball.x < 0) or (self.ball.right > self.width):
            self.serve_ball()


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

Это мой файл kv:

#:kivy 1.10.1


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


<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.height * 9 / 10
        text: "0"

    Label:
        font_size: 70
        center_x: root.width * 3 / 4
        top: root.height * 9 / 10
        text: str(pong_ball.velocity[1])

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

Я хочу, чтобы мяч замедлился, пока он не лег на землю и не сдвинулся с места.

1 Ответ

0 голосов
/ 30 апреля 2019

это обычная проблема с поплавками ...

просто в вашей функции скорости обновления сделайте что-то вроде

if velocity <= 1e-6: # some really small number
   velocity = 0.0

это также, вероятно, хорошая идея, чтобы зафиксировать вашу позицию у в вашей функции перемещения

if (self.ball.y < 0) or (self.ball.top > self.height):
   self.ball.y = 0.1
   self.ball.velocity_y *= -1
...