Как создать библиотеку Какао и использовать ее в Python - PullRequest
1 голос
/ 03 июля 2010

Я делал игру, и библиотека Python, которую я использовал, ужасна (Pyglet). Я хочу попробовать использовать Какао для версии OSX.

Я смогу выяснить, используя объекты из таких классов, как NSWindow и NSOpenGLView, а затем помещу эти объекты в свой собственный класс для игрового цикла.

Я понятия не имею, как я могу использовать PyObjC для загрузки динамической библиотеки Objective-C, которую я могу создать, а затем использовать класс, который я создам в python, для настройки игры, которая, как я полагаю, может быть зациклена NSTimer.

Однако, метод цикла также должен вызывать метод python из одного из многих классов python. Моя игра состоит из множества классов Python, которые используются для различных разделов игры (Mapmaker, GameSession, AnacondaGame и т. Д.). Игровой цикл должен вызывать метод цикла в любом из этих классов в зависимости от текущего раздела и передавать четную информацию.

PyObjC "двунаправленный", по-видимому, так как это сделать?

В качестве альтернативы я мог бы создать два метода, которые вызывал бы python, и добавить промежуточный код python, где цикл контролируется python.

«Документация» на веб-сайте PyObjC только объясняет, как использовать Какао в python и ничего больше.

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

Знание синтаксиса Objective-C не является большой проблемой, и я могу обратиться к документации по Какао для создания необходимых мне объектов.

Спасибо за любую помощь. Это будет оценено по достоинству. Я устал от использования неработающих библиотек, таких как pygame и pyglet, поэтому использование API-интерфейсов для конкретных платформ является лучшим способом обеспечения качества.

1 Ответ

1 голос
/ 04 июля 2010

PyObjC соединяет Python со средой выполнения Objective C, поэтому, если вы создадите подклассы NSObject в Python, они будут доступны из кода Objective C, выполняющегося в том же процессе. Это означает, что вам нужно будет инкапсулировать все свои функциональные возможности Python в подкласс NSObject, к которому вы можете получить доступ через мост.

Способ, которым я бы это сделал, заключается в том, чтобы на стороне Objective-C был класс синглетного контроллера, который имеет метод, подобный -(void)pythonReady:(PythonClass *)pythonObject, а также обрабатывает загрузку кода Python (который гарантирует, что класс контроллера существует, когда ваш код Python загружен). Затем, в вашем коде Python, после создания экземпляра вашего PythonClass, вы можете вызвать pythonReady: на вашем контроллере singleton. Затем в pythonReady: на стороне Objective-C вы можете вызывать любые методы, которые вам нужны на pythonObject, которые будут запускать код на стороне Python.

Чтобы загрузить код Python из вашего класса контроллера, вы можете сделать что-то вроде этого:

#import <Python/Python.h>

@implementation PythonController (Loading)
- (void)loadPython {
    NSString *pathToScript = @"/some/path/to/script.py";
    setenv("PYTHONPATH", [@"/some/path/to/" UTF8String], 1);
    Py_SetProgramName("/usr/bin/python");
    Py_Initialize();
    FILE *pyScript = fopen([pathToScript UTF8String], "r");
    int result = PyRun_SimpleFile(pyScript, [[pathToScript lastPathComponent] UTF8String]);
    if (result != 0) { NSLog(@"Loading Python Failed!"); }
}
@end

По сути, мы просто используем Python C API для запуска скрипта внутри текущего процесса. Сам сценарий запускает мост к среде выполнения в текущем процессе, где вы можете использовать API-интерфейс Cocoa для доступа к одноэлементному контроллеру.

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