wxPython和pycairo练习记录9
9.1 键盘事件处理
想要实现的效果是,同时按下多个方向,无论松开或按下其他键,总是响应剩余最近按下的键,这里直接用列表存储处在按下状态的按键代码。
测试 wxPython 按下多个方向后松开最近按下的,之前保持按住的会失效 。那就不能靠按键直接改变坐标,只改变速度方向,然后坐标的计算移动交给定时器刷新。射击按键行为也交给定时器,只改变状态,不执行操作。
效果看起来还不错。之后可以看到,坦克和砖墙碰撞时的回弹问题也没有了。那么之前不是因为 wxPython 控件刷新用 Update 还是 Refresh 导致的,而是键盘事件处理逻辑没弄对。

class Player(Tank):
def __init__(self, x, y, surface=cv.surfaces["player"], rect=(0, 0, 48, 48), fps=100):
super(Player, self).__init__(x, y, surface, rect, fps)
self._direction = wx.WXK_UP # 当前方向
self._keydown = [] # 当前按下的方向键
def OnKeyDown(self, e):
key = e.GetKeyCode()
# 方向控制
if self._directions.get(key):
self._dx = 0
self._dy = 0
self._direction = key
self._directions[key]()
if key not in self._keydown:
self._keydown.append(key)
# 开火
if key == wx.WXK_SPACE and self._weapon:
self._weapon.SetFireState(True)
def OnKeyUp(self, e):
key = e.GetKeyCode()
if self._directions.get(key):
# 按键弹起,从按下方向列表移除
self._keydown.remove(key)
# 重置速度方向
self._dx = 0
self._dy = 0
if self._keydown:
# 方向设为最后按键方向
self._direction = self._keydown[-1]
self._directions[self._direction]()
else:
# 按键全部弹起后,移动和动画停止
self.Stop() # 停止动画
# 停火
if key == wx.WXK_SPACE and self._weapon:
self._weapon.SetFireState(False)
def GetDirection(self):
return self._direction
def UpdateXY(self):
# 坐标移动
self._x += self._dx * self._speed
self._y += self._dy * self._speed
def Update(self):
# 交给定时器执行
if self._dx or self._dy:
self.UpdateXY()
if self._weapon.IsFire():
self._weapon.Fire()
super().Update()
9.2 雷达
雷达主要目的是检测范围,有

本文介绍使用wxPython和pycairo进行游戏开发的具体实践,包括键盘事件处理、雷达检测及单帧动画创建等内容,解决了坦克游戏中的多种问题。
最低0.47元/天 解锁文章
356

被折叠的 条评论
为什么被折叠?



