wxPython和pycairo练习记录9

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

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 雷达

雷达主要目的是检测范围,有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值