【Python游戏编程03--pygame事件与设备轮询】

本文详细介绍了Pygame中的事件处理,包括QUIT、键盘、鼠标等事件的捕获与响应,以及如何使用设备轮询检测键盘和鼠标状态。同时,提供了pygame.event.get()、pygame.key.get_pressed()和pygame.mouse.get_pressed()等函数的使用方法。

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

一、pygame事件

1、pygame事件可以处理游戏中的各种事情,完整的事件列表如下:

QUIT,ACTIVEEVENT,KEYDOWN,KEYDOWN,MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN,JOYAXISMOTION,

JOYBALLMOTION,JOYHATMOTION........

查看文档:https://fishc.com.cn/thread-62173-1-4.html

2、事实循环事件

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()

3、键盘事件

键盘事件包括典型的keyup和keydown,当按键按下的时候响应KEYDOWN事件,按键弹起的时候KEYUP事件,通常可以设置一个事件变量,然后根据keyup或者keydown给他赋不同的值

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        elif event.type == KEYUP:
            key_flag = True
        elif event.type == KEYDOWN:
            key_flag = False

默认情况下,pygame不会重复的响应一个一直被按下的键,只有在第一次被按下时,才会被响应一次,如果需要重复按键的话执行下面的操作

pygame.key_set.repeat(10)
#参数是一个以毫秒为单位的值

4、鼠标事件

pygame支持一些鼠标事件,他们包括MOUSEMOTION,MOUSEBUTTONUP,MOUSEBUTTONDOWN.

在MOUSEMOTION中包含了一些属性:event.pos,event.rel,event.buttons

pygame.mouse.get_pressed()  ——  获取鼠标按键的情况(是否被按下)
pygame.mouse.get_pos()  ——  获取鼠标光标的位置
pygame.mouse.get_rel()  ——  获取鼠标一系列的活动
pygame.mouse.set_pos()  ——  设置鼠标光标的位置
pygame.mouse.set_visible()  ——  隐藏或显示鼠标光标
pygame.mouse.get_focused()  ——  检查程序界面是否获得鼠标焦点
pygame.mouse.set_cursor()  ——  设置鼠标光标在程序内的显示图像
pygame.mouse.get_cursor()  ——  获取鼠标光标在程序内的显示图像
 for event in pygame.event.get():
        if event.type == MOUSEMOTION:
             mouse_x,mouse_y = event.pos
             move_x,move_y = event.rel

MOUSEBUTTONDOWN里面的属性:

event.type == MOUSEBUTTONDOWN:
            mouse_down = event.button
            mouse_down_x,mouse_down_y = event.pos

MOUSEBUTTONUP里面的属性:

event.type == MOUSEBUTTONUP:
            mouse_up = event.button
            mouse_up_x,mouse_up_y = event.pos

https://fishc.com.cn/thread-62179-1-4.html

二、设备轮询

在pygame中除了pygame事件,还可以使用设备轮询的方法来检测是否有事件发生。而且在python里面是没有switch语句的,因此当需要处理的事件过多时,我们肯定不会去一条一条的去写if...elif....else来匹配,而设备轮询正好解决了这个棘手的问题。

1、轮询键盘

在pygame中,使用pygame.key.get_pressed()来轮询键盘接口,这个方法会返回布尔值的一个列表,其中每个键一个标志。使用键常量值来匹配按键,这样的好处就是不必遍历时间系统就可以检测多个键的按下

keys = pygame.key.get_pressed()

if keys[K_ESCAPE]:

   pygame.quit()

        sys.exit()

2、轮询鼠标

同样,我们可以使用类似的方法去轮询鼠标事件。

这里有3个相关的函数:

(1)pygame.mouse.get_pos(),这个函数会返回鼠标当前的坐标x,y;

(2)pygame.mouse.get_rel();

rel_x ,rel_y = pygame.mouse.get_rel().利用这个函数可以读取鼠标的相对移动。

(3)btn_one,btn_two,btn_three = pygame.mouse.get_pressed();

利用这个函数,可以获取鼠标按钮的状态。比如当左键按下的时候btn_one 的值会被赋值为1,鼠标按键弹起是会被赋值为0。

 

转载于:https://www.cnblogs.com/frankruby/p/10620342.html

<think>好的,用户之前询问了Python爱心代码的高级实现,我给出了几个使用不同库的例子,包括Pygame的粒子系统。现在用户的新问题是“pygame的做的不好”,可能是指用户在使用Pygame实现爱心代码时遇到了问题,或者对Pygame的性能、功能有不满。 首先,我需要确认用户的具体问题是什么。可能的情况包括: 1. 用户在使用提供的Pygame代码时遇到了错误或运行不顺利。 2. 用户觉得Pygame制作的爱心效果不够好,比如性能低下或视觉效果不佳。 3. 用户可能对Pygame作为游戏库的局限性感到不满,比如功能不够强大,或者学习曲线陡峭。 4. 用户可能在比较Pygame和其他库(如Unity、Godot)后,觉得Pygame不适合他们的需求。 接下来,我需要分析用户可能的身份和使用场景。用户可能是一个刚开始学习Python编程的人,对图形编程感兴趣,或者在制作小项目时遇到了障碍。用户可能希望实现更复杂的游戏或动画效果,但发现Pygame在某些方面不够理想。 用户的真实需求可能包括: - 寻求解决Pygame代码中的问题的方法。 - 寻找替代Pygame的库或工具,以实现更好的效果。 - 希望了解Pygame的局限性以及如何优化现有代码。 需要进一步考虑用户的深层需求,比如他们是否在开发特定类型的游戏或应用,是否需要更好的性能或更现代的图形功能,或者是否对学习更强大的框架感兴趣。 接下来,我需要整理Pygame的常见缺点,以帮助用户理解为何可能觉得“做的不好”。可能包括性能问题、功能限制、渲染效率低、缺乏现代功能等。同时,提供替代方案的建议,如使用其他游戏引擎或图形库,以及优化现有Pygame代码的方法。 还需要确保回答结构清晰,分点说明问题,并提供具体的例子或建议,帮助用户解决问题或做出决策。同时,语言需要保持友好和鼓励,避免让用户感到挫败,而是引导他们找到合适的解决方案。</think>当使用 Pygame 开发项目时,如果觉得“做的不好”,可能涉及以下几个方面的常见问题及其解决方案: --- ### 一、**Pygame 的局限性** #### 1. **性能瓶颈** - **问题**:原生 Pygame 基于 SDL1,对多线程支持有限,大量粒子或复杂图形时帧率下降明显。 - **例子**:上文爱心粒子代码中,粒子数超过 2000 时可能出现卡顿。 - **优化方案**: - 使用 `pygame.sprite.Group` 和批处理渲染。 - 改用 OpenGL 加速(如 `pygame2` 或 `pyglet`)。 - 减少实时计算:预先生成粒子路径或简化碰撞检测。 #### 2. **渲染质量不足** - **问题**:默认仅支持低质量位图渲染,缺少抗锯齿、光影等现代特效。 - **例子**:爱心边缘锯齿明显,粒子效果单调。 - **优化方案**: - 通过 `pygame.gfxdraw` 实现抗锯齿。 - 使用 Shader 编程(需配合 `ModernGL` 或 `Arcade` 库)。 #### 3. **功能缺失** - **问题**:无内置物理引擎、3D 支持弱,复杂交互需手动实现。 - **例子**:实现爱心粒子碰撞需自行编写物理逻辑。 - **替代方案**: - 集成 `pymunk`(2D 物理引擎)处理物理效果。 - 使用 `Ursina Engine` 或 `Panda3D` 实现 3D 效果。 --- ### 二、**常见开发痛点** #### 1. **事件处理繁琐** - **问题**:键盘/鼠标事件需逐帧轮询,复杂 UI 交互代码臃肿。 - **改进代码示例**: ```python # 使用状态管理简化事件处理 keys = pygame.key.get_pressed() if keys[pygame.K_SPACE]: # 空格键触发爱心缩放 heart_scale += 0.1 ``` #### 2. **跨平台兼容性问题** - **问题**:不同操作系统下分辨率、音频支持可能异常。 - **解决方案**: - 使用 `pygame.display.set_mode((0,0), pygame.FULLSCREEN)` 自动适配分辨率。 - 优先加载通用音频格式(如 `.wav` 而非 `.mp3`)。 #### 3. **文档过时** - **问题**:官方文档更新缓慢,部分示例代码不适用于新版 Python- **推荐资源**: - [Pygame 社区 Wiki](https://github.com/pygame/pygame/wiki) - 《Making Games with Python and Pygame》开源书籍。 --- ### 三、**Pygame 的替代方案** 若需突破 Pygame 限制,可尝试以下工具: | 工具 | 优势 | 适合场景 | |---------------------|-----------------------------------|------------------------| | **Arcade** | 现代 API,内置物理引擎 | 2D 游戏开发 | | **Godot** | 完整游戏引擎,支持 C#/Python | 跨平台复杂项目 | | **Unity + IronPython** | 工业级 3D 渲染,庞大资源库 | 高性能 3D 游戏 | | **Web 框架(如 Three.js)** | 浏览器部署,免安装 | 网页互动爱心动画 | --- ### 四、**何时坚持使用 Pygame?** 尽管有局限性,Pygame 仍适合: 1. **教育场景**:代码直观,适合初学者理解游戏逻辑。 2. **快速原型**:2D 小游戏或动画的快速验证。 3. **怀旧项目**:复刻经典像素风游戏(如《扫雷》《打砖块》)。 --- ### 五、**性能优化示例(改进爱心粒子代码)** ```python # 使用 Sprite 和 Group 优化粒子系统 class OptimizedParticle(pygame.sprite.Sprite): def __init__(self, pos): super().__init__() self.image = pygame.Surface((4,4), pygame.SRCALPHA) pygame.draw.circle(self.image, (255,0,0), (2,2), 2) self.rect = self.image.get_rect(center=pos) self.velocity = [random.uniform(-1,1), random.uniform(-5,-1)] def update(self): self.rect.x += self.velocity[0] self.rect.y += self.velocity[1] self.velocity[1] += 0.1 # 主循环中使用 Group 批量渲染 particle_group = pygame.sprite.Group() if len(particle_group) < 1000: particle_group.add(OptimizedParticle((400,300))) particle_group.update() particle_group.draw(screen) ``` 通过面向对象重构,帧率可提升 2-3 倍。 --- 若具体遇到某个问题(如画面撕裂、音画不同步),可以提供更多细节,我可以给出针对性解决方案!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值