2010-07-03 4 views
1

나는 게임을 만들었고 내가 사용 된 파이썬 라이브러리는 끔찍하다 (Pyglet). OSX 버전에서 Cocoa를 사용해보고 싶습니다.코코아 라이브러리를 만들고 파이썬에서 사용하는 방법

NSWindow 및 NSOpenGLView와 같은 클래스의 객체를 사용하여이 객체를 게임 루프 용 클래스에 넣을 수 있습니다.

PyObjC를 사용하여 동적 Objective-C 라이브러리를로드하는 방법을 알지 못합니다. 파이썬에서 NSTimer에 의해 반복 될 수있는 게임을 설정하는 클래스를 사용합니다.

그러나 루프 메서드는 많은 파이썬 클래스 중 하나에서 파이썬 메서드를 호출해야합니다. 내 게임은 게임의 다른 섹션 (Mapmaker, GameSession, AnacondaGame 등)에 사용되는 많은 파이썬 클래스로 구성됩니다. 게임 루프는 현재 섹션에 따라 이러한 클래스 중 하나에서 루프 메서드를 호출하고 정보를 전달해야합니다.

PyObjC는 "양방향"입니다. 어떻게 그렇게 했습니까?

또는 파이썬에서 호출 할 수있는 두 가지 메서드를 만들 수 있으며 파이썬 코드가 루프를 파이썬에 의해 제어되는 중간에 추가 할 수 있습니다.

PyObjC 웹 사이트의 "문서"는 파이썬과 그 밖의 다른 방법으로 코코아를 사용하는 방법 만 설명합니다.

내가 할 수없는 것은 인터페이스 빌더를 사용하여 고정 GUI를 만드는 것입니다. 라이브러리가 파이썬 입력을 기반으로 창을 만들어야하기 때문입니다.

Objective-C의 구문을 이해하는 것은 큰 문제가 아니며 필요한 개체를 만들기 위해 Cocoa 설명서를 재사용 할 수 있습니다.

도움 주셔서 감사합니다. 대단히 감사하겠습니다. 파이 게임 (pygame)과 파이 그렛 (pyglet)과 같은 깨진 라이브러리를 사용하는 것이 지겹다. 플랫폼 별 OS API를 사용하면 품질을 보장하는 가장 좋은 방법 인 것 같다.

+0

나는 파이썬 메인 루프를 사용할 수 없을까? 파이썬을 시작할 준비가 된 NSApplication에서 run 메소드를 호출해야 할 것이다. 그런 다음 Objective-C 코드에서 일부 파이썬 메서드를 호출해야합니다. 운좋게도 pyglet을 사용하는 현재 코드는 run 메소드가 호출되는 것과 비슷한 것을 사용합니다. Objective-C의 호출 파이썬은 성가신 부분입니다. –

+0

인터페이스 빌더가없는 코코아에 대한 훌륭한 자습서가 반드시 있어야합니까? –

답변

1

PyObjC는 Python을 Objective-C 런타임에 연결하므로 Python에서 NSObject 서브 클래스를 생성하면 동일한 프로세스에서 실행되는 Objective-C 코드에서 액세스 할 수 있습니다. 이것이 의미하는 바는 모든 Python 기능을 브리지를 통해 액세스 할 수있는 NSObject의 서브 클래스에 캡슐화해야한다는 것입니다.

내가하는 방법은 -(void)pythonReady:(PythonClass *)pythonObject과 같은 메서드가있는 Singleton 컨트롤러 클래스를 Objective-C 쪽에서 사용하는 것입니다. 또한 컨트롤러 클래스가 존재할 때 컨트롤러 클래스가 존재하도록 보장하는 Python 코드의로드를 처리합니다. 파이썬 코드가로드 됨). 그런 다음 Python 코드에서 PythonClass의 인스턴스를 만든 후 컨트롤러 싱글 톤에서 pythonReady:을 호출 할 수 있습니다. 그런 다음 Objective-C 측면의 pythonReady:에서 pythonObject에 필요한 메소드를 호출하면 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 

기본적으로, 우리는 단순히 현재의 프로세스 내에서 스크립트를 실행하려면 파이썬 C API를 사용합니다. 스크립트 자체는 현재 프로세스에서 런타임에 대한 브릿지를 시작합니다. 그러면 Cocoa API를 사용하여 컨트롤러 싱글 톤에 액세스 할 수 있습니다.

+0

정보를 제공해 주셔서 감사합니다. 이것은 유용 할 수 있습니다. PyObjC를 사용하여 런타임에 동적 라이브러리를로드 할 수있는 가능성을 검토했습니다. 나는 그것이 더 쉽고 더 우아한 해결책 일 가능성이 가장 높은지 먼저 확인할 수 있습니다. 고맙습니다. –

+0

"dlopen"과 함께 "objc_getClass"를 사용하면 잘 작동 할 수 있습니다. –

+0

나는 그 기능을 사용하지 못해서 당신의 제안을 시도해야 할 것입니다. –

관련 문제