0

これは単純なopengl/sdlプログラムです。一般に、プログラムが表示データを保持する巨大な両端キューがあります。たとえば、三角形は次のようにデキューに挿入/読み込まれます(GL_Begin...。頂点1...。頂点2...頂点3。。 。GL_End)

アイテム構造体

enum Shapes{
    LINE,
    POLYGON,
    TRIANGLE
};

struct Item{
    int id;
    int type;
    Shapes shape;
    double x;
    double y;
    double z;
};

..。

void GEngine::CC2D(int id,double x,double y){ // Change Coordinates ... Move the Item

    for(int i=0;i<Items.size();i++){
        Item* item = &Items[i];                  // Pointer to the item INSIDE the deque because we need to edit it, we can not create a new instance of Item

        if(item->id == id && item->type == 2){
            item->x += x;
            item->y += y;
        }
    }

    DrawScene();
}

void GEngine::PollEvents( void (*Event)() ){
    int mbpressed = 0; // Mouse button pressed flag
    int mouse_xpre = 0;
    int mouse_ypre = 0;
    int move_id = 0; // TESTING
    while(1){
        while( SDL_PollEvent( &event ) ){

            switch( event.type ){
                case SDL_MOUSEMOTION:{
                    if(mbpressed == 1){
                        mouse_x = event.motion.x; // X2
                        mouse_y = event.motion.y; // Y2
                    //  (*Event)();

                    //  CC2D(  (   X2  -   X1     ),(   Y2  -   Y1     )
                        CC2D(move_id,(mouse_x-mouse_xpre),(mouse_y-mouse_ypre));      // The difference between the current and the previous mouse position is equal to the DX and DY which will be used to move the vertices.
                        mouse_xpre = mouse_x;     // X1
                        mouse_ypre = mouse_y;     // Y1

                        SDL_Delay(20);

                    }
                    break;

今問題。CC2D(move_id、(mouse_x-mouse_xpre)、(mouse_y-mouse_ypre));を使用する場合 正常に動作しますが、CC2D関数をイベント1に追加すると、アルゴリズムが失敗し、アイテムがマウスで移動する代わりに、画面から離れます。

言い換えると。

case SDL_MOUSEMOTION:{
                        if(mbpressed == 1){
                            mouse_x = event.motion.x; // X2
                            mouse_y = event.motion.y; // Y2
                        //  (*Event)();

                        //  CC2D(  (   X2  -   X1     ),(   Y2  -   Y1     )
                        CC2D(move_id,(mouse_x-mouse_xpre),(mouse_y-mouse_ypre));      // The difference between the current and the previous mouse position is equal to the DX and DY which will be used to move the vertices.
                        mouse_xpre = mouse_x;     // X1
                        mouse_ypre = mouse_y;     // Y1

                        SDL_Delay(20);

                    }
                    break;
}

^問題なく動作します。

だが

GEngine gEngine;

void Event(){
            gEngine.CC2D(0,(gEngine.mouse_x-gEngine.mouse_xpre),(gEngine.mouse_y-gEngine.mouse_ypre));
    }

int main(int argc, char *argv[]){

... code ...

gEngine.PollEvents(&Event);

return 0; // NEVER REACHED
}

case SDL_MOUSEMOTION:{
                    if(mbpressed == 1){
                        mouse_x = event.motion.x; // X2
                        mouse_y = event.motion.y; // Y2
                        (*Event)();

                        mouse_xpre = mouse_x;     // X1
                        mouse_ypre = mouse_y;     // Y1

                        SDL_Delay(20);

                    }
                    break;
}

ではない ...

物事をさらに単純化するには:

Case SDL_MOUSEMOTION: ...... code ..... CC2D( params) ........

正常に動作しますが

Event(){ CC2D( params ) } // Main.cpp
Case SDL_MOUSEMOTION: ...... code ..... (*Event)() ........ // GEngine.cpp

意図したとおりに機能しない

4

1 に答える 1

3

ここでローカル変数を宣言していますPollEvents

int mouse_xpre = 0;
int mouse_ypre = 0;

mouse_xpre名前がとであることに注意してくださいmouse_ypre。次に、コールバックであなたがしている

gEngine.CC2D(0,(gEngine.mouse_x-gEngine.mouse_xpre),(gEngine.mouse_y-gEngine.mouse_ypre));
//                                      ^^^^^^^^^^                           ^^^^^^^^^^

メンバー変数にアクセスします。ローカル変数の宣言を削除して、メンバー変数が非表示にならないようにする必要があります。両方の場所でメンバー変数を使用することになります。

于 2012-05-03T17:40:49.687 に答える