簡體   English   中英

python tkinter彈跳球游戲

[英]python tkinter bouncing ball game

我正在制作一個基本的游戲。 我希望球只有在擊中平台時才能彈回。 到目前為止,我已經編寫了使球從頂部和底部屏幕反彈的代碼,但是我無法讓球從平台上反彈。

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()

請幫我

不要使用time.sleep()因為它會阻塞mainloop ,請改用after()

要檢查球是否擊中平台,您需要獲取球的中心 x 和球的下部 y。 如果中心 x 在平台的左側和右側,並且下 y 的球是平台上 y 的球,則反轉球 y 的速度。 否則游戲結束!

以下是基於您的示例代碼:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM