Tkinter Canvas 设计球拍移动

Tkinter Canvas 设计球拍移动

由于是假设使用键盘的右移和左移键移动球拍,所以可以在Racket的__init__()函数内增加,使用bind_all( )方法绑定键盘按键发生时的移动方式。

self.canvas.bind_all('KeyPress-Right', self.moveRight)  # 绑定按住右键
self.canvas.bind_all('KeyPress-Left', self.moveLeft)    # 绑定按住左键

所以在Racket类内增加下列moveRight()和moveLeft()的设计。

def moveLeft(self, event):           # 球拍每次向左移动的单位数
    self.x = -3
def moveRight(self, event):          # 球拍每次向右移动的单位数
    self.x = 3

上述设计相当于每次的位移量是3,如果游戏有设等级,可以让新手位移量增加,随等级增加让位移量减少。此外,这个程序中增加了球拍移动主体设计如下。

def racketMove(self):                         # 设计球拍移动
    self.canvas.move(self.id, self.x, 0)
    pos = self.canvas.coords(self.id)
    if pos[0] <= 0:                           # 移动时是否碰到画布左边
        self.x = 0
    elif pos[2] >= winW:                      # 移动时是否碰到画布右边
        self.x = 0

主程序也将新增球拍移动方法的调用。

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

示例1

增加设计让球拍左右可以移动,下列程序第31行是设置程序开始时,球拍位移是0。下面是球拍类的内容。

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
class Racket():
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0,0,100,15,fill=color)  # 球拍对象
        self.canvas.move(self.id, 270, 400)
        self.x = 0
        self.canvas.bind_all('<KeyPress-Right>',self.moveRight)   # 绑定按住右键 ##########################
        self.canvas.bind_all('<KeyPress-Left>',self.moveLeft)     # 绑定按住左键
    def racketMove(self):
        self.canvas.move(self.id,self.x,0)
        pos = self.canvas.coords(self.id)
        # self.x = 0
        if pos[0] <= 0:
            self.x = 0
        elif pos[2] >= winW:
            self.x = 0
    def moveLeft(self,event):
        print("Press Left Key")
        self.x = -3
    def moveRight(self,event):
        print("Press Right Key")
        self.x = 3

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

# 以下两行代码执行顺序决定了两者重合时哪一个对象被遮挡
racket = Racket(canvas,'purple')        # 定义紫色球拍
ball = Ball(canvas,'yellow',winW,winH)  # 定义球对象

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

# tk.mainloop()

输出:

Tkinter Canvas 设计球拍移动

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程