Tkinter Canvas 设计让球在画布四面反弹

Tkinter Canvas 设计让球在画布四面反弹

在反弹球游戏中,我们必须让球在四面皆可反弹,这时须考虑到球在x轴移动,这时原先Ball类别的__init__()函数中需修改下列两行。

self.x = 0             # 水平不移动
self.y = step          # 垂直移动单位

下面是更改结果。

startPos = [-4, -3, -2 -1, 1, 2, 3, 4]   # 球最初x轴位移的随机数
shuffle(startPos)                        # 打乱排列
self.x = startPos[0]                     # 球最初水平移动单位
self.y = step                            # 垂直移动单位

上述程序修改的思想是球局开始时,每个循环x轴的移动单位是随机数产生的。至于在ballMove( )方法中,我们须考虑到水平轴的移动可能碰撞画布左边与右边的状况,是如果球撞到画布左边,设置球沿x轴移动是正值,也就是往右移动。

if ballPos[0] <= 0:                       # 侦测球是否超过画布左方
    self.x = step

如果球撞到画布右边,设置球在x轴移动是负值,也就是往左移动。

if ballPos[2] >= winW:                    # 侦测球是否超过画布右方
    self.x = -step

示例1

球可以在四周移动。

from tkinter import * 
from random import * 

import time 

class Ball:#class Ball():#这样写是一样的
    def __init__(self,canvas,color,winW,winH):
        self.canvas = canvas
        self.id = canvas.create_oval(0, 0, 20, 20, fill=color) # 建立球对象
        self.canvas.move(self.id,winW/2,winH/2)   # 设置球最初位置
        startPos = [-4, -3, -2, -1, 1, 2, 3, 4]   # 球最初x轴位移的随机数
        shuffle(startPos)                         # 打乱排序
        self.x = startPos[0]                      # 球最初水平移动单位
        self.y = step                             # 垂直移动单位

    def ballMove(self):
        self.canvas.move(self.id, self.x, self.y)        # step是正值表示往下移动
        ballPos = self.canvas.coords(self.id)
        if ballPos[0] <= 0:          # 侦测球是否超过画布左方
            self.x = step       
        if ballPos[1] <= 0:          # 侦测球是否超过画布上方
            self.y = step
        if ballPos[2] >= winW:       # 侦测球是否超过画布右方
            self.x = -step           
        if ballPos[3] >= winH:       # 侦测球是否超过画布下方
            self.y = -step

winW = 640      # 定义画布宽度
winH = 480      # 定义画布高度
step = 3        # 定义速度可想成位移步长
speed = 0.03    # 设置移动速度

tk = Tk()
tk.title("Bouncing Ball - apidemos")                    # 游戏窗口标题
tk.wm_attributes('-topmost',1)               # 确保游戏窗口在屏幕最上层
canvas = Canvas(tk,width=winW, height=winH)  # 建立画布
canvas.pack()
tk.update()   

ball = Ball(canvas,'yellow',winW,winH)  # 定义球对象

while True:
    ball.ballMove()
    tk.update()
    time.sleep(speed)   # 可以控制移动速度

# tk.mainloop()

输出:

Tkinter Canvas 设计让球在画布四面反弹

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程