from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
from kivy.core.window import Window
from kivy.clock import Clock

# ウィンドウサイズ
Window.size = (400, 400)

class Ball:
    def __init__(self, canvas, x, y, radius, dx, dy, color=(1, 0, 0)):
        self.x = x
        self.y = y
        self.radius = radius
        self.dx = dx
        self.dy = dy
        self.color = color

        with canvas:
            Color(*self.color)
            self.ellipse = Ellipse(pos=(self.x - self.radius, self.y - self.radius),
                                   size=(2 * self.radius, 2 * self.radius))

    def update(self):
        # 移動
        self.x += self.dx
        self.y += self.dy

        # 壁との反射
        if self.x - self.radius <= 0 or self.x + self.radius >= Window.width:
            self.dx *= -1
        if self.y - self.radius <= 0 or self.y + self.radius >= Window.height:
            self.dy *= -1

        # 描画更新
        self.ellipse.pos = (self.x - self.radius, self.y - self.radius)

class BouncingBallApp(Widget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        # ボール生成
        self.ball = Ball(self.canvas, x=200, y=50, radius=10, dx=2, dy=2)

        Clock.schedule_interval(self.update, 1/60)  # 60FPS更新

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

class MyApp(App):
    def build(self):
        return BouncingBallApp()


if __name__ == "__main__":
    MyApp().run()