Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- """
- # date: 2024.06.28
- # [Second instance of a class suppresses/deletes the first one in my Python program - Stack Overflow](https://stackoverflow.com/questions/78677249/second-instance-of-a-class-suppresses-deletes-the-first-one-in-my-python-program?noredirect=1#comment138718516_78677249)
- """
- from turtle import Turtle
- from turtle import Screen
- # --- constants --- # PEP8: `UPPER_CASE_NAMES`
- # BOX = 30
- # --- classes ---
- class Paddle:
- def __init__(self, side, key_left, key_right, x, color):
- self.key_left = key_left
- self.key_right = key_right
- self.paddle = Turtle(shape="square")
- self.paddle.color(color)
- self.paddle.penup()
- self.paddle.setx(x)
- self.paddle.sety(0)
- self.pressed_up = False
- self.pressed_down = False
- self.paddle.screen.onkeypress(key=self.key_left, fun=self.move_up)
- self.paddle.screen.onkeypress(key=self.key_right, fun=self.move_down)
- self.paddle.screen.onkeyrelease(key=self.key_left, fun=self.move_up_stop)
- self.paddle.screen.onkeyrelease(key=self.key_right, fun=self.move_down_stop)
- half_height = screen.canvheight // 2
- self.range_top = half_height - 10
- self.range_bottom = -half_height + 10
- #print('[DEBUG]', self.range_top, self.range_bottom)
- self.speed = 0
- def update(self):
- if self.pressed_up and self.pressed_down: # both keys are presse then don't move
- self.speed = 0
- elif self.pressed_up: # only one is pressed
- self.speed = 5
- elif self.pressed_down: # only one is pressed
- self.speed = -5
- else: # both keys are unpressed
- self.speed = 0
- if self.speed != 0:
- current_y = self.paddle.ycor()
- new_y = current_y + self.speed
- if self.range_top > new_y > self.range_bottom:
- self.paddle.sety(new_y)
- # I don't do calculation here (and don't execute `update()`
- # because key repeates presses slow and it slows all movement
- def move_up(self):
- self.pressed_up = True
- def move_down(self):
- self.pressed_down = True
- def move_up_stop(self):
- self.pressed_up = False
- def move_down_stop(self):
- self.pressed_down = False
- class Ball:
- def __init__(self, x=0, y=0, color='black'):
- self.ball = Turtle(shape="square")
- self.ball.color(color)
- self.ball.penup()
- self.ball.setx(x)
- self.ball.sety(y)
- self.speed_x = 3
- self.speed_y = 3
- half_width = screen.canvwidth // 2
- half_height = screen.canvheight // 2
- self.range_top = half_height - 10
- self.range_bottom = -half_height + 10
- self.range_left = half_width - 10
- self.range_right = -half_width + 10
- def update(self):
- current_x = self.ball.xcor()
- current_y = self.ball.ycor()
- new_x = current_x + self.speed_x
- new_y = current_y + self.speed_y
- if new_x < self.range_right or new_x > self.range_left:
- self.speed_x = -self.speed_x
- if new_y > self.range_top or new_y < self.range_bottom:
- self.speed_y = -self.speed_y
- self.ball.setx(new_x)
- self.ball.sety(new_y)
- # --- functions ----
- def mainloop():
- left_pad.update()
- right_pad.update()
- ball.update()
- screen.update()
- # update after ? ms
- screen.ontimer(mainloop, 5)
- # --- main ---
- screen = Screen()
- screen.bgcolor("beige")
- screen.title("Pong!")
- screen.setup(width=820, height=620)
- screen.screensize(canvwidth=800, canvheight=600)
- screen.tracer(0)
- screen.listen()
- half_width = screen.canvwidth // 2
- x = -half_width + 20
- left_pad = Paddle("left", "w", "s", x, 'red')
- x = half_width - 20
- right_pad = Paddle("right", "Up", "Down", x, 'green')
- ball = Ball()
- mainloop()
- screen.exitonclick()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement