В pygame для event.type == ACTIVEEVENT, где находится документация о том, что означают различные параметры event.state и event.gain? - PullRequest
2 голосов
/ 28 апреля 2020

Я пишу игру в Pygame и столкнулся с необходимостью выяснить, когда игра получает и теряет фокус. На это указывает event.type ACTIVEEVENT, который имеет два параметра event.state и event.gain. Однако после осмотра я смог найти лишь небольшую информацию о том, что они подразумевают. Существует, по крайней мере, 6 различных state значений, которые может иметь ACTIVEEVENT, и каждое из этих состояний может иметь несколько gain значений

. Здесь и здесь есть фрагменты, но я не смог найти фактическую документацию по ним. где угодно. Есть пара ссылок на ACTIVEEVENT в https://www.pygame.org/docs/ref/, но нет фактической информации.

Я не ищу людей, которые бы рассказывали мне кусочки того, что они обнаружили о том, как это работает, я уже нашел это в слябах, и на основании этого и некоторых экспериментов я понял, что мне нужно. (ACTIVEEVENT состояние 2, усиление 0, кажется, означает потерю фокуса окна, а ACTIVEEVENT состояние 6, усиление 1, кажется, восстановление фокуса окна).

То, что я хочу знать, это где есть какая-то фактическая документация по событию ACTIVEEVENT и / или где я могу найти его в документации по pygame, если мне что-то не хватает?

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Поскольку 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()

enter image description here

Обратите внимание, что SDL 2 больше не использует эти значения, а скорее такие события, как

SDL_WINDOWEVENT_ENTER
SDL_WINDOWEVENT_LEAVE
SDL_WINDOWEVENT_FOCUS_GAINED
SDL_WINDOWEVENT_FOCUS_LOST
SDL_WINDOWEVENT_MINIMIZED
SDL_WINDOWEVENT_RESTORED

, которые могут иметь значение если вы хотите использовать Pygame 2 в будущем.

1 голос
/ 28 апреля 2020

Здесь он говорит: «Когда установлен режим отображения, несколько событий помещаются в очередь событий Pygame. pygame.QUIT отправляется, когда пользователь запросил закрытие программы. Окно будет получать pygame.ACTIVEEVENT события по мере того, как дисплей получает и теряет фокус ввода. Если дисплей установлен с флагом pygame.RESIZABLE, события pygame.VIDEORESIZE будут отправляться, когда пользователь настраивает размеры окна. Аппаратные дисплеи, которые рисуют прямо на экране, будут получить pygame.VIDEOEXPOSE события, когда части окна должны быть перерисованы. "

Здесь также упоминается здесь , где говорится, что событие имеет следующие атрибуты: gain & state.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...