日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用SDL打造游戏世界之入门篇 - 5

發布時間:2023/11/30 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用SDL打造游戏世界之入门篇 - 5 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
同時,由于繪制的屏幕不能同時接受兩個函數的同時操作,我們需要其他兩個輔助函數,用于在繪制前對屏幕進行鎖定,以及在繪制完成之后解除鎖定。這兩個 工作一般由SDL_MUSTLOK(SDL_Surface *screen)和SDL_UnlockSurface(SDL_Surface *screen)完成。使用如下兩個自定義的函數會更加簡單:

void Slock(SDL_Surface *screen)
{
if ( SDL_MUSTLOCK(screen) )
{
if ( SDL_LockSurface(screen) < 0 )
{
return;
}
}
}
void Sulock(SDL_Surface *screen)
{
if ( SDL_MUSTLOCK(screen) )
{
SDL_UnlockSurface(screen);
}
}

這樣,我們可以得到一個簡單的主程序框架如下:

#include <stdio.h>
#include <stdlib.h>
#include "SDL.h"

// The functions are not shown to save space
void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B);
void Slock(SDL_Surface *screen);
void Sulock(SDL_Surface *screen);

int main(int argc, char *argv[])
{
if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
{
printf("Unable to init SDL: %s"n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
SDL_Surface *screen;
screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( screen == NULL )
{
printf("Unable to set 640x480 video: %s"n", SDL_GetError());
exit(1);
}

// DRAWING GOES HERE
return 0;
}

如果對該程序進行編譯運行,那么只能得到一閃而過的一個黑色的窗口。我們需要對窗口進行繪制,并且對基本的鍵盤鼠標事件進行處理。

繪制的基本原理是,先在緩沖區繪制,再一次性將緩沖區繪制到屏幕上。這樣比起一次一個象素點在屏幕上繪圖的方式效率更高,速度更快,也不易出錯。首先使 用循環在screen所指向的surface(緩沖區)上繪制,然后調用SDL_Flip函數將screen surface繪制到真實電腦屏幕上。SDL_Flip函數的作用是:在支持雙緩沖(double-buffering)的硬件上,建立flip并返回。 硬件將等待vertical retrace,然后在下一個視頻surface blit或者執行鎖定返回前交換視頻緩沖區。如果硬件不支持雙緩沖,那么等同于調用SDL_UpdateRect(screen, 0, 0, 0, 0),即對整個screen的繪制區域進行刷新。

void DrawScene(SDL_Surface *screen)
{
Slock(screen);
for(int x=0;x<640;x++)
{
for(int y=0;y<480;y++)
{
DrawPixel(screen, x,y,y/2,y/2,x/3);
}
}
Sulock(screen);
SDL_Flip(screen);
}

在SDL中對采用結構SDL_Event來描述事件,并采用輪詢的機制對事件進行處理,程序中使用一個SDL_Event的實例(Instance)來檢查事件的發生:

SDL_Event event;

輪詢采用while循環來檢查:

while ( SDL_PollEvent(&event))
{
if ( event.type == SDL_QUIT)
{
//code here….
}
if ( event.type == SDL_KEYDOWN)
{
//code here….
}
//…..
}

事件輪詢完畢之后,調用DrawScene(sreen)進行一次繪制。 更多內容請看游戲開發、網絡游戲攻略、Solaris基礎知識入門專題,或進入討論組討論。

轉載于:https://www.cnblogs.com/Henrya2/archive/2009/03/24/1420866.html

總結

以上是生活随笔為你收集整理的使用SDL打造游戏世界之入门篇 - 5的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。