Как графически вводить данные с клавиатуры sdl

Обновлено: 21.11.2024

Simple directmedia layer (SDL) – это кроссплатформенная мультимедийная библиотека, написанная на C и обеспечивающая низкоуровневый доступ к клавиатуре, мыши, аудио, джойстику и 3D-оборудованию через OpenGL. Он также используется программным обеспечением для воспроизведения MPEG и многими популярными играми.

Techopedia объясняет простой слой Directmedia

SDL впервые был выпущен в 1998 году Сэмом Лантингой, когда он работал в Loki Software. SDL — это тонкая межплатформенная библиотека, обеспечивающая поддержку операций с 2D-пикселями, звука, доступа к файлам, обработки событий и многопоточности. Он дополняет OpenGL, обеспечивая графический вывод, предоставляя ввод с помощью мыши и клавиатуры. Все операции в SDL выполняются путем передачи параметров функциям. Библиотека разделена на многочисленные подсистемы, такие как видео, аудио, CD-ROM, джойстик и таймер. Помимо этой базовой низкоуровневой поддержки, существует также несколько официальных библиотек, предоставляющих дополнительные функции.

  • Окна
  • Mac OS X
  • ОС 9
  • Линукс
  • Google Android
  • АмигаОС
  • Хайку/BeOS
  • Слог
  • ВебОС

Он также обеспечивает привязку ко многим другим языкам, включая (неполный список):

Таким образом, это обычный выбор для многих мультимедийных приложений. Он также распространяется под GNU LGPL версии 2 и позволяет разрабатывать игры для нескольких платформ одновременно, а также своевременно переносить игру на новую платформу. В то время как звуковые функции SDL скромны, SDL API, который в основном связан с графикой, содержит около 200 функций и несколько структур. Он также предлагает инструменты для параллельного программирования, такие как семафоры, мьютексы, условные переменные и потоки.

SDL имеет уровень заголовков как оболочку для определенных функций операционной системы, предоставляя доступ к ним. Исходные коды SDL разбиты на разные модули для конкретных операционных систем. При компиляции для целевой системы выбираются правильные модули. SDL использует серверную часть GDI для Microsoft Windows, а также использует Xlib для связи с Linux и OpenVMS для графики и событий.

Директивы сшивания ( @graphql-tools/stitching-directives ) могут использоваться для настройки сшитого шлюза непосредственно через язык определения схем (SDL) его подслужб. Преимущество этого подхода заключается в том, что вся схема и конфигурация слияния типов представлены в одном документе, управляемом каждой подслужбой, и могут быть повторно загружены шлюзом на лету без формального развертывания или перезапуска сервера.< /p>

С помощью директив SDL подслужба может выразить свою полную схему и конфигурацию слияния типов в одном документе. См. соответствующий пример руководства для рабочей демонстрации.

В приведенном выше примере схемы «Пользователи» и «Сообщения» будут объединены в объединенном шлюзе и предоставят всю свою собственную конфигурацию объединенного типа. Все директивы SDL будут преобразованы непосредственно в статические конфигурации, обсуждаемые в документах по слиянию типов. См. раздел рецептов ниже, чтобы узнать о некоторых распространенных шаблонах.

По умолчанию директивы сшивания используют следующие определения (хотя имена этих директив могут быть изменены):

директива @merge ( keyField : String keyArg : String AdditionalArgs : String key : [ String !] argsExpr : String ) для FIELD_DEFINITION директива @key ( selectionSet : String !) для OBJECT директива @computed ( selectionSet : String !) для FIELD_DEFINITION директива @canonical по ОБЪЕКТУ | ИНТЕРФЕЙС | ВХОД_ОБЪЕКТ | СОЮЗ | ЕНУМ | СКАЛЯР | ПОЛЕ_DEFINITION | INPUT_FIELD_DEFINITION

@merge : обозначает корневое поле, используемое для запроса объединенного типа между службами. Имя отмеченного поля аналогично параметру fieldName в конфигурации объединенного типа, в то время как аргументы поля и возвращаемый тип используются для определения конфигурации слияния. Аргументы директивы настраивают поведение слияния (см. примеры рецептов):

  • keyField : указывает имя поля для выбора исходных объектов в качестве значения ключа. Если она опущена, директива @key должна быть включена в определение возвращаемого типа, чтобы быть встроенной в ключ объекта.
  • keyArg : указывает, какой аргумент поля получает ключ слияния. Это может быть опущено для полей только с одним аргументом, где можно вывести получателя.
  • additionalArgs : указывает строку дополнительных ключей и значений, применяемых к другим аргументам, в формате """ arg1: "value", arg2: "value" """ .
  • key : только расширенное использование. Позволяет создать собственный ключ только для аргумента из selectionSet, включенного в директиву @key.
  • argsExpr: только для расширенного использования. Этот аргумент задает строковое выражение, позволяющее более точно настраивать входные аргументы. Правила оценки этого аргумента следующие:
    • базовый объектный разбор входного ключа: "arg1: $key.arg1, arg2: $key.arg2"
    • любое выражение, заключенное в двойные скобки, будет оценено один раз для каждого из запрошенных ключей, а затем отправлено в виде списка: "input: < keys: [[$key]] >"
    • на выборки из ключа можно ссылаться с помощью знака $ и записи через точку: "upcs: [[$key.upc]]" , так что $key.upc ссылается на поле upc ключа.

    @key : указывает базовый набор выбора, необходимый для объединения аннотированного типа между подсхемами. Аналогично параметру selectionSet, указанному в конфигурации объединенного типа.

    @computed : указывает набор полей, требуемых от других служб для вычисления значения этого поля. Эти дополнительные поля выбираются только тогда, когда запрашивается вычисляемое поле. Аналогично вычисляемому полю в конфигурации объединенного типа. Вычисляемые зависимости полей должны быть отправлены в подслужбу с использованием ключа объекта.

    @canonical : указывает типы и поля, обеспечивающие каноническое определение, которое будет встроено в схему шлюза. Полезно для выбора предпочтительных характеристик среди типов и полей, которые перекрываются в подсхемах. Корневые поля, помеченные как канонические, указывают, какую подсхему поле заменяет для новых запросов, входящих в граф.

    Вы можете использовать вспомогательную функцию stitchingDirectives для создания собственных определений типов и валидатора с пользовательскими именами. Например, приведенная ниже конфигурация создает ресурсы для директив @myKey, @myMerge и @myComputed:

    Чтобы настроить директивы сшивания, вам необходимо установить их определения в каждую подсхему, а затем добавить преобразователь к сшиваемому шлюзу, который их считывает. Полную демонстрацию см. в соответствующем примере справочника.

    При настройке подслужбы вам необходимо сделать три вещи:

    1. Включите allStitchingDirectivesTypeDefs в строку определений типов вашей схемы (они определяют схему самих директив).
    2. Включите в исполняемую схему валидатор сшивкиDirectivesValidator (настоятельно рекомендуется).
    3. Настройте поле запроса, которое возвращает необработанную строку определений типов схемы (см. пример поля _sdl выше). Это поле чрезвычайно важно для предоставления аннотированного SDL вашему прошиваемому шлюзу. К сожалению, пользовательские директивы нельзя получить путем самоанализа схемы.

    При настройке объединенного шлюза вам необходимо сделать две вещи:

    Простейший шаблон слияния выбирает ключевое поле из исходных объектов:

    введите User < id : ID ! >тип продукта введите запрос

    Здесь директива @merge помечает запрос на слияние каждого типа, а ее аргумент keyField указывает поле, которое должно быть выбрано из каждого исходного объекта в качестве значения аргумента запроса. Приведенный выше SDL преобразуется в следующую конфигурацию слияния:

    Этот шаблон настраивает запрос на слияние, который получает несколько аргументов:

    введите User < id : ID ! >введите запрос

    Поскольку поле слияния получает несколько аргументов, параметр keyArg необходим, чтобы указать, какой аргумент получает ключ(и). Параметр AdditionalArgs также может использоваться для предоставления статических значений для других аргументов. Приведенный выше SDL преобразуется в следующую конфигурацию слияния:

    При отсутствии keyField для выбора директивы слияния ключи примут форму объекта с именем __typename и всеми полями, собранными для используемых наборов selectionSets по типу:

    Вышеприведенный SDL указывает selectionSet на уровне типа с помощью директивы @key и selectionSet на уровне поля с помощью директивы @computed. Директива @merge здесь не принимает аргументов и создает ключи объектов с полями, собранными из всех используемых наборов selectionSet. Эти ключи объекта передаются в поле слияния как настраиваемый скаляр (здесь он называется _Key) или как входной объект. Этот SDL преобразуется в следующую конфигурацию слияния:

    Каждый созданный ключ объекта будет иметь __typename и все используемые поля selectionSet для типа. Например, когда запрашивается поле shippingEstimate, результирующие ключи объекта будут выглядеть следующим образом:

    Однако, если shippingEstimate НЕ запрашивается, сгенерированные объектные ключи будут содержать только поля из базового набора selectionSet:

    Подобно ключам объекта, описанным выше, тип входного объекта может использоваться вместо универсального скаляра для преобразования ключей объекта с определенной схемой:

    Этот SDL преобразуется в следующую конфигурацию слияния:

    // предположим, что "выбрать" работает как метод lodash. merge : < Product : < selectionSet : '< upc >' , вычисленные поля : < shippingEstimate : < selectionSet : '< вес цены >' >, >, fieldName : 'products' , key : ( obj ) => pick ( obj , [ 'upc' , 'цена' , 'вес']), argsFromKeys : (keys) => (), > >

    Эти типизированные входные данные ведут себя так же, как и ключи объекта, в отношении включения только полей из используемых наборов выбора. Результирующие объекты будут включать только поля, внесенные в белый список их входной схемой, и подвержены ошибкам несоответствия допустимости значений NULL:

    В более сложных случаях может потребоваться интерфейс со сложными входными данными. В этих случаях keyArg может указать путь в пространстве имен, по которому следует отправить ключ слияния:

    type Product @key ( selectionSet : "" ) введите ProductKey < upc : ID ! >input ProductInput < ключи: [ ProductKey !]! >введите запрос

    После того как подсхемы и их конфигурации слияния определены как аннотированные SDL, новые версии этих документов могут быть отправлены на шлюз для запуска "горячей" перезагрузки или перезагрузки схемы шлюза без перезапуска его сервера.

    Однако отправка непроверенных SDL непосредственно на шлюз сопряжена с риском из-за возможности смешивания несовместимых версий подсхем. Следовательно, для долгосрочной стабильности необходима официальная стратегия управления версиями, тестирования и выпуска. См. пример управления версиями в руководстве, демонстрирующий преобразование базового репозитория Git в реестр схем, который управляет версиями и выпусками.

    Игры в Linux стремительно развиваются отчасти из-за того простого факта, что гики любят игры, а отчасти из-за последних разработок в области мультимедиа для Linux. За последние несколько лет появилось несколько отличных мультимедийных инструментов, ориентированных на Linux, таких как графический интерфейс GGI и звуковая система ALSA. Библиотека SDL также недавно произвела небольшой фурор. SDL — это библиотека мультимедийного программирования общего назначения, которая обеспечивает быстрый и портативный доступ к графике, звуку, устройствам ввода, потокам и рендерингу OpenGL. Основная библиотека SDL переносима на несколько разновидностей UNIX, а также на BeOS, MacOS и Win32. Это делает его отличным выбором для разработки кроссплатформенных игр без ущерба для производительности.

    В отличие от многих мультимедийных наборов инструментов, SDL на самом деле не взаимодействует с аппаратным обеспечением системы. Вместо этого он служит слоем между приложением и базовой системой. Например, графическая система SDL может использовать консоль кадрового буфера или X11 под Linux, но DirectDraw под Windows. В любом случае API SDL остается неизменным, и приложению не нужно беспокоиться о том, что происходит внутри, а в некоторых случаях тщательно написанное приложение SDL можно портировать на новую платформу с помощью быстрой перекомпиляции.

    В этой статье мы познакомимся с видео API SDL с нуля. Мы также покажем, как собирать ввод с клавиатуры. Большая часть этой статьи взята из главы готовящейся книги автора о разработке игр для Linux (No Starch Press и Loki Entertainment Software, выпуск запланирован на начало 2001 г.).

    Если вы когда-либо работали с набором инструментов Microsoft DirectX, вы заметите, что SDL — крошечная библиотека по сравнению с ней. Исходный код основной библиотеки весит чуть менее шести мегабайт, и это включает в себя много дополнительного кода, который никогда не будет связан с приложением Linux. Однако не дайте себя обмануть — эти шесть мегабайт хорошо используются, а основная библиотека SDL предоставляет почти все, что вам нужно для разработки высококачественных игр и медиаплееров для Linux. Кроме того, на веб-сайте размещен ряд дополнительных библиотек, которые предоставляют дополнительные функции, такие как загрузка изображений и расширенное микширование звука. Поскольку эти функции отделены от основной библиотеки, SDL остается небольшим и простым в освоении.

    Библиотека SDL состоит из нескольких дочерних API, обеспечивающих межплатформенную поддержку видео, аудио, обработки ввода, многопоточности, контекстов рендеринга OpenGL и других вещей, которые ценят разработчики игр. К сожалению, у нас недостаточно места, чтобы охватить все это, поэтому мы остановимся на программировании видео и обработке ввода — двух вещах, которые вам действительно нужны, чтобы освоить SDL.

    Единственная цель SDL video API — найти подходящее видеоустройство и настроить его для использования вашим приложением. После того, как он инициализировал дисплей (создал окно или переключил видеокарту в определенный режим), SDL уходит с вашего пути, предоставляя лишь минимальный набор функций для расталкивания блоков пикселей. SDL — это не набор инструментов для рисования; то, что вы делаете с видеоустройством после его инициализации, не является делом SDL.

    SDL использует структуры, называемые поверхностями (типа SDL_Surface), для представления графических данных. Поверхность — это просто блок памяти для хранения прямоугольной области пикселей (отдельных цветных точек). Каждая поверхность имеет ширину, высоту и определенный формат пикселей (подробнее об этом позже). SDL загружает файлы изображений прямо в структуры поверхности, а экран тоже является поверхностью (хотя и особой).

    Самым важным свойством поверхностей является то, что их можно очень быстро копировать друг на друга; то есть пиксели одной поверхности могут быть перенесены в прямоугольную область того же размера на другой поверхности. Эта операция называется блит (блочная передача изображения). Блиты являются фундаментальной частью программирования игр, потому что они позволяют составлять полные изображения из предварительно нарисованной графики (часто созданной художниками с помощью программного обеспечения для обработки изображений).Поскольку экран представляет собой такую ​​же поверхность, как и любая другая, целые изображения могут быть отправлены на экран с помощью одной операции копирования. SDL предоставляет общую функцию для выполнения быстрых бликов между поверхностями и может даже выполнять преобразование между поверхностями разных форматов пикселей на лету.

    Прежде чем мы сможем начать перенос поверхностей на экран, нам нужно инициализировать библиотеку SDL и переключить дисплей в соответствующий режим. Взгляните на листинг 1, аналог «Hello, world!» в SDL.

    Эта программа включает файл заголовка SDL.h, который является основным заголовком для SDL. Каждое приложение SDL должно включать этот файл. Программа также включает два стандартных заголовка для функций printf и atexit.

    Начнем с вызова SDL_Init для инициализации SDL. Эта функция принимает список аргументов, объединенных по схеме ИЛИ, чтобы указать, какие подсистемы следует инициализировать; нас интересует только видеоподсистема, поэтому мы передаем SDL_INIT_VIDEO (например, если нам нужен звук, мы вызываем эту функцию с помощью SDL_INIT_VIDEO | SDL_INIT_AUDIO). Если не произойдет фатальная ошибка, эта функция должна возвращать ноль. Мы также используем средство C atexit, чтобы запросить вызов SDL_Quit перед выходом из программы. Эта функция обеспечивает правильное завершение работы SDL (что становится особенно важным в случае сбоя полноэкранного приложения).

    Наконец, мы сообщаем об успехе и выходим. Библиотека C автоматически вызывает SDL_Quit (поскольку мы зарегистрировали ее с помощью atexit), и SDL возвращает отображение видео в исходный режим. (Мы также можем вызвать SDL_Quit явно, если хотим выключить систему перед выходом из нашего приложения; нет ничего плохого в том, чтобы вызвать его более одного раза.)

    Теперь, когда мы создали приложение SDL, нам нужно его скомпилировать. Приложения SDL легко создавать; при правильной установке SDL им просто требуется несколько флагов и библиотек. Стандартный дистрибутив SDL включает программу под названием sdl-config (аналогичную программам gtk-config и glib-config, поставляемым с набором инструментов GTK+) для предоставления соответствующих аргументов командной строки gcc. Команда sdl-config --cflags создает список опций, которые должны быть переданы компилятору, а sdl-config --libs создает список библиотек, которые следует слинковать. Командная строка gcc. Если в вашей системе установлен SDL, вы можете скомпилировать этот пример с помощью следующей команды:

    Поместить данные на поверхность SDL очень просто. Каждая структура SDL_Surface содержит член пикселей. Это пустой указатель на необработанное графическое изображение, и мы можем писать в него напрямую, если знаем, для какого типа пикселя настроена поверхность. Мы должны вызвать функцию SDL_LockSurface перед доступом к этим данным (поскольку некоторые поверхности находятся в специальных областях памяти и требуют специальной обработки). Когда мы закончим с поверхностью, мы должны вызвать SDL_UnlockSurface, чтобы освободить ее. Ширина и высота изображения задаются элементами w и h структуры, а формат пикселей задается элементом формата (который имеет тип SDL_PixelFormat). SDL часто эмулирует нестандартные разрешения экрана с более высокими разрешениями, а элемент шага структуры формата пикселей указывает фактическую ширину буфера кадра. Вы должны всегда использовать шаг вместо w для вычисления смещения в буфере пикселей, иначе ваше приложение может не работать на некоторых устройствах отображения.

    В примере, показанном в листинге 2, используется информация о формате пикселей SDL для рисования отдельных пикселей на экране. Мы решили использовать 16-битный (hicolor) режим для демонстрационных целей, но другие режимы также просты в программировании.

    Еще одна важная проблема связана с функцией SDL_UpdateRect. Как мы упоминали ранее, SDL иногда эмулирует видеорежимы, если видеокарта сама не может обеспечить определенный режим. Например, если видеокарта не поддерживает запрошенный 24-битный режим, SDL может вместо этого выбрать 16-битный режим и вернуть фальшивую настройку кадрового буфера для 24-битных пикселей. Это позволит вашей программе продолжить работу в обычном режиме, а SDL справится с преобразованием из 24-битного в 16-битное на лету (с небольшой потерей производительности). Функция SDL_UpdateRect информирует SDL о том, что часть экрана была обновлена ​​и что необходимо выполнить соответствующие преобразования для отображения этой области. Если программа не использует эту функцию, есть шанс, что она все равно будет работать. Лучше перестраховаться и вызывать эту функцию всякий раз, когда изменяется поверхность буфера кадра.

    Наконец, если вы запустите программу, вы заметите, что она работает в окне, а не занимает весь экран. Чтобы изменить это, замените ноль в вызове SDL_SetVideoMode на константу SDL_FULLSCREEN. Однако будьте осторожны; полноэкранные приложения труднее отлаживать, и они, как правило, сильно портят работу при сбое.

    Мы видели, как рисовать пиксели непосредственно на поверхности, и нет никаких причин, по которым нельзя было бы создать целую игру, используя только это. Однако есть гораздо лучший способ вывести на экран большие объемы данных. Наш следующий пример загрузит всю поверхность из файла и нарисует ее с помощью одной функции копирования поверхности SDL. Код можно увидеть в листинге 3.

    Как видите, растровый файл загружается в память с помощью функции SDL_LoadBMP. Эта функция возвращает указатель на структуру SDL_Surface, содержащую изображение, или указатель NULL, если изображение не может быть загружено. После того, как этот файл успешно загружен, растровое изображение представляется как обычная поверхность SDL, и программа может нарисовать его на экране или любой другой поверхности. Растровые изображения используют динамически выделяемую память, и их следует освобождать, когда они больше не нужны. Функция SDL_FreeSurface освобождает память, выделенную для растрового изображения.

    Функция SDL_BlitSurface выполняет перенос одной поверхности на другую, при необходимости конвертируя форматы пикселей. Эта функция принимает четыре аргумента: исходная поверхность (изображение, с которого выполняется копирование), структура SDL_Rect, определяющая прямоугольную область исходной поверхности для копирования, целевая поверхность (изображение, на которое выполняется копирование) и еще одна структура SDL_Rect, указывающая координаты на пункт назначения, к которому должно быть обращено изображение. Эти два прямоугольника должны иметь одинаковую ширину и высоту (в настоящее время SDL не выполняет растяжение), но начальные координаты областей x и y могут отличаться.

    В играх часто требуется имитировать прозрачность. Например, предположим, что у нас есть растровое изображение игрового персонажа на сплошном фоне, и мы хотим нарисовать персонажа на игровом уровне. Было бы глупо рисовать персонажа таким, какой он есть; фон тоже будет нарисован, а персонаж будет окружен блоком сплошного цвета. Гораздо лучше было бы рисовать только те пиксели, которые на самом деле являются частью персонажа, а не его сплошной фон. Мы можем сделать это с помощью цветового ключа. SDL поддерживает это и даже поддерживает ускорение цветовых ключей (хороший трюк для ускорения рисования). Ускорение RLE обеспечивает огромный прирост производительности при копировании изображений с цветными ключами, но это практично только для растровых изображений, которые не будут изменяться в ходе работы программы (поскольку изменение изображения RLE требует распаковки и повторной упаковки изображения).

    Ключ цвета – это определенное значение пикселя, которое программа объявляет прозрачным (в SDL это делается с помощью функции SDL_SetColorKey). Пиксели, соответствующие цветовому ключу изображения, не копируются при копировании изображения. В нашем примере с игровым персонажем мы могли бы установить цветовую клавишу на цвет сплошного фона, и он не был бы отрисован. Цветовые ключи упрощают объединение прямоугольных изображений непрямоугольных объектов.

    Рисунок 1. Tux.bmp

    Рисунок 2. Вывод Colorkey

    SDL назначает «виртуальный символ» каждой клавише на клавиатуре. Эти коды (целые числа) на некотором уровне сопоставляются с кодами сканирования клавиатуры операционной системы (которые в терминах сопоставляются с кодами, создаваемыми аппаратным обеспечением клавиатуры), но SDL позаботится об отображении за кулисами. SDL предоставляет символ препроцессора для каждого виртуального символа клавиши; например, клавише Escape соответствует символ SDLK_ESCAPE. (Вы можете найти список допустимых символов клавиш в документации SDL.) Мы используем эти коды всякий раз, когда нам нужно напрямую проверить состояние (включено или выключено) определенной клавиши, и SDL использует их, когда сообщает о ключевых событиях. Виртуальные символы клавиш представлены типом данных SDLKey.

    Поскольку мы не будем пока возиться с интерфейсом событий (на самом деле, мы даже не упомянули об этом), нам нужно будет явно запрашивать текущее состояние клавиатуры всякий раз, когда нам нужно знать о клавише. . Программа может получить снимок всей клавиатуры в виде массива. Функция SDL_GetKeyState возвращает указатель на внутренний массив состояний клавиатуры SDL, который индексируется с помощью констант SDLK_keysym. Вам нужно вызвать эту функцию только один раз; указатель остается действительным в течение всей программы. Каждая запись в массиве представляет собой простой флаг Uint8, указывающий, нажата ли эта клавиша в данный момент. Вы должны периодически вызывать SDL_PumpEvents для обновления данных в массиве.

    Облегченная реализация обработки событий, основанная на вызовах SDL.

    Многие константы событий получены непосредственно из SDL. Например: tcod.event.K_UP и tcod.event.SCANCODE_A относятся к SDLK_UP и SDL_SCANCODE_A SDL с уважением. См. в этой таблице все константы клавиатуры SDL.

    При печати любого события вы увидите его атрибуты в удобочитаемом формате.Атрибут типа события, если он не указан, представляет собой просто имя класса со всеми буквами в верхнем регистре.

    В качестве общей рекомендации следует использовать KeyboardEvent.sym для ввода команд и TextInput.text для полей ввода имени.

    Не забудьте добавить строку import tcod.event , так как импорт этого модуля не подразумевается import tcod .

    Новое в версии 8.4.

    Двухмерная позиция, используемая для событий с координатами мыши.

    Координата пикселя или плитки, начинающаяся с нуля в крайнем левом положении.

    Координата пикселя или плитки, начинающаяся с нуля в самом верхнем положении.

    Базовый класс события.

    Этот тип событий.

    Если доступно, содержит указатель python-cffi ‘SDL_Event*’. Этот атрибут есть у всех подклассов.

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    Событие запроса на выход из приложения.

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    класс tcod.event. KeyboardEvent ( scancode : int , sym : int , mod : int , repeat : bool = False ) [источник ] ¶ тип ¶

    Будет «KEYDOWN» или «KEYUP», в зависимости от события.

    Скан-код клавиатуры. Это физическое расположение клавиши на клавиатуре, а не символ клавиши.

    Символ клавиатуры.

    Битовая маска текущих клавиш-модификаторов.

    Например, если сдвиг удерживается, то значение event.mod и tcod.event.Modifier.SHIFT будет равно истинному.

    Истинно, если это событие существует из-за повторения ключа.

    Изменено в версии 12.5: scancode , sym и mod теперь используют соответствующие перечисления.

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    класс tcod.event. KeyDown ( scancode : int , sym : int , mod : int , repeat : bool = False ) [источник ] ¶ класс tcod.event. KeyUp ( scancode : int , sym : int , mod : int , repeat : bool = False ) [источник ] ¶ класс tcod.event. MouseMotion ( pixel : Tuple [ int , int ] = (0, 0) , pixel_motion : Tuple [ int , int ] = (0, 0) , плитка : Необязательный [Кортеж [ int , int ] ] = (0, 0) , tile_motion : Необязательный [ Кортеж [ int , int ] ] = (0, 0) , состояние : int = 0 ) [источник] ¶ тип ¶

    Координаты мыши в пикселях.

    Дельта пикселей.

    Координаты целочисленной плитки мыши на экране.

    Дельта целочисленного тайла.

    Битовая маска кнопок мыши, удерживаемых в данный момент.

    Будет комбинацией следующих имен:

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    класс tcod.event. MouseButtonEvent ( пиксель : Кортеж [ int , int ] = (0, 0) , плитка : Дополнительно [ Кортеж [ int , int ] ] = (0, 0) , < em>button : int = 0 ) [источник] ¶ тип ¶

    В зависимости от события будет "MOUSEBUTTONDOWN" или "MOUSEBUTTONUP".

    Координаты мыши в пикселях.

    Координаты целочисленной плитки мыши на экране.

    Какая кнопка мыши.

    Это будет одно из следующих имен:

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    класс tcod.event. MouseButtonDown ( пиксель : Кортеж [ int , int ] = (0, 0) , плитка : Дополнительно [ Кортеж [ int , int ] ] = (0, 0) , < em>кнопка : int = 0 ) [источник] ¶

    То же, что и MouseButtonEvent, но с type="MouseButtonDown" .

    класс tcod.event. MouseButtonUp ( пиксель : Кортеж [ int , int ] = (0, 0) , плитка : Дополнительно [ Кортеж [ int , int ] ] = (0, 0) , < em>кнопка : int = 0 ) [источник] ¶

    То же, что и MouseButtonEvent, но с type="MouseButtonUp" .

    класс tcod.event. MouseWheel ( x : int , y : int , flipped : bool = False ) [источник] ¶ type ¶

    Горизонтальная прокрутка. Положительное значение означает прокрутку вправо.

    Вертикальная прокрутка. Положительное значение означает прокрутку от пользователя.

    Если True, то значения x и y противоположны их обычным значениям. Это зависит от настроек операционной системы.

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    класс tcod.event. TextInput ( текст : str ) [источник] ¶ тип ¶

    Строка Unicode с входными данными.

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    класс tcod.event. WindowEvent ( тип : необязательный [ str ] = None ) [источник] ¶ тип ¶

    Событие окна может означать различные типы событий.

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    класс tcod.event. WindowMoved ( x : int , y : int ) [источник] ¶ тип ¶

    Движение по оси X.

    Движение по оси Y.

    класс tcod.event.WindowResized ( type : str , width : int , height : int ) [источник] ¶ type ¶

    "РАЗМЕР ОКНА" или "РАЗМЕР ОКНА"

    Текущая ширина окна.

    Текущая высота окна.

    класс tcod.event. Не определен [источник] ¶

    Этот класс заменяет события SDL без собственного класса tcod.event.

    Возвращает экземпляр класса из указателя python-cffi ‘SDL_Event*’.

    tcod.event. get_mouse_state ( ) → tcod.event.MouseState [источник] ¶

    Возвращает текущее состояние мыши.

    Новое в версии 9.3.

    tcod.event. add_watch ( обратный вызов : tcod.event._EventCallback ) → tcod.event._EventCallback [источник] ¶

    Добавить обратный вызов для просмотра событий.

    Эту функцию можно вызвать с обратным вызовом для регистрации или использовать в качестве декоратора.

    Читайте также: