2

我一直在制作游戏,我使用的 python 库很糟糕(Pyglet)。我想尝试将 Cocoa 用于 OSX 版本。

我将能够弄清楚如何使用 NSWindow 和 NSOpenGLView 等类中的对象,然后将这些对象放入我自己的类中以进行游戏循环。

我不知道如何使用 PyObjC 加载我可以制作的动态 Objective-C 库,然后使用我将在 python 中制作的类来设置我认为可以由 NSTimer 循环的游戏。

但是,循环方法还需要从许多 python 类之一调用 python 方法。我的游戏包含许多用于游戏不同部分的 Python 类(Mapmaker、GameSession、AnacondaGame 等)。游戏循环将需要根据当前部分调用任何这些类中的循环方法并传递偶数信息。

PyObjC 显然是“双向”的,那么它是如何完成的呢?

或者,我可以创建两个由 py​​thon 调用的方法,并在中间添加 python 代码,其中循环由 python 控制。

PyObjC 网站上的“文档”似乎只解释了如何在 python 中使用 Cocoa,仅此而已。

我不能做的是使用界面构建器制作一个固定的 GUI,因为该库需要根据我的类的初始化方法的 python 输入来创建窗口。

了解 Objective-C 的语法并不是什么大问题,我可以参考 Cocoa 文档来制作我需要的对象。

感谢您的任何帮助。将不胜感激。我厌倦了使用 pygame 和 pyglet 等损坏的库,使用特定于平台的 OS API 似乎是确保质量的最佳方法。

4

1 回答 1

2

PyObjC 将 Python 连接到 Objective-C 运行时,因此如果您在 Python 中创建 NSObject 子类,它们将可以从运行在同一进程中的 Objective-C 代码访问。这意味着您需要将所有 Python 功能封装在可以通过桥访问的 NSObject 的子类中。

我这样做的方法是在 Objective-C 端有一个单例控制器类,它有一个类似的方法-(void)pythonReady:(PythonClass *)pythonObject,并且还处理 Python 代码的加载(这确保在加载 Python 代码时控制器类存在) . 然后,在您的 Python 代码中,在创建 PythonClass 的实例之后,您可以调用pythonReady:您的控制器单例。然后,在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 在当前进程中运行脚本。脚本本身在当前进程中启动到运行时的桥接,然后您可以在其中使用 Cocoa API 访问您的控制器单例。

于 2010-07-04T14:41:20.057 回答