Python — высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций. Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Python организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).
Pygame — это кроссплатформенная библиотека языка Python, предназначенная для написания компьютерных игр и мультимедиа приложений. Pygame базируется на библиотеке SDL. Изначально Pygame был написан Питом Шиннерсом (Pete Shinners). Начиная примерно с 2004/2005 года поддерживается и развивается сообществом свободного программного обеспечения.
Python — достаточно лёгкий и удобный язык программирования для понимания и изучения. Код, написанный на Python, воспринимается достаточно легко. Теперь у любителей этого языка появилась возможность запускать и портировать Pygame игры с официального сайта этой библиотеки.
Огромное спасибо rock88 за подсказку с компиляцией Pygame.
Установка:
- Качаем архив games.7z, распаковываем в корень карты памяти;
- Устанавливаем нужные пакеты, запускаем.
Примечания:
- Архив games.7z содержит кроме Python и Pygame так же SDL и другие необходимые библиотеки, собранные для Motorola ZN5. Если вы устанавливаете Python + Pygame на другую модель телефона Motorola (Z6/E8/EM30/VE66/V8 etc.), то сохраните свою папку games/lib и не заменяйте её той, что имеется в архиве;
- В архиве много файлов, поэтому заливать это всё лучше через картридер, в противном случае кидаться будет очень долго.
Для разработчиков:
Рассмотрим пример портирования на игре PyForce. PyForce — это скроллшутер написанный на Python для телефонов Nokia под Symbian OS.
Скачиваем исходный код игры со страницы (линк Source), распаковываем. Видим следующие папки и файлы:
- lib — исходный код игры, библиотеки;
- res — ресурсы, датафайлы;
- run.pyw — файл для запуска игры.
Создаём файл run.sh и кидаем его в папку с игрой, структура скрипта run.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/sh mypath=${0%/*} export HOME=$mypath LIBDIR1=/ezxlocal/download/mystuff/games/lib LIBDIR2=/mmc/mmca1/games/lib LIBDIR3=$mypath/lib export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBDIR1:$LIBDIR2:$LIBDIR3 export SDL_QT_INVERT_ROTATION=1 PYTHONHOME=/mmc/mmca1/games/python export PYTHONHOME PYTHONPATH=${PYTHONHOME}/lib/python2.5/site-packages:$PYTHONPATH PYTHONPATH=${PYTHONHOME}/lib/python2.5:$PYTHONPATH PYTHONPATH=${PYTHONHOME}:$PYTHONPATH export PYTHONPATH LD_LIBRARY_PATH=${PYTHONHOME}/extras:${LD_LIBRARY_PATH} export LD_LIBRARY_PATH cd $mypath exec $PYTHONHOME/bin/python.elf $mypath/run.pyw |
Кидаем папку на телефон, например, в каталог mgxbox/. Подключаемся через Telnet, пробуем запустить игру. В Telnet кидает такой лог:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/mmc/mmca1/mgxbox/pyForce/run.sh hide splash: -1 map framebuffer at 0x40de8000 (size 262144) QT Show: 3345 setAltitude and requestFocus, winId:1821, fget:1, alt:0, fixed:1, order:1 psyco NOT installed, program may run slower Traceback (most recent call last): File "/mmc/mmca1/mgxbox/test/run.pyw", line 35, in <module> game = PyForce() File "lib/pyforce.py", line 31, in __init__ self.screen = pygame.display.set_mode(RESOLUTION) pygame.error: Couldn't create screen bitmap ~SDL_QWin(): done QT Show: 3345 requestFocus: lost, winId:1821 |
Где видны следующие ошибки:
psyco NOT installed, program may run slower — Компилятор psyco не установлен, программа может выполняться медленно. Игнорируем эту ошибку, psyco компилятор только под архитектуру x86.
self.screen = pygame.display.set_mode(RESOLUTION) pygame.error: Couldn’t create screen bitmap — Именно с этой ошибкой нам и нужно бороться. Это ошибка создания экрана, связанная с разрешением дисплея. Разрешение устанавливается 31-ой строкой self.screen = pygame.display.set_mode(RESOLUTION) в файле lib/pyforce.py. Ищем слово RESOLUTION по всем исходникам игры. Для этого можно использовать удобный текстовой редактор Notepad++. Находим в файле lib/const.py RESOLUTION = (360, 480) и правим на RESOLUTION = (320, 240) для альбомного режима и RESOLUTION = (240, 320) для портретного.
Во многих играх разрешение может устанавливаться как pygame.display.set_mode((640, 480)). В любом случае, чтобы поменять разрешение, ищем строку pygame.display.set_mode. Для некоторых игр придётся править ещё и размеры спрайтов, если игра под 640×480 — уменьшать в 2 раза, а если под 800×600 — в 2.5 раза. Для данной игры это не требуется. После того, как исправили разрешение, пробуем запустить игру ещё раз.
Игра теперь отлично запускается, но нужно настроить управление. Так как отсутствует кнопка, отвечающая за огонь. Ищем в исходниках по слову K_, находим следующее:
1 2 3 4 5 6 7 8 |
# lib\battlefield.py 134 - if key[K_UP]: # Движение корабля вверх 136 - if key[K_DOWN]: # Движение корабля вниз 138 - if key[K_LEFT]: # Движение корабля влево 140 - if key[K_RIGHT]: # Движение корабля вправо 142 - if key[K_SPACE]: # Огонь # lib\pyforce.py 52 - if event.key == K_ESCAPE: # Выход |
У нас в SDL библиотеке нет клавиши SPACE, поэтому заменяем if key[K_SPACE]: на if key[K_RETURN]: для центральной кнопки джойстика. Или на if (key[K_RETURN]) or (key[K_PLUS]): для центра джойстика и клавиши громкость ‘+’.
Список клавиш и их соответствие:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
K_0 0 K_1 1 K_2 2 K_3 3 K_4 4 K_5 5 K_6 6 K_7 7 K_8 8 K_9 9 K_ASTERISK * K_HASH # K_BACKSPACE (<-) K_TAB Send K_RETURN Center joy K_PAUSE Camera K_ESCAPE Red key (HangUp) K_F9 Left Soft K_F11 Right Soft K_PLUS Volume '+' K_MINUS Volume '-' K_UP up arrow K_DOWN down arrow K_RIGHT right arrow K_LEFT left arrow |
Сохраняем все сделанные нами изменения, кидаем на карту памяти и запускаем. Если всё отлично работает — делаем MGX-пакет с игрой.
Пример скрипта, который нужно использовать для запуска:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/sh mypath=${0%/*} export HOME=$mypath LIBDIR1=/ezxlocal/download/mystuff/games/lib LIBDIR2=/mmc/mmca1/games/lib LIBDIR3=$mypath/lib export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBDIR1:$LIBDIR2:$LIBDIR3 export SDL_QT_INVERT_ROTATION=1 PYTHONHOME=/mmc/mmca1/games/python export PYTHONHOME PYTHONPATH=${PYTHONHOME}/lib/python2.5/site-packages:$PYTHONPATH PYTHONPATH=${PYTHONHOME}/lib/python2.5:$PYTHONPATH PYTHONPATH=${PYTHONHOME}:$PYTHONPATH export PYTHONPATH LD_LIBRARY_PATH=${PYTHONHOME}/extras:${LD_LIBRARY_PATH} export LD_LIBRARY_PATH cd $mypath exec $PYTHONHOME/bin/python.elf $mypath/my_prog.py |
Где my_prog.py — ваша запускаемая программа на Python. Для Pygame следует использовать python.elf, так как в нём прописана нужная инициализация SDL-библиотеки. Для скриптов используйте просто python. Пакет MGX с игрой pyForce можно скачать здесь. Приветствуются любые вопросы по теме!