tkinter类内如何绑定Canvas对象 实现方向键控制飞船移动
修复方案
存在的问题
- 拼写错误:
down方法中self.spacehipx拼写错误,少了字母s,应为self.spaceshipx,导致速度变量赋值失效 - 缺少飞船移动的循环逻辑:仅在类初始化时执行了一次飞船移动方法,没有把飞船位置更新加入到和小行星同步的帧循环(
move_active方法)中,即使修改了速度变量也不会触发位置刷新 - 按键绑定逻辑冗余:
run方法中绑定按键时不需要引用全局实例SpaceF,直接绑定类内部的self.down方法即可,避免依赖全局变量 - 坐标方向逻辑错误:tkinter的Canvas坐标系左上角为原点(0,0),y轴向下数值递增,原代码给y轴设的
-10实际是向上移动,要实现向下移动应该设为正值
修复后的完整代码
from tkinter import * from random import randint as rnd class SpaceField: def __init__(self, window = None): self.window = window self.window = Tk() self.window.title("Asteriods") # Define canvas size and active flag self.wide, self.high, self.active = 700, 600, True self.spaceshipx, self.spaceshipy = 0, 0 # 初始化飞船速度为0 self.canvas_display() self.asteriod_creation_seperation() self.spaceship_creation() #self.bullet_creation() def spaceship_creation(self): self.shipcoords = [] self.spaceship = self.canvas.create_polygon(340,300,360, 300, 350,280, outline ="white") self.shipcoords.append(self.spaceship) def spaceship_movement(self): # 按照当前速度更新飞船位置 self.canvas.move(self.spaceship, self.spaceshipx, self.spaceshipy) def down(self, event): print(event.keysym) self.spaceshipx = 0 self.spaceshipy = 10 # y轴正方向为向下,改为正值实现下移 def asteriod_creation_seperation(self): self.asteroids, self.speed = [], [] size, radius = 50, 25 for i in range(25): spacex = rnd(size, self.wide - size) spacey = rnd(size, self.high - size) self.asteroids.append( self.canvas.create_oval( spacex, spacey, spacex+size, spacey+size, width=2, tags = "asteriod", outline = "white")) self.speed.append((rnd(1,4),rnd(1,4))) def asteriod_update(self): for i, a in enumerate(self.asteroids): xx, yy = self.speed[i] x, y, w, h = self.canvas.coords(a) if x < 0 or w > self.wide: xx = -xx * rnd(1, 4) if y < 0 or h > self.high: yy = -yy * rnd(1, 4) self.speed[i] = (max( -4, min( xx, 4)), max( -4, min( yy, 4 ))) self.canvas.move(a, xx, yy) def move_active(self): if self.active: self.asteriod_update() self.spaceship_movement() # 每一帧同步更新飞船位置 self.window.after(40, self.move_active) def canvas_display(self): self.canvas = Canvas( self.window, width = self.wide, height = self.high, background = "black") self.canvas.pack(expand = True, fill = "both") def run(self): self.window.bind("<KeyPress-Down>", self.down) # 简化绑定逻辑 self.window.after(200, self.move_active) self.window.mainloop() if __name__ == "__main__": SpaceF = SpaceField() SpaceF.run()
内容的提问来源于stack exchange,提问作者user14232195
相关产品推荐
相关产品推荐

