python - 在 event.type == ACTIVEEVENT 的 pygame 中,关于不同 event.state 和 event.gain 参数含义的文档在哪里?
问题描述
我正在用 pygame 编写游戏,遇到了需要发现游戏何时获得和失去焦点的情况。这由 event.type 表示ACTIVEEVENT
,它有两个参数event.state
和event.gain
。但是,在查看完所有内容后,我只能找到一些关于这些含义的信息。ACTIVEEVENT至少可以有 6 个不同state
的值,每个状态都可以有多个gain
值
到处都有片段,但我实际上无法在任何地方找到有关它的实际文档。ACTIVEEVENT
在https://www.pygame.org/docs/ref/中有几个引用,但没有实际信息。
我不是在寻找人们告诉我他们发现的关于它如何工作的点点滴滴,我已经在点点滴滴中找到了它,并基于此和一些实验,我发现了我需要什么。(ACTIVEEVENT
状态 2,增益 0 似乎意味着窗口失去焦点,ACTIVEEVENT
状态 6,增益 1 似乎意味着窗口重新获得焦点)。
我想知道的是在哪里有关于 ACTIVEEVENT 事件的任何实际文档和/或如果我以某种方式错过它,我可以在 pygame 文档中的哪里找到它?
解决方案
由于 pygame 是一个精简的 SQL 包装器,因此查看libsdl本身通常会有所帮助:
/** @name The available application states */
/*@{*/
#define SDL_APPMOUSEFOCUS 0x01 /**< The app has mouse coverage */
#define SDL_APPINPUTFOCUS 0x02 /**< The app has input focus */
#define SDL_APPACTIVE 0x04 /**< The application is active */
/*@}*/
/* Function prototypes */
/**
* This function returns the current state of the application, which is a
* bitwise combination of SDL_APPMOUSEFOCUS, SDL_APPINPUTFOCUS, and
* SDL_APPACTIVE. If SDL_APPACTIVE is set, then the user is able to
* see your application, otherwise it has been iconified or disabled.
*/
extern DECLSPEC Uint8 SDLCALL SDL_GetAppState(void);
这是一个小 pygame 脚本,用于查看这些值的实际作用:
import pygame
pygame.init()
screen = pygame.display.set_mode((200, 200))
clock = pygame.time.Clock()
APPMOUSEFOCUS = 1
APPINPUTFOCUS = 2
APPACTIVE = 4
def main():
while True:
for e in pygame.event.get():
if e.type == pygame.QUIT:
return
if e.type == pygame.ACTIVEEVENT:
if e.state & APPMOUSEFOCUS == APPMOUSEFOCUS:
print ('mouse focus ' + ('gained' if e.gain else 'lost'))
if e.state & APPINPUTFOCUS == APPINPUTFOCUS:
print ('input focus ' + ('gained' if e.gain else 'lost'))
if e.state & APPACTIVE == APPACTIVE:
print('app is ' + ('visibile' if e.gain else 'iconified'))
screen.fill((30, 30, 30))
pygame.display.flip()
clock.tick(60)
main()
请注意,SDL 2 不再使用这些值,而是使用类似的事件
SDL_WINDOWEVENT_ENTER
SDL_WINDOWEVENT_LEAVE
SDL_WINDOWEVENT_FOCUS_GAINED
SDL_WINDOWEVENT_FOCUS_LOST
SDL_WINDOWEVENT_MINIMIZED
SDL_WINDOWEVENT_RESTORED
如果您将来想使用 pygame 2,这可能很重要。
推荐阅读
- wpf - 将光标拖放到画布上时如何获取最后一个位置
- python - 在 ModelAdmin 中保存模型时如何检查初始数据?
- android - 如何使用 Dagger Android 创建自定义范围并共享相同的实例
- asp.net - 如何在 asp.net 中创建 iCal 订阅服务
- reactjs - 在父组件中获取子组件的 onClick 道具
- react-native - 如何在函数中使用 id 更改组件值或颜色,例如 Text?
- raspberry-pi - Windows iot viewsonic 触摸屏
- javascript - 如何将 FileReader 更改为 url
- database - Flyway-模式迁移
- django - Django 在注册期间总是返回无效的表单