C 为什么移动鼠标会改变按钮状态?
我对简单的Directmedia层库有问题。按下鼠标按钮时,以下代码在屏幕上绘制一个块: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
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);
}
}
谢谢你的回复。我不明白为什么它会影响结构的其他部分。你能提供一个在按下鼠标时画块的代码示例吗?我更新了代码。谢谢回复。我不明白为什么它会影响结构的其他部分。你能提供一个在按下鼠标时画块的代码示例吗?我更新了代码。