亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sdl很好的教程.txt

?? 用sdl開發小型游戲的
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
 GFX with SDL Lesson 1: Getting started with SDL(翻譯) 
GFX with SDL
Lesson 1: Getting started with SDL
作者:Marius Andra
翻譯:heroboy


歡迎來到“GFX with SDL”的第一篇教程。

在Dev-C++中使用SDL

首先需要下載sdlDevCPP-1.2.4.zip(點擊名稱下載)。把zip文件解壓到Dev C++的目錄中,請確定include和lib文件夾(zip文件中)中的文件解壓到Dev C++中的include和lib文件夾中。我計算機上的Dev-C++文件夾是c:\Dev-C++。所以解壓以后,在c:\Dev-C++\lib會有libSDL.a,libSDL.la,libSDLmain.a和SDL.dll,在c:\Dev-C++\include\SDL中會有一些 .h文件。

 

現在,在Dev-C++中新建一個控制臺工程。打開“工程屬性”對話框(在“工程”菜單中)。在參數中,點擊“加入庫或者對象”按鈕,選擇libSDL.a,SDLmain.a和ligmingw32.a 三個文件。點擊“確定”。

 

最后,在SDL項目中使用printf(…)或輸出到stdout.txt中,而非屏幕。


在 Microsoft Visual C++ 6.0中使用SDL

要在MSVC6中使用SDL要下載SDL-devel-1.2.4-VC6.zip(請訪問www.libsdl.org下載更新版本的SDL)。在這個壓縮文件中有兩個重要的文件夾-include和lib,把lib文件夾中的文件復制到MSVC6的lib文件夾中(在我的機器上是C:\Program Files\Microsoft Visual Studio\VC98\Lib),在MSVC6的include文件夾中新建一個SDL文件夾(在我的機器上是C:\Program Files\Microsoft Visual Studio\VC98\Include\SDL),把壓縮文件中include文件夾中的.h文件復制到新建的文件夾中。

 

現在,在VC++中新建一個工程。選擇“WIN32 Application”和“'an empty project”。現在要為工程創建一個cpp文件,單擊File-〉new并選擇 “c++ source file”,名字輸入“main.cpp”。現在打開工程選項對話框(菜單project->settings)。點擊“LINK”欄,添加 “sdl.lib sdlmain.lib”到連接文件中(Object/library modules)。最后,點擊“C/C++”欄,在下拉菜單中選擇“Code Generation”。然后在“Use run-time library”下拉框中選擇“Multithreaded DLL”。

 

SDL.dll

 


SDL.dll是SDL中一個重要的文件(它在Dev-C++或MSVC6的SDL zip文件里)。如果你要運行SDL程序,你必須把SDL.dll復制到c:\windows\system (win 95, 98, ME) 或 c:\windows\system32 (on windows NT, 2000 and XP)。或者SDL.dll和你的程序在同一個文件夾。


Getting started with SDL

你已經設置好了一切。你要象下面一樣在你的程序中包含 SDL/SDL.h 文件:

#include <SDL/SDL.h>

通過SDL_Init()函數初始化SDL。SDL_Init的返回值下于0表示出錯。它接受一個參數,初始化的內容。SDL_INIT_VIDEO初始化視頻,SDL_INIT_AUDIO初始化音頻。要初始化音頻和視頻,使用SDL_INIT_VIDEO|SDL_INIT_AUDIO。可以初始化更多如下的項目(要同時初始化,請使用 | 分割他們):

SDL_INIT_TIMER

SDL_INIT_AUDIO

SDL_INIT_VIDEO

SDL_INIT_CDROM

SDL_INIT_JOYSTICK

SDL_INIT_NOPARACHUTE

SDL_INIT_EVENTTHREAD

SDL_INIT_EVERYTHING

因此,初始化視頻和音頻的代碼是:

if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) <0 )

{

  printf("Unable to init SDL: %s\n", SDL_GetError());

  return 1;

}

如果出錯了,SDL_GetError()函數返回一個字符串來描述這個錯誤。



但退出程序時,你必須調用SDL_Quit()。如果沒有調用的話,可能會出現一些異常的現象。告訴編譯器你要在退出時調用SDL_Quit,代碼如下:

atexit(SDL_Quit);

那樣就不需要在main函數中的每個return前加上SDL_Quit()了。

在SDL中需要很多的surface。一切都是surface。你可以在surface上繪圖,也可以把一個surface畫到另一個surface上。在SDL中,屏幕也是一個surface。在我們的程序中surface是一個指向SDL_Surface結構的指針。如下得到屏幕surface:

SDL_Surface *screen;

相信你在玩有些游戲的時候會要你選擇屏幕分辨率。如果沒有的話,請玩更多的游戲。如果你要使用surface屏幕(surface screen)(記住,screen只是一個指向SDL_Surface結構的指針),在上面繪圖(你在監視器上可以看到畫了什么),那么使用SDL_SetVideoMode()函數。

screen = SDL_SetVideoMode(640, 480, 32,

                             SDL_HWSURFACE|SDL_DOUBLEBUF);

前三個參數分別是屏幕的 寬度,高度和像素位數bits per pixel)。如果像素位數為0,SDL會為你自動選擇最合適的位數。第四個參數是一些特殊的標記。如果要在屏幕上繪圖的話,必須有SDL_HWSURFACE(或SDL_SWSURFACE)。下列是可用的選項:


SDL_SWSURFACE – 在系統內存中創建surface 
SDL_HWSURFACE – 在顯示內存中創建surface 
SDL_ASYNCBLIT – 允許異步刷新的surface。這會降低在單CPU上的位拷貝(blitting)的速度,但在SMP系統上速度會有提升。
SDL_ANYFORMAT - 一般地,如果給與的像素位數(bits-per-pixel,bpp)不可用的話,SDL回使用影子surface(shadow surface)模擬。SDL_ANYFORMAT會阻止這么做,而忽略參數中的像素位數。
SDL_HWPALETTE –給予SDL 獨立的調色板訪問(exclusive palette access)。沒有這個選項,你不能通過SDL_SetColors或SDL_SetPalette來獲取顏色。
SDL_DOUBLEBUF –允許硬件雙緩沖。只有和SDL_HWSURFACE一起使用才有效。調用SDL_Flip來翻轉(flip)緩沖并刷新屏幕。所有的繪圖不會立即顯示在屏幕上。如果不允許雙緩沖的話,SDL_Flip函數相當于對整個屏幕調用SDL_UpdateRect。
SDL_FULLSCREEN – SDL會嘗試使用全屏模式。如果硬件不支持當前的分辨率的話,會使用一個更高的分辨率和黑色的背景。
SDL_OPENGL –創建OpenGL渲染上下文(rendering context)。你應該預先使用SDL_GL_SetAttribute設置OpenGL視頻屬性。
SDL_OPENGLBLIT -創建OpenGL渲染上下文(rendering context),但使用普通的位拷貝(blitting)操作。屏幕surface(2D)會有一個alpha通道,并且必須使用SDL_UpdateRects來更新屏幕surface。
SDL_RESIZABLE –創建可縮放的窗口。當縮放的時候,會產生SDL_VIDEORESIZE事件,此時可通過SDL_SetVideoMode再次改變屏幕surface大小。
SDL_NOFRAME - 如果可行的話,SDL會創建無框架無標題欄的窗口。全屏模式自動包含此選項。

我的建議是:使用 SDL_HWSURFACE|SDL_DOUBLEBUF。如果出錯的話,使用SDL_SWSURFACE.

SDL_SetVideoMode 返回指向SDL_Surface的指針,出錯的話返回NULL。使用如下代碼檢測出錯:

if ( screen == NULL )

{

  printf("Unable to set 640x480 video: %s\n", SDL_GetError());

  return 1;

}

至此已經初始化了SDL,可以開始繪圖了。在開始繪圖前,我要告訴你一些SDL的數據類型。他們是:

Uint8 – 相當于unsigned char

Uint16 – 16位(2字節)無符號整形

Uint32 - 32位(4字節) 無符號整形

Uint64 - 64位(8字節) 無符號整形

Sint8 - 相當于 signed char

Sint16 - 16位(2字節) 有符號整形

Sint32 - 32位(4字節) 有符號整形

Sint64 - 64位(8字節) 有符號整形

另外,無論何時初始化出錯的時候,你不必完全退出。例如,SDL_INIT_VIDEO初始化成功,而SDL_INIT_AUDIO失敗的話,你仍然可以繼續運行程序,只是沒有聲音。為了檢測音頻是否初始化成功,使用SDL_WasInit()函數。代碼如下:

Uint32 init = SDL_WasInit(SDL_INIT_AUDIO);

if(init & SDL_INIT_AUDIO)

{

  sound = 1;  // Audio init sucessful, use sound

} else {

  sound = 0;  // Audio init unsucessful, don't use sound

}

你可以在如下代碼中插入上述代碼

if( SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) <0 )

{

  printf("Unable to init SDL: %s\n", SDL_GetError());

  return 1;

}

為簡單起見,我不在教程中插入此代碼。

繪制像素乍看是很簡單的,但如果你看了此函數的話其實并不簡單。我使用的這個像素繪制函數,取自SDL intro(www.libsdl.org上的)。如下:



注意:你不必完全理解它,只要使用就可以了

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;

  }

}

傳遞一個你想繪圖的surface,x軸,y軸坐標和RGB顏色就可以了。


另外需要兩個重要的函數。一些顯卡,需要在繪圖前鎖定它。SDL_MUSTLOCK(SDL_Surface *screen)用來確定是否需要鎖定屏幕。SDL_LockSurface(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);

  }

}

調用 Slock(screen)鎖定屏幕, Sulock(screen)解鎖。


現在,代碼應該如下:

#include <stdio.h>

#include <stdlib.h>

 

#include <SDL/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;

}

運行一下。你會發現,一個空窗口閃了一下。加入SDL_FULLSCREEN標記,會看見一個黑屏。現在,讓我們繪圖。


我們來做一個簡單的繪圖:我們把所有的東西都繪制在一個緩沖上,再把緩沖畫到屏幕上。這比直接在屏幕上繪制像素簡單,速度快,而且沒有閃爍。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频三区在线播放| 亚洲一区二区在线免费观看视频| 日本va欧美va欧美va精品| 欧美综合色免费| 亚洲成av人片在线| 日韩一级成人av| 国精品**一区二区三区在线蜜桃| 国产欧美精品区一区二区三区| 国产精品一线二线三线精华| 国产欧美日韩激情| 久久精品久久99精品久久| 国产欧美视频一区二区| www.成人网.com| 亚洲一区免费观看| 欧美一二区视频| 国产成人免费网站| 伊人色综合久久天天人手人婷| 日本精品视频一区二区三区| 五月婷婷激情综合网| 欧美xxxxx牲另类人与| 成人性生交大片免费看视频在线| 秋霞成人午夜伦在线观看| 91精品国产综合久久蜜臀| 国产一区二区精品久久91| 《视频一区视频二区| 欧美视频一区在线观看| 精品一区二区三区日韩| 中文字幕欧美三区| 欧美色倩网站大全免费| 国产乱淫av一区二区三区| 国产精品成人一区二区三区夜夜夜| 91成人在线观看喷潮| 精品一区精品二区高清| 亚洲自拍与偷拍| 久久精品在线免费观看| 欧美日韩视频在线第一区 | 欧美伊人久久久久久久久影院| 日韩激情中文字幕| 中文字幕五月欧美| 日韩欧美在线观看一区二区三区| 成人av电影免费在线播放| 免费的成人av| 亚洲精品视频自拍| 国产丝袜欧美中文另类| 欧美日韩国产色站一区二区三区| 国产精品99久| 性久久久久久久久久久久| 在线观看日韩电影| 久久久久成人黄色影片| 视频一区二区中文字幕| 国产欧美日韩另类一区| 欧美色综合天天久久综合精品| 久久精品国产免费| **性色生活片久久毛片| 在线播放91灌醉迷j高跟美女 | 国产精品国产成人国产三级| 欧美美女一区二区在线观看| 国产一区二区在线观看免费| 日本一区二区不卡视频| av亚洲产国偷v产偷v自拍| 日韩国产精品久久久久久亚洲| 99视频精品在线| 日本成人在线一区| 色综合久久久网| 综合亚洲深深色噜噜狠狠网站| 国产精品一二三| 欧美韩国日本一区| 99久久亚洲一区二区三区青草| 26uuu亚洲综合色欧美| 国产麻豆精品在线观看| 亚洲免费观看高清| 欧美日韩国产系列| 国产在线观看一区二区| 自拍偷拍亚洲激情| 国产日韩v精品一区二区| 欧美日韩精品欧美日韩精品一 | 欧美日韩精品三区| 福利一区在线观看| 国产真实精品久久二三区| 婷婷久久综合九色综合绿巨人 | 亚洲一区二区av电影| 国产女人18水真多18精品一级做| 51精品秘密在线观看| 欧美影视一区二区三区| 色综合激情五月| 91片黄在线观看| 不卡av在线网| 成人午夜看片网址| 美女视频一区在线观看| 奇米色一区二区三区四区| 五月激情六月综合| 午夜久久久久久电影| 亚洲国产欧美日韩另类综合| 夜夜精品浪潮av一区二区三区| 久久精品一区二区三区不卡牛牛 | 日日嗨av一区二区三区四区| 亚洲成人黄色小说| 一区二区三区精品在线观看| 亚洲美女屁股眼交3| 亚洲自拍偷拍综合| 午夜视频在线观看一区二区| 亚洲成a人在线观看| 亚洲高清视频在线| 亚洲aaa精品| 亚洲免费三区一区二区| 午夜不卡av免费| 奇米精品一区二区三区四区| 捆绑调教美女网站视频一区| 精品中文字幕一区二区小辣椒| 蜜臂av日日欢夜夜爽一区| 黄页网站大全一区二区| 国产尤物一区二区在线| 成人妖精视频yjsp地址| 91社区在线播放| 欧美日韩性生活| 精品对白一区国产伦| 久久精品人人做| 最新热久久免费视频| 亚洲视频在线一区二区| 日本午夜精品一区二区三区电影| 久久精品国产成人一区二区三区| 国产麻豆精品在线观看| 97久久人人超碰| 欧美色倩网站大全免费| 日韩欧美你懂的| 中文字幕精品三区| 日韩制服丝袜先锋影音| 韩国v欧美v亚洲v日本v| jizz一区二区| 欧美男人的天堂一二区| 久久综合给合久久狠狠狠97色69| 久久久久久久久久久电影| 国产欧美日韩不卡| 免费xxxx性欧美18vr| www.亚洲精品| 91精品婷婷国产综合久久 | 激情都市一区二区| 高清视频一区二区| 欧美变态tickling挠脚心| 国产精品久久久久久久蜜臀| 亚洲成a人v欧美综合天堂| 国产**成人网毛片九色 | 欧美va亚洲va| 亚洲男人电影天堂| 国产综合色在线| 色婷婷综合五月| 欧美日韩三级一区| 中国色在线观看另类| 日韩专区欧美专区| www.亚洲色图| 久久先锋影音av鲁色资源网| 亚洲一区二区三区美女| 高清不卡一区二区| 日韩免费一区二区| 午夜电影一区二区三区| 91网站在线观看视频| 久久精品水蜜桃av综合天堂| 99精品久久99久久久久| 日韩欧美自拍偷拍| 亚洲成a人v欧美综合天堂下载 | 国产精品久久久久久久久搜平片 | 一区二区视频免费在线观看| 成人精品一区二区三区中文字幕| 精品国产自在久精品国产| 亚洲精品你懂的| 99国产精品久久久久久久久久久| 777亚洲妇女| 亚洲三级免费电影| 成人亚洲一区二区一| 日韩欧美中文一区| 国产成人免费在线观看不卡| 久久久www免费人成精品| 亚洲成人动漫在线免费观看| 欧美在线影院一区二区| 亚洲男人的天堂在线aⅴ视频| 97成人超碰视| 日本成人在线视频网站| 精品国产一区二区精华| av在线不卡观看免费观看| 亚洲精品水蜜桃| 久久精品视频网| 五月婷婷综合在线| 亚洲综合在线五月| 91在线小视频| 精品蜜桃在线看| 免费观看在线综合| 欧美疯狂做受xxxx富婆| 中文字幕一区二区三区视频| 国产成人精品一区二区三区四区 | 国产精品青草久久| 丰满少妇久久久久久久| 久久综合视频网| 国产精品996| 国产日韩亚洲欧美综合| 成人精品在线视频观看| 中文字幕制服丝袜一区二区三区 | 成人午夜私人影院| 国产精品久久久久精k8| 色爱区综合激月婷婷| 亚洲国产一区二区在线播放|