简体   繁体   中英

python tkinter bouncing ball game

I'm making a basic game. I want the ball to bounce back up ONLY when it hits the platform. So far, I've written code that will make the ball bounce off the top and bottom screen, but I'm having trouble with getting the ball to bounce off the platform.

from tkinter import *
import time
import tkinter
tk = Tk()

canvas = Canvas(tk, bg="white",width=(900),height=(500))
canvas.pack()

platform = canvas.create_rectangle(400,400,500,410)

def ball():
    xspeed = 2
    yspeed = 2
    ball = canvas.create_oval(430,10,470,50)
    while True:
        canvas.move(ball, xspeed, yspeed)
        pos = canvas.coords(ball)
        if pos[2] >=900 or pos[0] <0:
            xspeed = -xspeed
        tk.update()
        time.sleep(0.01)


def board():
    board_right()
    board_left()


def board_right(event):
    xspeed = 5
    yspeed = 0
    canvas.move(platform,xspeed,yspeed)
    tk.update
    time.sleep(0.01)

def board_left(event):
    xspeed = 5
    yspeed = 0
    canvas.move(platform,-xspeed,yspeed)
    tk.update()
    time.sleep(0.01)


canvas.bind_all("<Right>",board_right)
canvas.bind_all("<Left>",board_left)
ball()
tk.mainloop()

please help me

Do not use time.sleep() as it will block the tkinter mainloop , use after() instead.

To check whether the ball hits the platform, you need to get the center x of the ball and the lower y of the ball. If center x is within the left and right of platform and the ball lower y is the platform upper y, then reverse the ball y speed. Otherwise game over!

Below is sample code based on yours:

import tkinter as tk

root = tk.Tk()

width = 900
height = 500

canvas = tk.Canvas(root, bg='white', width=width, height=height)
canvas.pack()

ball = canvas.create_oval(430, 10, 470, 50, fill='green')

platform_y = height - 20
platform = canvas.create_rectangle(width//2-50, platform_y, width//2+50, platform_y+10, fill='black')

# ball moving speed
xspeed = yspeed = 2

def move_ball():
  global xspeed, yspeed
  x1, y1, x2, y2 = canvas.coords(ball)
  if x1 <= 0 or x2 >= width:
    # hit wall, reverse x speed
    xspeed = -xspeed
  if y1 <= 0:
    # hit top wall
    yspeed = 2
  elif y2 >= platform_y:
    # calculate center x of the ball
    cx = (x1 + x2) // 2
    # check whether platform is hit
    px1, _, px2, _ = canvas.coords(platform)
    if px1 <= cx <= px2:
      yspeed = -2
    else:
      canvas.create_text(width//2, height//2, text='Game Over', font=('Arial Bold', 32), fill='red')
      return
  canvas.move(ball, xspeed, yspeed)
  canvas.after(20, move_ball)

def board_right(event):
  x1, y1, x2, y2 = canvas.coords(platform)
  # make sure the platform is not moved beyond right wall
  if x2 < width:
    dx = min(width-x2, 10)
    canvas.move(platform, dx, 0)

def board_left(event):
  x1, y1, x2, y2 = canvas.coords(platform)
  # make sure the platform is not moved beyond left wall
  if x1 > 0:
    dx = min(x1, 10)
    canvas.move(platform, -dx, 0)

canvas.bind_all('<Right>', board_right)
canvas.bind_all('<Left>', board_left)

move_ball()

root.mainloop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM