How To Bounce Ball In Paddle Game On Another Shape Using Collisions?
Trying to get the ball to bounce on the platform, but the collision can't be detected? How can we detect collision or make it bounce from the platform? We have made the ball and it
Solution 1:
You can use canvas.find_overlapping(*ball_pos)
to check if ball overlaps other objects. It returns IDs of all objects in rectangle ball_pos
- event ball - so it is never empty.
It is not ideal because it doesn't check if ball collide below/above/left/right so you don't know how to change direction.
import tkinter as tk
# --- constants ---
WIDTH = 800
HEIGHT = 1000# --- functions ---# for smooth move of platformdefleft_press(event):
global platform_left
platform_left = Truedefleft_release(event):
global platform_left
platform_left = Falsedefright_press(event):
global platform_right
platform_right = Truedefright_release(event):
global platform_right
platform_right = Falsedefeventloop():
global xspeed
global yspeed
# move ball
canvas.move(ball, xspeed, yspeed)
ball_pos = canvas.coords(ball)
# move platformif platform_left:
# move
canvas.move(platform, -20, 0)
platform_pos = canvas.coords(platform)
# check if not leave canvasif platform_pos[0] < 0:
# move back
canvas.move(platform, 0-platform_pos[0], 0)
if platform_right:
# move
canvas.move(platform, 20, 0)
# check if not leave canvas
platform_pos = canvas.coords(platform)
if platform_pos[2] > 1200:
# move back
canvas.move(platform, -(platform_pos[2]-1200), 0)
# - collisions -# check collision with borderif ball_pos[3] >= 900or ball_pos[1] <= 0: # y range
yspeed = -yspeed
if ball_pos[2] >= 1200or ball_pos[0] <= 0: # x range
xspeed = -xspeed
# check collisions with objects
collide = canvas.find_overlapping(*ball_pos)
if platform in collide:
yspeed = -yspeed
remove = []
# check collision with bricksfor brick in bricks:
if brick in collide:
remove.append(brick)
yspeed = -yspeed
# remove bricksfor brick in remove:
bricks.remove(brick)
canvas.delete(brick)
root.after(10, eventloop)
# --- main ---# - init -
root = tk.Tk()
root.title("Brick Breaker")
canvas = tk.Canvas(root, width=1200, height=900)
canvas.pack()
# - objects -
ball = canvas.create_oval(5, 5, 30, 30, fill="black")
xspeed = 1# gravity
yspeed = 4
platform = canvas.create_rectangle(5, 40, 250, 30, fill="black")
platform_left = False
platform_right = False
root.bind('<Left>', left_press)
root.bind('<KeyRelease-Left>', left_release)
root.bind('<Right>', right_press)
root.bind('<KeyRelease-Right>', right_release)
bricks = []
for i inrange(10):
x = i*100
y = 700
brick = canvas.create_rectangle(x, y, x+50, y+30, fill="red")
bricks.append(brick)
# - mainloop -
root.after(100, eventloop)
root.mainloop()
BTW: to control speed better change xspeed
, yspeed
instead of after()
Post a Comment for "How To Bounce Ball In Paddle Game On Another Shape Using Collisions?"