From 2a001b5f54c2f7b00c092f3dbe4f77543db7f63b Mon Sep 17 00:00:00 2001 From: Laurent Ollagnier Date: Fri, 13 Oct 2023 23:35:33 +0200 Subject: [PATCH] commit --- main.py | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pong.kv | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 main.py create mode 100644 pong.kv diff --git a/main.py b/main.py new file mode 100644 index 0000000..60346b6 --- /dev/null +++ b/main.py @@ -0,0 +1,80 @@ +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 + +class PongPaddle(Widget): + score = NumericProperty(0) + + def bounce_ball(self, ball): + if self.collide_widget(ball): + vx, vy = ball.velocity + offset = (ball.center_y - self.center_y) / (self.height / 2) + bounced = Vector(-1 * vx, vy) + vel = bounced * 1.1 + ball.velocity = vel.x, vel.y + offset + + +class PongBall(Widget): + + # velocity of the ball on x and y axis + velocity_x = NumericProperty(0) + velocity_y = NumericProperty(0) + + # referencelist property so we can use ball.velocity as + # a shorthand, just like e.g. w.pos for w.x and w.y + velocity = ReferenceListProperty(velocity_x, velocity_y) + + # ``move`` function will move the ball one step. This + # will be called in equal intervals to animate the ball + def move(self): + self.pos = Vector(*self.velocity) + self.pos + + +class PongGame(Widget): + ball = ObjectProperty(None) + player1 = ObjectProperty(None) + player2 = ObjectProperty(None) + + def serve_ball(self, vel=(4, 0)): + self.ball.center = self.center + self.ball.velocity = vel + + def update(self, dt): + self.ball.move() + + # bounce off paddles + self.player1.bounce_ball(self.ball) + self.player2.bounce_ball(self.ball) + + # bounce ball off bottom or top + if (self.ball.y < self.y) or (self.ball.top > self.top): + self.ball.velocity_y *= -1 + + # went off to a side to score point? + if self.ball.x < self.x: + self.player2.score += 1 + self.serve_ball(vel=(4, 0)) + if self.ball.right > self.width: + self.player1.score += 1 + self.serve_ball(vel=(-4, 0)) + + def on_touch_move(self, touch): + if touch.x < self.width / 3: + self.player1.center_y = touch.y + if touch.x > self.width - self.width / 3: + self.player2.center_y = touch.y + +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() diff --git a/pong.kv b/pong.kv new file mode 100644 index 0000000..29ad985 --- /dev/null +++ b/pong.kv @@ -0,0 +1,50 @@ +#:kivy 1.0.9 +: + size: 25, 200 + canvas: + Rectangle: + pos: self.pos + size: self.size + +: + size: 50, 50 + canvas: + Ellipse: + pos: self.pos + size: self.size + +: + ball: pong_ball + player1: player_left + player2: player_right + + 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: str(root.player1.score) + + Label: + font_size: 70 + center_x: root.width * 3 / 4 + top: root.top - 50 + text: str(root.player2.score) + + PongBall: + id: pong_ball + center: self.parent.center + + PongPaddle: + id: player_left + x: root.x + center_y: root.center_y + + PongPaddle: + id: player_right + x: root.width - self.width + center_y: root.center_y \ No newline at end of file