SDL闹腾(二):SDL窗口

嗯,经过昨天晚上小小的瞎折腾了一会儿,终于能够弄出来一个窗口了,但是一闪而过很显然不是我所能够忍受的。于是昨天晚上自作聪明的上了一个死循环,就挖了一个坑直接把自己埋了,好在只是稍微麻烦了一点点而已。

虽然昨天晚上最后使用了一个类似计数器的东东,终于让窗口停留在桌面一小会儿,但是很显然这种做法不是解决问题的办法。这么做会让桌面的焦点一只聚集在这个SDL窗口上,直至SDL窗口的销毁。

今天中午,终于起床洗漱之后,看了一下codeblocks本身的例子,直接从里面摘取出来一段代码,粘贴到我的代码中,果然窗口能够像正常一样工作了(但是很简陋,以后一点点改造吧……)。

那么在昨天的代码基础上,又添加了如下的代码:

 1     bool done = false;
 2     while (!done)
 3     {
 4         // message processing loop
 5         SDL_Event event;
 6         while (SDL_PollEvent(&event))
 7         {
 8             // check for messages
 9             switch (event.type)
10             {
11                 // exit if the window is closed
12             case SDL_QUIT:
13                 done = true;
14                 break;
15 
16                 // check for keypresses
17             case SDL_KEYDOWN:
18                 {
19                     // exit if ESCAPE is pressed
20                     if (event.key.keysym.sym == SDLK_ESCAPE)
21                         done = true;
22                     break;
23                 }
24             } // end switch
25         } // end of message processing
26 
27         // DRAWING STARTS HERE
28 
29         // clear screen
30         SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 0, 0, 0));
31 
32         // draw bitmap
33         //SDL_BlitSurface(bmp, 0, screen, &dstrect);
34 
35         // DRAWING ENDS HERE
36 
37         // finally, update the screen :)
38         SDL_Flip(screen);
39     } // end main loop

嗯,很明显我又偷懒了……^_^……

将这段代码插入到test_start()函数当中:

=======================啦啦啦啦我是分割线==============================

SDL_WM_SetCaption( "hello", 0 );

//贴入此段代码

SDL_Quit();
return 0;

======================啦啦啦啦分割线结束===============================

嗯,这里也主要是分析一下这段代码,所以这里也就不再次将整片代码一同copy出来了。

 

(1)首先分析一下这个代码,第一个陌生的就是这个SDL_Event。从名字上来分析,应该是和SDL事件相关的。那么,首先看看这个家伙的定义(SDL_events.h):

 1 typedef union SDL_Event {
 2     Uint8 type;
 3     SDL_ActiveEvent active;
 4     SDL_KeyboardEvent key;
 5     SDL_MouseMotionEvent motion;
 6     SDL_MouseButtonEvent button;
 7     SDL_JoyAxisEvent jaxis;
 8     SDL_JoyBallEvent jball;
 9     SDL_JoyHatEvent jhat;
10     SDL_JoyButtonEvent jbutton;
11     SDL_ResizeEvent resize;
12     SDL_ExposeEvent expose;
13     SDL_QuitEvent quit;
14     SDL_UserEvent user;
15     SDL_SysWMEvent syswm;
16 } SDL_Event;

原来是一个联合……

嗯,从名字上来看,大概都能分析出来是什么意思。

 

(2)SDL_PollEvent。嗯,SDL事件轮询。

SDL_PollEvent用于查询事件队列中的事件。这里要注意SDL_WaitEvent这个函数,SDL_WaitEvent在没有用户消息的时候,程序会等待,也就是说,SDL_WaitEvent是一个阻塞函数。

 

(3)从逻辑上分析这段代码的执行

  ①首先设置一个标志位,用来控制是否跳出循环。开始循环体。

  ②定义一个SDL_Event事件(For Example:SDL_Event event)。

  ③使用SDL_PollEvent来查询事件队列中的事件(即取得事件的type。For Example:event.type)。

  ④判断此事件是否是SDL退出事件,如果是,将标志位置反。

  ⑤判断是否是键盘按键按下事件,如果是,继续判断是否是esc按键被按下,如果是,将标志位置反。

  ⑥使用SDL_FillRect来填充窗口

  ⑦使用SDL_Flip(screen),来互换屏幕缓冲区。

 

posted @ 2013-09-19 13:51  DM-Bird  阅读(1649)  评论(0)    收藏  举报