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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/8/22 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用SDL打造游戏世界之入门篇 - 4 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)單的象素繪制

?下文從使用SDL的編程函數(shù)開始,介紹了如何使用SDL在屏幕上進(jìn)行象素繪制的基本知識(shí),并給出了一個(gè)簡(jiǎn)單的例子。

如果要在VC中用SDL庫(kù),必須在源文件頭部包含以下頭文件:

#include “SDL.h”

初始化SDL是通過(guò)SDL_Init()函數(shù)來(lái)實(shí)現(xiàn)的。如果初始化失敗,函數(shù)返回值為0。函數(shù)只接受初始化對(duì)象作為參數(shù)。如果要 初始化視頻屏幕,傳入常數(shù)SDL_INIT_VIDEO作為參數(shù);初始化音頻,傳入常數(shù)SDL_INIT_AUDIO;如果同時(shí)初始化視頻和音頻,傳入 SDL_INIT_VIDEO|SDL_INIT_AUDIO。其它還有一些量可以傳入作為參數(shù)的(如果同時(shí)傳入多個(gè)量要使用|將它們隔開):

SDL_INIT_TIMER
SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_CDROM
SDL_INIT_JOYSTICK
SDL_INIT_NOPARACHUATE
SDL_INIT_EVENTTHREAD
SDL_INIT_EVERYTHING

如果我們要初始化,可以使用如下語(yǔ)句:

if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0 )
{
printf(“Unable to init SDL: %s"n”, SDL_GetError());
return 1;
}

如果初始化失敗,則函數(shù)SDL_GetError()返回關(guān)于錯(cuò)誤的一個(gè)字符串提示信息。

當(dāng)從你的C++語(yǔ)句返回時(shí),記住使用SDL_Quit()進(jìn)行程序的清理工作,否則就會(huì)出現(xiàn)奇怪的現(xiàn)象??梢允褂萌缦抡Z(yǔ)句進(jìn)行描述:

atexit(SDL_Quit);

這樣的話就不需要在main函數(shù)中每個(gè)return語(yǔ)句前加入SDL_Quit()了。

在SDL中你可以擁有多個(gè)surface,每件物體都是一個(gè)surface。你可以在一個(gè)surface上進(jìn)行繪圖或者在其他surface上繪制另外 一個(gè)surface。程序中一個(gè)surface的表示即為指向結(jié)構(gòu)SDL_Surface的指針。如果要獲得一個(gè)surface只要如下定義:

SDL_Surface *screen;

如果需要對(duì)screen所指向的surface上進(jìn)行繪圖,你可以使用函數(shù)SDL_SetVideoMode()來(lái)設(shè)置屏幕分辨率:

screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

前三個(gè)參數(shù)分別為屏幕寬度,高度和屏幕上的每象素包含的位數(shù)(bits per pixel, BPP)。如果填入0則SDL自動(dòng)選擇最合適的BPP。第四個(gè)參數(shù)用來(lái)給出某些特殊標(biāo)志位。如果要在屏幕上進(jìn)行圖形繪制就必須使用 SDL_HWSURFACE或者SDL_SWSURFACE。以下給出了一個(gè)你可以指定的標(biāo)志位:

SDL_SWSURFACE:在系統(tǒng)內(nèi)存中創(chuàng)建視頻Surface

SDL_HWSURFACE:在視頻內(nèi)存中創(chuàng)建視頻Surface

SDL_ASYNCBLIT:允許在顯示surface上使用異步更新。在單CPU機(jī)器上會(huì)變慢,但在SMP系統(tǒng)上會(huì)有顯著的性能提升。

SDL_ANYFORMAT:一般的,如果指定位數(shù)的bpp不可用,那么SDL就會(huì)模擬使用陰影surface。如果傳入SDL_ANYFORMAT就會(huì)阻止這樣做,并且不管色深強(qiáng)制使用視頻surface。

SDL_HWPALETTE:給予SDL特許的畫盤的訪問(wèn)權(quán),使用這個(gè)標(biāo)志位就不需要總是使用SDL_SetColors或者SDL_SetPalette來(lái)獲取所需的顏色。

SDL_DOUBLEBUF:允許硬件雙緩沖;只是和SDL_HWSURFACE一起使用時(shí)比較有用。調(diào)用SDL_Flip將會(huì)flip整個(gè)緩沖并且更 新屏幕。所有的繪制將會(huì)在當(dāng)前未顯示的surface上發(fā)生。如果雙緩沖被允許,那么SDL_Flip將會(huì)對(duì)整個(gè)屏幕進(jìn)行SDL_UpdateRect操 作。

SDL_FULLSCREEN:SDL將會(huì)嘗試使用全屏模式。如果硬件分辨率的調(diào)整由于某種情況無(wú)法完成,那么下一個(gè)稍高的分辨率將會(huì)被使用,并且顯示窗口將會(huì)處于一個(gè)黑色背景的中央。

SDL_OPENGL:創(chuàng)建一個(gè)OPENGL rendering context。使用前必須已經(jīng)使用SDL_GL_SetAttribute對(duì)OpenGL視頻屬性進(jìn)行設(shè)置。

SDL_OPENGLBLIT: 和上一個(gè)選項(xiàng)一樣創(chuàng)建一個(gè) OPENGL rendering context, 但是允許使用正常的blitting操作。

SDL_RESIZABLE; 創(chuàng)建一個(gè)可伸縮大小的窗口。當(dāng)用戶調(diào)整窗口大小時(shí),將會(huì)觸發(fā)一個(gè)SDL_VIDEORESIZE事件,SDL_SetVideoMode將會(huì)使用新大小作為參數(shù)再次被調(diào)用。

SDL_NOFRAME: 如果可以的話,SDL_NOFRAME將會(huì)創(chuàng)建出一個(gè)沒(méi)有標(biāo)題欄和邊界修飾的窗口,全屏方式自動(dòng)設(shè)置此標(biāo)志位。

建議使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出現(xiàn)錯(cuò)誤可以嘗試使用SDL_SWSURFACE。

SDL_SetVideoMode如果操作成功,則返回一個(gè)指向SDL_Surface的指針,否則的話返回NULL??梢允褂萌缦抡Z(yǔ)句檢查發(fā)生的錯(cuò)誤:

If ( screen == NULL )
{
printf(“Unable to set 640x480 video: %s"n”, SDL_GetError());
return 1;
}

以上介紹了如何對(duì)SDL進(jìn)行初始化,下面可以開始繪制了。但是還有一些需要注意的關(guān)鍵地方,首先是一些SDL使用的容易讓人產(chǎn)生迷惑的數(shù)據(jù)類型:

Uint8 – 相當(dāng)于unsigned char
Uint16 – 16位(2字節(jié)) unsigned integer
Uint32 – 32位(4字節(jié)) unsigned integer
Uint64 - 64位(8字節(jié)) unsigned integer
Sint8 – 相當(dāng)于signed char
Sint16 – 16位(2字節(jié)) signed integer
Sint32 – 32位(4字節(jié)) signed integer
Sint64 - 64位(8字節(jié)) signed integer

還有,有的時(shí)候如果初始化出現(xiàn)錯(cuò)誤,沒(méi)必要完全退出。例如當(dāng)初始化了SDL_INIT_VIDEO而沒(méi)有初始化SDL_INIT_AUDIO,那么你可 以繼續(xù)這個(gè)錯(cuò)誤只是沒(méi)有音頻而已。要檢查是否音頻初始化是否成功,可以使用SDL_WasInit()函數(shù)來(lái)檢查。下面是一個(gè)例子:

Uint32 init = SDL_WasInit(SDL_INIT_AUDIO);
If (init & SDL_INIT_AUDIO)
{
sound = 1;
} else {
sound = 0;
}

你可以在程序初始化的某些地方加入以上語(yǔ)句。

以下是SDL介紹中進(jìn)行象素繪制的語(yǔ)句,可以暫時(shí)不需要完全了解其中的意思:

void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B)
{
Uint32 color = SDL_MapRGB(screen->format, R, G, B);
switch (screen->format->BytesPerPixel)
{
case 1: // Assuming 8-bpp
{
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: // Probably 15-bpp or 16-bpp
{
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: // Slow 24-bpp mode, usually not used
{
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
{
bufp[0] = color;
bufp[1] = color >> 8;
bufp[2] = color >> 16;
} else{
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: // Probably 32-bpp
{
Uint32 *bufp;
bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
*bufp = color;
}
break;
}
}

通過(guò)這個(gè)函數(shù),可以傳遞給surface要繪制的點(diǎn)的(x,y)坐標(biāo)和RGB值。 更多內(nèi)容請(qǐng)看游戲開發(fā)、網(wǎng)絡(luò)游戲攻略、Solaris基礎(chǔ)知識(shí)入門專題,或進(jìn)入討論組討論。

轉(zhuǎn)載于:https://www.cnblogs.com/Henrya2/archive/2009/03/24/1420864.html

總結(jié)

以上是生活随笔為你收集整理的使用SDL打造游戏世界之入门篇 - 4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。