0

Simple Directmedia Layer ライブラリに問題があります。次のコードは、マウス ボタンが押されたときに画面上にブロックを描画します。

SDL_Event event;
while(running){
    while(SDL_PollEvent(&event)){
        while(event.button.state == SDL_PRESSED){

            SDL_PollEvent(&event);

            //where to draw                
            boxRect.x = event.motion.x;
            boxRect.y = event.motion.y;

            //Draw to screen
            SDL_FillRect(display,&boxRect,boxColor);
            SDL_Flip(display);
        }
        // ...
    }
    // ...
}

マウスを動かすまでは正常に動作しますが、マウスを動かすと正しくないのはなぜevent.button.stateですか?

両方を同時に操作するにはどうすればよいですか (つまり、ボタンが押されている間も描画を続けます)。

4

3 に答える 3

4

あなたのコードの問題は、あなたがSDL_PollEvent(文書化された here)を2回呼び出していることです。ドキュメントで述べたように:

event が NULL でない場合、次のイベントがキューから削除され、event が指す SDL_Event 構造体に格納されます。

2 番目の を取り除くなど、コードを少し再配置し、SDL_PollEventクリック、移動、解放、および入力ポンピングからのレンダリングの抽出のための適切なフローを作成すると、次のようになります。

SDL_Event Event;
while(running)
{
    while(SDL_PollEvent(&Event))
    {
        switch(Event.type)
        {
            // Handle your drawing with a simple state machine:
            case SDL_MOUSEBUTTONDOWN:
            {
                if(Event.button.button == SDL_BUTTON_LEFT)
                {
                    if(stateMachine == Released)
                    {
                        // ... begin drawing
                        stateMachine = Dragging
                    }
                }
                break;
            }
            case SDL_MOUSEMOTION:
            {
                if(stateMachine == Dragging)
                {
                    // ... update the extends of your rect
                }
            }
            case SDL_MOUSEBUTTONUP:
            {
                if(Event.button.button == SDL_BUTTON_LEFT)
                {
                    if(stateMachine != Released)
                    {
                        // ... finalize drawing... add the rect to a list? flush it?
                        stateMachine = Released;
                    }
                }
            }
            case SDL_QUIT:
            {
                running = false;
                break;
            }
        }
    }

    // Outside of your event pumping, update the graphics
    SDL_FillRect(display,&boxRect,boxColor);
    SDL_Flip(display);
}
于 2013-08-09T03:55:13.587 に答える
0

emartel の回答のおかげで、期待どおりに動作しています。コードは次のとおりです。

SDL_Event event;
int drawing = 0;

while(running){
    while(SDL_PollEvent(&event)){
        switch(event.type){

            //starts drawing when any mouse button is pressed
            case SDL_MOUSEBUTTONDOWN:
                drawing = 1;
                boxRect.x = event.button.x;
                boxRect.y = event.button.y;
            break;


            //keeps drawing while no button is released
            case SDL_MOUSEMOTION:
                if(drawing == 1){
                    boxRect.x = event.motion.x;
                    boxRect.y = event.motion.y;
                }
            break;


            //stops drawing when any button is released
            case SDL_MOUSEBUTTONUP:
                drawing = 0;
            break;


            case SDL_QUIT:
                running = 0;
            break;

        }

    }

    //draws to screen
    if(drawing == 1){
        SDL_FillRect(display,&boxRect,boxColor);
        SDL_Flip(display);
    }
}
于 2013-08-09T08:21:32.443 に答える