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),来互换屏幕缓冲区。

浙公网安备 33010602011771号