C 为什么移动鼠标会改变按钮状态?

C 为什么移动鼠标会改变按钮状态?,c,sdl,C,Sdl,我对简单的Directmedia层库有问题。按下鼠标按钮时,以下代码在屏幕上绘制一个块: SDL_Event event; while(running){ while(SDL_PollEvent(&event)){ while(event.button.state == SDL_PRESSED){ SDL_PollEvent(&event); //where to draw

我对简单的Directmedia层库有问题。按下鼠标按钮时,以下代码在屏幕上绘制一个块:

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
不真实


如何同时使用这两种工具(即按下按钮时保持绘图)

事件.按钮.状态
是位掩码。它被声明为一个
char
,可以保存代表按钮不同状态的八位

typedef struct{
  Uint8 type;
  Uint8 state;
  Uint16 x, y;
  Sint16 xrel, yrel;
} SDL_MouseMotionEvent;
这里有更多信息


事件按钮。状态是位掩码。它被声明为一个
char
,可以保存代表按钮不同状态的八位

typedef struct{
  Uint8 type;
  Uint8 state;
  Uint16 x, y;
  Sint16 xrel, yrel;
} SDL_MouseMotionEvent;
这里有更多信息


您的代码的问题是您调用了两次
SDL\u polleevent
(有文档记录)。如文件所述:

如果事件不为NULL,则从队列中删除下一个事件并 存储在事件指向的SDL_事件结构中

稍微重新安排一下代码,比如去掉第二个
SDL_polleevent
,创建适当的流,用于单击、移动、释放和从输入中提取渲染,应该可以得到如下结果:

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);
}

代码的问题在于调用了两次
SDL\u polleevent
(已记录)。如文件所述:

如果事件不为NULL,则从队列中删除下一个事件并 存储在事件指向的SDL_事件结构中

稍微重新安排一下代码,比如去掉第二个
SDL_polleevent
,创建适当的流,用于单击、移动、释放和从输入中提取渲染,应该可以得到如下结果:

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);
}

多亏了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);
    }
}

多亏了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);
    }
}

谢谢你的回复。我不明白为什么它会影响结构的其他部分。你能提供一个在按下鼠标时画块的代码示例吗?我更新了代码。谢谢回复。我不明白为什么它会影响结构的其他部分。你能提供一个在按下鼠标时画块的代码示例吗?我更新了代码。