オブジェクトの配列を C ライブラリに送信しようとしています。
送信しようとしているオブジェクトは pymunk Body です。ポインター オブジェクトが埋め込まれていBody._body
ます。関数に 1 つを渡すだけで、必要なものをすべて Chipmunk 関数で抽出することができました。cpBodyGetMass
テストとして使用しましたが、うまくいきました。
これらの配列を作成する場合。機能するのは最初のものだけです。
Body._body
アドレスを配列として dllに送信できるようにしたいと考えています。ポインターをc_int
orc_long
配列に格納し、それらのアドレスをcpBody
Chipmunk が必要とする に変換できると考えました。
これが私のカスタム関数です
int pymunk_body(int color_id, int numof, float * values, cpBody * body){
glBindTexture(GL_TEXTURE_2D,0);
cpBody bd;
float red;
float green;
float blue;
float alpha;
float sizex;
float sizey;
cpVect position;
float positionx;
float positiony;
float rotation;
for (int i=0;i<numof*6;i=i+6){
bd=body[i/6];
red=values[0+i];
green=values[1+i];
blue=values[2+i];
alpha=values[3+i];
sizex=values[4+i];
sizey=values[5+i];
position=cpBodyGetPos(body);
positionx=position.x;
positiony=position.y;
rotation=cpBodyGetAngle(body)*180/PI;
}
私の C++ には Python ラッピングがないため、C オブジェクトしか送信できません。私がこれまで行ってきた方法は...
gldll[4](ctypes.c_int(add_color),
ctypes.c_float(color[0]),
ctypes.c_float(color[1]),
ctypes.c_float(color[2]),
ctypes.c_float(color[3]),
ctypes.c_float(position[0]),
ctypes.c_float(position[1]),
ctypes.c_float(rotation),
ctypes.c_float(size[0]),
ctypes.c_float(size[1]))
と
ni=numpy.array([self.texture.TextureID,ublur,add_color,blurSize,self.Blur+blur,textfont],"i")
nf=numpy.array([(self.width+self.height)/2.0,color[0],color[1],color[2],color[3],position[0],position[1],rotation,self.half_width,self.half_height,scale],"f")
gldll[2](ctypes.c_void_p(ni.ctypes.data),ctypes.c_void_p(nf.ctypes.data))
ここで、ポインターの配列を送信するとします。基本的には 4 バイトの int の配列です。はcpBody body[]
、次のオブジェクトに到達するには、配列内の sizeof(cpBody) のバイト単位でジャンプする必要があると想定しています。しかし、それらはインラインではありません。すべてのボディへのランダムなポインターのリストです。各配列要素のアドレスを読み取り、その場所に があると仮定する必要がありcpBody
ます。
2番目の例を見ると。単一のポインターを介して配列を送信しました。ポインターの配列にポインターを送信し、それぞれから cpBody を取得する必要があります。つまり、配列が 4 バイトだけジャンプし、メモリ アドレスをcpBody
.