2

私はゲームを作っていますが、使用したPythonライブラリはひどいです(Pyglet)。OSX版にCocoaを使ってみたいです。

NSWindowやNSOpenGLViewなどのクラスのオブジェクトを使用して理解し、これらのオブジェクトをゲームループ用の独自のクラスに配置することができます。

PyObjCを使用して、作成できる動的なObjective-Cライブラリをロードし、Pythonで作成するクラスを使用して、NSTimerでループできると思われるゲームをセットアップする方法がわかりません。

ただし、loopメソッドは、多くのpythonクラスの1つからpythonメソッドを呼び出す必要もあります。私のゲームは、ゲームのさまざまなセクション(Mapmaker、GameSession、AnacondaGameなど)で使用される多くのPythonクラスで構成されています。ゲームループは、現在のセクションに応じてこれらのクラスのいずれかでループメソッドを呼び出し、偶数の情報を渡す必要があります。

PyObjCは明らかに「双方向」ですが、それはどのように行われるのでしょうか。

あるいは、Pythonによって呼び出される2つのメソッドを作成し、その間にpythonコードを追加することもできます。この場合、ループはpythonによって制御されます。

PyObjC Webサイトの「ドキュメント」は、PythonでCocoaを使用する方法を説明しているだけで、他には何も説明していないようです。

ライブラリはクラスの初期化メソッドへのPython入力に基づいてウィンドウを作成する必要があるため、私ができないことは、インターフェイスビルダーを使用して固定GUIを作成することです。

Objective-Cの構文を知っていることは大きな問題ではなく、Cocoaのドキュメントを参照して必要なオブジェクトを作成できます。

助けてくれてありがとう。大変感謝しております。私はpygameやpygletのような壊れたライブラリを使用することにうんざりしています。プラットフォーム固有のOSAPIを使用することが、品質を確保するための最良の方法のようです。

4

1 に答える 1

2

PyObjCはPythonをObjective-Cランタイムにブリッジするため、PythonでNSObjectサブクラスを作成すると、同じプロセスで実行されているObjective-Cコードからアクセスできるようになります。これが意味するのは、ブリッジを介してアクセスできるNSObjectのサブクラスにすべてのPython機能をカプセル化する必要があるということです。

これを行う方法は、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を使用して、現在のプロセス内でスクリプトを実行します。スクリプト自体が現在のプロセスのランタイムへのブリッジを開始し、CocoaAPIを使用してコントローラーのシングルトンにアクセスできます。

于 2010-07-04T14:41:20.057 に答える