Python从零模仿我的世界(十五)

本文介绍了如何通过设置鼠标焦点解决3D旋转窗口在旋转时鼠标移动事件的问题,并实现了空格键跳跃功能。通过重载pyglet.window.Window的set_exclusive_mouse方法,实现了在捕获和未捕获鼠标焦点状态下的窗口旋转控制。同时,添加了鼠标点击窗口捕获鼠标,按Esc键释放鼠标的功能,以及空格键跳跃的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自由移动

大家发现是什么问题了吗?没错!就是在旋转的时候鼠标在窗口上面晃来晃去的(也许还碍手碍脚的?),更糟的是只有当鼠标在窗口上方的时候才会捕获到鼠标移动事件,一旦不小心移到了外面窗口就不动了,真是烦人!有什么方法能解决这个问题呢?

解决方案 1

有的有的,有一个叫set_exclusive_mouse函数可以捕获到鼠标焦点,从而做到这一点,让我们来修改一下代码:

...
if __name__ == '__main__':
    ...
    win.set_exclusive_mouse(True)

    pyglet.app.run()

情况貌似好一点了。哎不对啊,这样一来,不就点不到窗口上的那个“叉叉”了吗?而且应该只有在捕获到焦点的时候才能旋转窗口,没捕获到的时候是不行的。看来还得在两种模式中切换了。

解决方案 2

先重载父类pyglet.window.Windowset_exclusive_mouse方法,在调用时修改这个属性:

class Window(...):
    ...
    def set_exclusive_mouse(self, exclusive):
        pyglet.window.Window.set_exclusive_mouse(self, exclusive)
        # 嘻嘻,其实这个属性在第九篇中就已经定义了哦
        self.exclusive = exclusive

接下来在on_mouse_motion中加一个判断,只有在捕获到鼠标焦点时才能旋转:

class Window(...):
    ...
    def on_mouse_motion(...):
        if self.exclusive:
            m = 0.15
            ...

最后我们规定:鼠标点击窗口一次就鼠标就被捕获,按一下Esc就取消鼠标捕获(不喜欢可以改哦):

class Window(...):
    ...
    def on_key_press(self, symbol, modifiers):
        ...
        elif symbol == pyglet.window.key.ESCAPE:
            self.set_exclusive_mouse(False)
    # 这个是鼠标点击事件的处理函数哦,忘了的赶紧看看第十三篇
    def on_mouse_press(self, x, y, button, modifiers):
        if button == pyglet.window.mouse.LEFT:
            self.set_exclusive_mouse(True)

这样我们就解决这个问题了。撒花!

接着我们把跳跃的功能也给实现了吧,空格键跳跃哦:

class Window(...):
    ...
    def on_key_press(self, symbol, modifiers):
        ...
        elif symbol == pyglet.window.key.SPACE:
            # 这是为了防止二段跳
            if self.dy == 0:
                # 忘记啦?看看第二篇
                self.dy = Settings.jump_speed

这段代码很简单,对吧?那么我们这一篇文章就先讲到这里了,同时我们的开发也告一段落,下一篇文章讲一些有趣的内容。最后,点一个赞哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值