5

Pygameでのゲーム開発を簡単にするために使用するPython関数がいくつかあります。Pythonパスのhelper.pyというファイルにあるので、作成したどのゲームからでもインポートできます。Python拡張機能について学ぶための演習として、このモジュールをCに変換することを考えました。最初の問題は、Pygameの関数を使用する必要があることですが、これが可能かどうかはわかりません。Pygameはいくつかのヘッダーファイルをインストールしますが、それらにはPython関数のCバージョンがないようです。多分私は何かが欠けています。

どうすればこれを解決できますか?回避策として、関数は現在関数パラメーターを受け入れてそれを呼び出しますが、これは理想的なソリューションではありません。

ちなみに、Windows XP、Python 2.6、Pygame1.9.1を使用しています。

4

3 に答える 3

6
/* get the sys.modules dictionary */
PyObject* sysmodules PyImport_GetModuleDict();
PyObject* pygame_module;
if(PyMapping_HasKeyString(sysmodules, "pygame")) {
    pygame_module = PyMapping_GetItemString(sysmodules, "pygame");
} else {
    PyObject* initresult;
    pygame_module = PyImport_ImportModule("pygame");
    if(!pygame_module) {
      /* insert error handling here! and exit this function */
    }
    initresult = PyObject_CallMethod(pygame_module, "init", NULL);
    if(!initresult) {
      /* more error handling &c */
    }
    Py_DECREF(initresult);
}
/* use PyObject_CallMethod(pygame_module, ...) to your heart's contents */
/* and lastly, when done, don't forget, before you exit, to: */
Py_DECREF(pygame_module);
于 2009-10-17T21:15:23.490 に答える
3

CコードからPythonモジュールをインポートし、Pythonコードと同じようにで定義されたものを呼び出すことができます。少し長めですが、完全に可能です。

このようなことを行う方法を知りたいときは、CAPIのドキュメントを参照してください。モジュールのインポートに関するセクションが役立ちます。また、すべてドキュメントにある属性の読み取り方法、関数の呼び出し方法なども読む必要があります。

ただし、実際に実行したいのは、Cから基になるライブラリsdlを呼び出すことだと思います。これはCライブラリであり、Cから非常に簡単に使用できます。

これは、動作するコードのビットから適応されたCでPythonモジュールをインポートするためのサンプルコードです。

PyObject *module = 0;
PyObject *result = 0;
PyObject *module_dict = 0;
PyObject *func = 0;

module = PyImport_ImportModule((char *)"pygame"); /* new ref */
if (module == 0)
{
    PyErr_Print();
    log("Couldn't find python module pygame");
    goto out;
}
module_dict = PyModule_GetDict(module); /* borrowed */
if (module_dict == 0)
{
    PyErr_Print();
    log("Couldn't find read python module pygame");
    goto out;
}
func = PyDict_GetItemString(module_dict, "pygame_function"); /* borrowed */
if (func == 0)
{
    PyErr_Print();
    log("Couldn't find pygame.pygame_function");
    goto out;
}
result = PyEval_CallObject(func, NULL); /* new ref */
if (result == 0)
{
    PyErr_Print();
    log("Couldn't run pygame.pygame_function");
    goto out;
}
/* do stuff with result */
out:;
Py_XDECREF(result);
Py_XDECREF(module);
于 2009-10-17T20:59:41.623 に答える
0

モジュール内のほとんどの関数はpygame、SDL関数の単なるラッパーであり、Cバージョンの関数を探す必要があります。pygame.h一連のimport_pygame_*()関数を定義します。拡張モジュールの初期化時に他のユーザーを1回呼び出しimport_pygame_base()て、pygameモジュールのC APIの必要な部分にアクセスします(それぞれのヘッダーファイルで定義されています)。グーグルコード検索はあなたにいくつかの例をもたらすでしょう。

于 2009-10-18T07:31:08.893 に答える