??xml version="1.0" encoding="utf-8" standalone="yes"?>91久久九九无码成人网站,99久久免费国产精品特黄,久久99国内精品自在现线http://www.shnenglu.com/kyelin/category/14536.html攉,记录,整理,回收zh-cnWed, 11 Aug 2010 12:45:06 GMTWed, 11 Aug 2010 12:45:06 GMT60SDL-5(打开和显C图?http://www.shnenglu.com/kyelin/archive/2010/08/11/123062.html我风我风Wed, 11 Aug 2010 05:59:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/08/11/123062.htmlhttp://www.shnenglu.com/kyelin/comments/123062.htmlhttp://www.shnenglu.com/kyelin/archive/2010/08/11/123062.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/123062.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/123062.html
  在这个例子里我们学?fn)如何用SDLE序中打开和显C图片。示例程序将l制一个漂亮的背景Q上面显CZ个正方Ş图案Qƈ可以使用键盘的方向键Ud它。如果比较熟(zhn)“推子”这个游戏,可以看出q个E序实际是推箱子游戏的基础?br />
  在程序首部包含以下头文g(stdlib.h供调用atexit()时?Q?br />
#include <stdio.h>
#include <stdlib.h>
#include “SDL.h?/td>

  声明3个SDL_Surfacecd的全局变量Q同时声?个整型变量用于记录正方Ş的坐标:(x)

SDL_Surface *back;
SDL_Surface *image;
SDL_Surface *screen;

int xpos = 0, ypos = 0;

  我们构造一个函数InitImage函数来打开bitmap文g(.bmp)中的囑փ信息Q传递给SDL_Surface昄。InitImage会(x)被main()函数调用。在InitImage函数中我们用到?jin)SDL_LoadBMP函数Q它把bmp文g的文件名作ؓ(f)参数传入Q返回指向存储图像文件信息内存区域的指针。InitImage中我们将背景囄bg.bmp打开q用back指针q行记录Q将正方形图片image.bmp打开q用image指针记录?br />
int InitImages()
{
 back = SDL_LoadBMP("bg.bmp");
 image = SDL_LoadBMP("image.bmp");
 return 0;
}

  下面我们介绍图像绘制到屏幕的两个函敎ͼ两个函数都被命名为DrawIMG。第一个DrawIMG函数使用SDL_BlitSurface函数来在屏幕上显C图像。在SDL中SDL_BliSurface的函数原型如下:(x)

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect);

  src是需要进行绘制的surface而dst是进行显C的surface。SDL_Rect是一个包??6位整型变量的l构Qx, y, w(width)和h(height)。srcrect用来描述源surface中需要绘刉分,而dstrect用来描述在目的surface何处q行l制。如果设|srcrect为NULLQ那么源文g中包含的整个囑փ都会(x)被显C。dstrect中的x和y变量指定?jin)在何处blit SDL_Surface src。对于dstrect来说Qw(width)和h(height)q两个变量是被忽略不计的。第一个DrawIMG函数非常单:(x)

void DrawIMG(SDL_Surface *img, int x, int y)
{
 SDL_Rect dest;
 dest.x = x;
 dest.y = y;
 SDL_BlitSurface(img, NULL, screen, &dest);
}

  下面我们考虑一个复杂点的情况,如图Q?br />

  如果我们需要将阴媄(jing)区域传递给srcrectq行l制Q我们就需要用到srcrectl构里的几个变量?x,y指定?jin)所要绘制的源区域的L(fng)坐标Q而w和h分别指定?jin)源区域的宽度和高度。如果图中的阴媄(jing)坐标L(fng)坐标?20,25)Q宽61个象素高70个象素,那么我们可以得到Qsrcrect中x = 20, y = 25, w = 61, h = 70?br />
  W二个DrawIMG定义如下Q?br />
void DrawIMG(SDL_Surface *img, int x, int y, int w, int h, int x2, int y2)
{
 SDL_Rect dest;
 dest.x = x;
 dest.y = y;
 SDL_Rect dest2;
 dest2.x = x2;
 dest2.y = y2;
 dest2.w = w;
 dest2.h = h;
 SDL_BlitSurface(img, &dest2, screen, &dest);
}

  l制背景的函数DrawBG()比较?

void DrawBG()
{
 Slock(screen);
 DrawIMG(back, 0, 0);
 Sulock(screen);
}

  l制正方形图像的函数会(x)比较复杂Q首先我们用背景图案填充当前正方形图像所在区域,如果不这样做的话Q正方Ş囑փ的移动就?x)造成背景上留下黑色的方ŞUd轨迹Q如图所C:(x)


  q里Q我们只填充正方形图像移动后的轨q区域,q样比填充整个区域速度快。由于正方Ş区域大小?28x128Q由于每ơ正方Ş只能朝某个方向移?个象?pixel),Z(jin)d消除Ud轨迹Q我们背景的新填充区域扩大到132x132Q这样就可以完全覆盖׃Ud造成的轨qҎ(gu)留。最后用SDL_FlipҎ(gu)的图像绘制区域进行更新。函数如下:(x)

void DrawScene()
{
 Slock(screen);
 DrawIMG(back, xpos-2, ypos-2, 132, 132, xpos-2, ypos-2);
 DrawIMG(image, xpos, ypos);

 SDL_Flip(screen);
 Sulock(screen);
}

  ׃要移动正方Ş囑փQ我们需要对键盘的方向键的按下事件进行响应,因此在main函数开始时定义Q?br />
Uint8* keysQ?/td>

  keys用来获得每一旉的键盘状态。获得键盘状态的函数为SDL_GetKeyState(),它返回一个指向Uin8cd的数l头部的指针。数l的每个元素都对应记录了(jin)某个按键是否被按下的标志。这里的实现Q我们不在事件轮询SDL_PollEvent中检查按键,因ؓ(f)事g轮询中是只有触发事g也即SDL_PollEvent(&event) == 1才能q入循环的,因而如果我们一直按下某键不攑ּ是不?x)触发新的事件发生的Q要使得正方形移动我们必M下又一下的敲击某个方向键,昄q不是我们所要的。我们希望是按下某键不放开的话Q正方Ş一直保持向此方向移动。因此我们将(g)查按键的E序D|C件轮询之后处理。这里没有用else if…结构,因此可以多个方向键同时按下进行移动,E序D如下:(x)

int done=0;

while(done == 0)
{
 SDL_Event event;

 while ( SDL_PollEvent(&event) )
 {
  if ( event.type == SDL_QUIT ) { done = 1; }

  if ( event.type == SDL_KEYDOWN )
  {
   if ( event.key.keysym.sym == SDLK_ESCAPE ) { done = 1; }
  }
 }
 keys = SDL_GetKeyState(NULL);
 if ( keys[SDLK_UP] ) { ypos -= 1; }
 if ( keys[SDLK_DOWN] ) { ypos += 1; }
 if ( keys[SDLK_LEFT] ) { xpos -= 1; }
 if ( keys[SDLK_RIGHT] ) { xpos += 1; }

 DrawScene();
}

  E序q行l果如下Q我们已l将正方形图像区域移动到?jin)窗口中央?j)Q?br />

  如果惛_?fn)本E序的完整代码,可以从以下地址下蝲Qhttp://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/download.pl?file=lesson2.zip&blah=1

  以上我们单介l了(jin)VC6下SDL的安装和单应用,qD?jin)两个小例子Q当然SDL的功能远q不止这些,包括音频、定时器和线E编E等{,q里׃一一鳌数?jin)。如果有兴趣QSDL官方|站提供?jin)非常详的函数说明、文档和使用指南Q你可以在网站上获取非常多的信息。由于SDL是跨q_和开发工L(fng)Q方便游戏在各种q_下的ULQ同时还支持常用的各U开发语a。因此,有够的理由怿Q在游戏产业蓬勃发展的今天,SDL一定会(x)得到更多开发者的青睐Q用它开发出各种有趣的游戏来?

我风 2010-08-11 13:59 发表评论
]]>
SDL-4(单的象素l制)http://www.shnenglu.com/kyelin/archive/2010/08/11/123061.html我风我风Wed, 11 Aug 2010 05:54:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/08/11/123061.htmlhttp://www.shnenglu.com/kyelin/comments/123061.htmlhttp://www.shnenglu.com/kyelin/archive/2010/08/11/123061.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/123061.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/123061.html
  下文从用SDL的编E函数开始,介绍?jin)如何用SDL在屏q上q行象素l制的基本知识,q给Z(jin)一个简单的例子?br />
  如果要在VC中用SDL库,必须在源文g头部包含以下头文Ӟ(x)

#include “SDL.h?/td>

  初始化SDL是通过SDL_Init()函数来实现的。如果初始化p|Q函数返回gؓ(f)0。函数只接受初始化对象作为参数。如果要初始化视频屏q,传入常数SDL_INIT_VIDEO作ؓ(f)参数Q初始化音频Q传入常数SDL_INIT_AUDIOQ如果同时初始化视频和音频,传入SDL_INIT_VIDEO|SDL_INIT_AUDIO。其它还有一些量可以传入作ؓ(f)参数的(如果同时传入多个量要使用|它们隔开Q:(x)

SDL_INIT_TIMER
SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_CDROM
SDL_INIT_JOYSTICK
SDL_INIT_NOPARACHUATE
SDL_INIT_EVENTTHREAD
SDL_INIT_EVERYTHING

  如果我们要初始化Q可以用如下语句:(x)

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

  如果初始化失败,则函数SDL_GetError()q回关于错误的一个字W串提示信息?br />
  当从你的C++语句q回ӞC使用SDL_Quit()q行E序的清理工作,否则׃(x)出现奇怪的现象。可以用如下语句进行描qͼ(x)

atexit(SDL_Quit);

  q样的话׃需要在main函数中每个return语句前加入SDL_Quit()?jin)?br />
  在SDL中你可以拥有多个surfaceQ每件物体都是一个surface。你可以在一个surface上进行绘图或者在其他surface上绘制另外一个surface。程序中一个surface的表C即为指向结构SDL_Surface的指针。如果要获得一个surface只要如下定义Q?br />
SDL_Surface *screen;

  如果需要对screen所指向的surface上进行绘图,你可以用函数SDL_SetVideoMode()来设|屏q分辨率Q?br />
screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

  前三个参数分别ؓ(f)屏幕宽度Q高度和屏幕上的每象素包含的位数(bits per pixel, BPP)。如果填?则SDL自动选择最合适的BPP。第四个参数用来l出某些Ҏ(gu)标志位。如果要在屏q上q行囑Şl制必M用SDL_HWSURFACE或者SDL_SWSURFACE。以下给Z(jin)一个你可以指定的标志位Q?br />
  SDL_SWSURFACE:在系l内存中创徏视频Surface

  SDL_HWSURFACE:在视频内存中创徏视频Surface

  SDL_ASYNCBLIT:允许在显Csurface上用异步更新。在单CPU机器上会(x)变慢Q但在SMPpȝ上会(x)有显著的性能提升?br />
  SDL_ANYFORMAT:一般的Q如果指定位数的bpp不可用,那么SDL׃(x)模拟使用阴媄(jing)surface。如果传入SDL_ANYFORMAT׃(x)Lq样做,q且不管色深强制使用视频surface?br />
  SDL_HWPALETTE:l予SDL特许的画盘的讉K权,使用q个标志位就不需要L使用SDL_SetColors或者SDL_SetPalette来获取所需的颜艌Ӏ?br />
  SDL_DOUBLEBUF:允许g双缓Ԍ只是和SDL_HWSURFACE一起用时比较有用。调用SDL_Flip会(x)flip整个~冲q且更新屏幕。所有的l制会(x)在当前未昄的surface上发生。如果双~冲被允许,那么SDL_Flip会(x)Ҏ(gu)个屏q进行SDL_UpdateRect操作?br />
  SDL_FULLSCREEN:SDL会(x)试使用全屏模式。如果硬件分辨率的调整由于某U情冉|法完成,那么下一个稍高的分L率将?x)被使用Qƈ且显C窗口将?x)处于一个黑色背景的中央?br />
  SDL_OPENGL:创徏一个OPENGL rendering context。用前必须已经使用SDL_GL_SetAttribute对OpenGL视频属性进行设|?br />
  SDL_OPENGLBLIT: 和上一个选项一样创Z?OPENGL rendering context, 但是允许使用正常的blitting操作?br />
  SDL_RESIZABLE; 创徏一个可伸羃大小的窗口。当用户调整H口大小Ӟ会(x)触发一个SDL_VIDEORESIZE事gQSDL_SetVideoMode会(x)使用新大作为参数再ơ被调用?br />
  SDL_NOFRAME: 如果可以的话QSDL_NOFRAME会(x)创徏Z个没有标题栏和边界修饰的H口Q全屏方式自动设|此标志位?br />
  使用SDL_HWSURFACE | SDL_DOUBLEBUFQ如果出现错误可以尝试用SDL_SWSURFACE?br />
  SDL_SetVideoMode如果操作成功Q则q回一个指向SDL_Surface的指针,否则的话q回NULL。可以用如下语句检查发生的错误Q?br />
If ( screen == NULL )
{
 printf(“Unable to set 640x480 video: %s\n? SDL_GetError());
 return 1;
}

  以上介绍?jin)如何对SDLq行初始化,下面可以开始绘制了(jin)。但是还有一些需要注意的关键地方Q首先是一些SDL使用的容易让Z生迷惑的数据cdQ?br />
Uint8 ?相当于unsigned char
Uint16 ?16?2字节) unsigned integer
Uint32 ?32?4字节) unsigned integer
Uint64 - 64?8字节) unsigned integer
Sint8 ?相当于signed char
Sint16 ?16?2字节) signed integer
Sint32 ?32?4字节) signed integer
Sint64 - 64?8字节) signed integer

  q有Q有的时候如果初始化出现错误Q没必要完全退出。例如当初始化了(jin)SDL_INIT_VIDEO而没有初始化SDL_INIT_AUDIOQ那么你可以l箋q个错误只是没有音频而已。要(g)查是否音频初始化是否成功Q可以用SDL_WasInit()函数来检查。下面是一个例子:(x)

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

  你可以在E序初始化的某些地方加入以上语句?br />
  以下是SDL介绍中进行象素绘制的语句Q可以暂时不需要完全了(jin)解其中的意思:(x)

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;
 }
}

  通过q个函数Q可以传递给surface要绘制的点的(x,y)坐标和RGB倹{?br />   同时Q由于绘制的屏幕不能同时接受两个函数的同时操作,我们需要其他两个辅助函敎ͼ用于在绘制前对屏q进行锁定,以及(qing)在绘制完成之后解除锁定。这两个工作一般由SDL_MUSTLOK(SDL_Surface *screen)和SDL_UnlockSurface(SDL_Surface *screen)完成。用如下两个自定义的函C(x)更加单:(x)

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);
 }
}

  q样Q我们可以得C个简单的ȝ序框架如下:(x)

#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;
}

  如果对该E序q行~译q行Q那么只能得C闪而过的一个黑色的H口。我们需要对H口q行l制Qƈ且对基本的键盘鼠标事件进行处理?br />
  l制的基本原理是Q先在缓冲区l制Q再一ơ性将~冲区绘制到屏幕上。这h起一ơ一个象素点在屏q上l图的方式效率更高,速度更快Q也不易出错。首先用@环在screen所指向的surface(~冲?上绘Ӟ然后调用SDL_Flip函数screen surfacel制到真实电(sh)脑屏q上。SDL_Flip函数的作用是Q在支持双缓?double-buffering)的硬件上Q徏立flipq返回。硬件将{待vertical retrace,然后在下一个视频surface blit或者执行锁定返回前交换视频~冲区。如果硬件不支持双缓Ԍ那么{同于调用SDL_UpdateRect(screen, 0, 0, 0, 0)Q即Ҏ(gu)个screen的绘制区域进行刷新?br />
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中对采用l构SDL_Event来描qCӞq用轮询的机制对事件进行处理,E序中用一个SDL_Event的实?Instance)来检查事件的发生Q?br />
SDL_Event event;

  轮询采用while循环来检查:(x)

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

  事g轮询完毕之后Q调用DrawScene(sreen)q行一ơ绘制。?br />
         本例中的源代码如下:(x)

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

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);
 }
}
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;
 }
}
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);
}

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);
 }
 int done=0;
 while(done == 0)
 {
  SDL_Event event;
  while ( SDL_PollEvent(&event) )
  {
   if ( event.type == SDL_QUIT ) { done = 1; }
   if ( event.type == SDL_KEYDOWN )
   {
    if ( event.key.keysym.sym == SDLK_ESCAPE ) { done = 1; }
   }
  }
  DrawScene(screen);
 }
 return 0;
}

  E序q行l果如下Q?br />



我风 2010-08-11 13:54 发表评论
]]>
SDL-3(安装和初步? http://www.shnenglu.com/kyelin/archive/2010/08/11/123038.html我风我风Wed, 11 Aug 2010 02:35:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/08/11/123038.htmlhttp://www.shnenglu.com/kyelin/comments/123038.htmlhttp://www.shnenglu.com/kyelin/archive/2010/08/11/123038.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/123038.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/123038.html

?

  下面我们打开Visual Studio6.0Q开发一个非常简单的例子。选择File->New,新徏一个工E,选择Win32 Application,工Egp保存为tutorial目录下,如图3所C?br />

?

  在图4中,保持默认讄Q点击Finish?br />

?

  Z(jin)使用SDLQ我们需要进行相关的讄Q选择Project->Settings...Q选择C/C++属性页Q在Category中选择Code GenerationQ在Use run-time library中选择Debug Multithreaded DLLQ如?所C?br />

?

  在Category中选择PreprocessorQ在'Additional include directories'的文本框中填?.\SDL-1.2.8\include\Q如?所C?br />

?

  选择Link属性页Q在'Object/library modules'文本框的首部增加SDLmain.lib和sdl.libQ如?所C?br />

?

  仍然是Link属性页Q选择Category中的InputQ在'Additional library path'文本框中填写..\SDL-1.2.8\lib\Q如?所C?br />

?

  q样我们完成了(jin)~程前的讄工作Q不q这是针对Debug版本的,如果要设|Release版本Q需要选择Build->Set Active Configuration,选择ReleaseQ然后再ơ如上配|一ơ?br />
下面我们正式开始编E,E:\tutorial\SDL-1.2.8\lib\SDL.dll拯到gp文g夹下Q然后给gp工程增加一个C++文gmain.cpp。如?所C?br />

?

  以下代码拷贝到main.cppq保存?br />
#include <stdlib.h>
#if defined(_MSC_VER)
#include "SDL.h"
#else
#include "SDL/SDL.h"
#endif

SDL_Surface *screen;

void render()
{
 // 独占资源Q将surface 锁定
 if (SDL_MUSTLOCK(screen))
  if (SDL_LockSurface(screen) < 0)
   return;

 // 获取当前旉Q以毫秒计时
 int tick = SDL_GetTicks();

 // 声明变量
 int i, j, yofs, ofs;

 // 对窗口进行绘?br /> yofs = 0;
 for (i = 0; i < 480; i++)
 {
  for (j = 0, ofs = yofs; j < 640; j++, ofs++)
  {
   ((unsigned int*)screen->pixels)[ofs] = i * i + j * j + tick;
  }
  yofs += screen->pitch / 4;
 }

 // 解除锁定
 if (SDL_MUSTLOCK(screen))
  SDL_UnlockSurface(screen);

 // 使用SDL对窗口进行更?br /> SDL_UpdateRect(screen, 0, 0, 640, 480);
}

// Entry point
int main(int argc, char *argv[])
{
 // 初始化SDL子系l,q里只对视频q行初始?br /> if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
 {
  fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
  exit(1);
 }

 // 注册SDL_QuitQ当退出时调用Q得退出时E序自动清理
 atexit(SDL_Quit);

 // 使用32位象素创?40x480的窗?br /> screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

 // 若失败,则退?br /> if ( screen == NULL )
 {
  fprintf(stderr, "Unable to set 640x480 video: %s\n", SDL_GetError());
  exit(1);
 }

 // d@?br /> while (1)
 {
  // Render stuff
  render();

  // SDL中的事g轮询机制
  SDL_Event event;
  while (SDL_PollEvent(&event))
  {
   //Ҏ(gu)息进行处?br />   switch (event.type)
   {
    // 如果按下某键的消息响?br />    case SDL_KEYDOWN:
     break;
     //如果某键按下后弹L(fng)消息响应
    case SDL_KEYUP:
     //若按下ESC键,则退?br />     if (event.key.keysym.sym == SDLK_ESCAPE)
      return 0;
     break;
     //退出消息响?br />    case SDL_QUIT:
     return(0);
   }
  }
 }
 return 0;
}

  对工Egpq行~译Q可以看看动态水波纹的效果了(jin):) 如图10所C?br />

?0

  如果你能够看到图10中的丽动态窗口,那么恭喜你,你可以开始O游SDL的精彩世界了(jin)。下面我们将正式开始我们的SDL之旅?br />

我风 2010-08-11 10:35 发表评论
]]>
SDL-1(?http://www.shnenglu.com/kyelin/archive/2010/08/11/123036.html我风我风Wed, 11 Aug 2010 02:30:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/08/11/123036.htmlhttp://www.shnenglu.com/kyelin/comments/123036.htmlhttp://www.shnenglu.com/kyelin/archive/2010/08/11/123036.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/123036.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/123036.htmlhttp://tech.itdb.cn/n/200603/19/n20060319_12998.shtml

  Simple DirectMedia Layer, USDLQ是一个自q跨^台的多媒体开发包Q主要通过OpenGL?D视频帧缓?framebuffer)提供寚w频、键盘、鼠标、游戏操U|(joystick)?Dg的底层访问。它被广泛的应用于MPEG回放软g、模拟器和多个著名游戏中Q如获得大奖的《文明:(x)权們֤下?Civilization: Call To Power)的LinuxUL版本。它的官方站Ҏ(gu)Qhttp://www.libsdl.org/ Q还有一个非怸性的LOGO(?)?br />



  在Win32~程中,如果要操U?D囑փQ可以选择使用GDI或者DirectDrawQ前者速度较慢Q而后者是特定针对Microsoftq_的,在非Win32q_上移植会(x)带来很大的麻?ch)。这Ӟ你可以选择使用SDL。SDL支持多种q_QLinux、Windows, BeOS, MacOS Classic, MacOS X, FreeBSD, OpenBSD, BSD/OS, Solaris, IRIX和QNXQ同时也部分支持部分其他q_QWindows CE, AmigaOS, Dreamcast, Atari, NetBSD, AIX, OSF/Tru64, RISC OS和SymbianOS。当然SDL本n是针?D囑փ~程的,如果使用?D~程Q那么需要将SDL和OpenGLl合使用?br />
  SDL是用C~写的,但是也支持C++Q同时其他多U语aQ下面给Z(jin)其他语言的SDL的开发包的相关信息:(x)

  ·Ada
   AdaSDL - http://sourceforge.net/projects/adasdl/
  ·C#
   SDL.Net - http://cs-sdl.sourceforge.net/
  ·Eiffel
   ewg - http://ewg.sourceforge.net/
  ·Erlang
   ESDL - http://www.ericsson.com/cslab/~dgud/esdl/
  ·Euphoria
   SDL_Wrap - http://www.rapideuphoria.com/sdl_wrap.zip
  ·Guile
   guile-sdl - http://sourceforge.net/projects/guile-sdl/
  ·Java
   JSDL - http://jsdl.sourceforge.net/
   sdljava - http://sdljava.sourceforge.net
  ·Lisp
   CL-SDL - http://cl-sdl.sourceforge.net/
   SDL for Corman Common Lisp - http://www.balooga.com/lisp_sdl.php3
  ·Lua
   luaSDL - http://lua-users.org/wiki/LuaModuleLuaSdl
  ·ML
   SDLML - http://www.HardcoreProcessing.com/Freeware/SDLML.html
   OCamlSDL - http://ocamlsdl.sourceforge.net/
  ·Objective C
   SDLOBJC - http://savannah.nongnu.org/projects/sdlobjc/
  ·Pascal
   SDL4Freepascal - http://sdl4fp.sourceforge.net/
   JEDI-SDL - http://www.delphi-jedi.org/Jedi:TEAM_SDL_HOME
  ·Perl
   SDLPerl - http://sdl.perl.org
  ·PHP
   PHP SDL module - http://phpsdl.sourceforge.net
  ·Pike
   Natively supported (module SDL) - http://pike.ida.liu.se/
  ·Pliant
   Pligame - http://pligame.sourceforge.net/
  ·Python
   PyGame - http://pygame.seul.org/
  ·Ruby
   Ruby/SDL - http://www.kmc.kyoto-u.ac.jp/~ohai/index.en.html
   RUDL - http://rudl.sourceforge.net




我风 2010-08-11 10:30 发表评论
]]>
SDL-2(功能)http://www.shnenglu.com/kyelin/archive/2010/08/11/123037.html我风我风Wed, 11 Aug 2010 02:30:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/08/11/123037.htmlhttp://www.shnenglu.com/kyelin/comments/123037.htmlhttp://www.shnenglu.com/kyelin/archive/2010/08/11/123037.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/123037.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/123037.html功能

  视频

  ·讄8bpp或更高的L色彩深度的视频模式。如果某个模式硬件不支持Q可以选择转化为另一模式?

  ·直接写入U性的囑փ帧缓ԌframebufferQ?

  ·用颜色键|colorkeyQ或者alpha混合属性创建用于绘囄表面(surface)?

  ·Surface的blit能自动的转化为目标格式。blit是优化过的,q能使用g加速。x86q_上有针对MMX优化q的blit?

  ·g加速的blit和fillQ填充)(j)操作Q如果硬件支持的话?

  事g

  ·提供以下事gQ?

  o 应用E序的visibility(可视?发生改变

  o 键盘输入

  o 鼠标输入

  o 用户要求的退?

  ·每种事g都能通过SDL_EventState()关闭或者打开?

  ·事gl由用户指定的过滤函数再被加入到内部的事仉列?

  ·U程安全的事仉列?br />
  音频

  ·讄8位和16位的音频Q单声道或者立体声Q如果格式硬件不支持Q可以选择转换?

  ·q立的U程执行音频部分Qƈ提供用户回调QcallbackQ机制?

  ·设计上考虑C(jin)客户定制的Y混音器,但实际上在例E中包含了(jin)一个完整的音频/音乐输出库?br />
  CD音频

  ·完整的CD音频控制API

  U程

  ·单的U程创徏API

  ·用于同步的简单的二进制信号量QsemaphoresQ?

  定时?

  ·d已流逝的毫秒数?

  ·{待指定的毫U数?

  ·讄一?0毫秒_ֺ的周期性定时器?br />
  字节序无?

  ·侦测当前pȝ的字节序

  ·快速{换数据的函数

  ·d指定字节序的数据

  下蝲

  SDL的官方下载地址为http://www.libsdl.org/download-1.2.php, 最新版本ؓ(f)1.2.8Q分行库Runtime Library和开发库Development LibraryQ用SDL开发需要下载的是后者。由于SDL支持多^台和多个开发工具如VC6、Visual Studio.NET 2003、Dev-C++{等Q所以可以根据需要选择合适自qq_版本。由于笔者采用VC6l朋友们讲解SDL的用,因此文章中只介绍?jin)VC6下的安装方式Qƈ使用?jin)一个小例子做说明。如果?zhn)使用其他的^台和工具Q请在官方网站上查找相应的说明ƈ按照要求d装用?


我风 2010-08-11 10:30 发表评论
]]>
SDL??http://www.shnenglu.com/kyelin/archive/2010/08/11/123033.html我风我风Wed, 11 Aug 2010 02:22:00 GMThttp://www.shnenglu.com/kyelin/archive/2010/08/11/123033.htmlhttp://www.shnenglu.com/kyelin/comments/123033.htmlhttp://www.shnenglu.com/kyelin/archive/2010/08/11/123033.html#Feedback0http://www.shnenglu.com/kyelin/comments/commentRss/123033.htmlhttp://www.shnenglu.com/kyelin/services/trackbacks/123033.html

什么是SDLQ?br />?Simple DirectMedia LayerQ?LGPL 许可证?/p>

免费的跨q_多媒体应用编E接?
用于游戏、游戏开发工兗模拟器、样本演C、多媒体应用{?
它能做什么?
视频、音频、事件、CDROM支持、线E、计时器、各U图象文件格式读取、快速绘图、؜韟뀁游戏杆?/p>

持、网l、MPEG解码{等Q且CPU字节序无关?

大体上与DirectX比较对应关系如下Q?/p>

SDL_Video、SDL_Image、OpenGL —?DirectDraw、Direct3D
SDL_Audio、SDL_Mixer —?DirectSound
SDL_Joystick、SDL_Base —?DirectInput
SDL_Net —?DirectPlay
SMPEG、SDL_Video、SDL_Audio、SDL_Sound、SDL_Filter —?DirectShow
字体、窗口管理等其他实用工具和大量样?
支持哪些q_Q?br />Linux 随系l安?
Win32 需一个到几个较小的DLL
BeOS
MacOS, MacOS X
其他非官方移?
可以在哪些编E语a中用?
几乎所有!SDL本n?C 写成Q有各种语言的接口。简单的函数调用Q不需要COM?/p>

个h观点Q不代表M团体和他人)(j)
ȝ来说QSDLq不怎么优秀Q但它是数的DX替代品之一。有Z(x)问ؓ(f)什么非得不用DXQ也没有非得

不用Q至懒人L希望用更的功夫做更多的 事。对大多Ch来说Q无论DX、OpenGLq是SDLQ都?/p>

低层APIQ尤其DXQ如果?zhn)_NDXQ那么恭喜,(zhn)的g知识一定也不错。留?j)的话就会(x)?C天的?/p>

戏很多都提供选项QDirect3D、OpenGL、Glideq是SoftwareQ既是说很多游戏厂商都根据需要设计了(jin)

自己的高层APIQ?底层是可以替换的。那么也许有水^高的厂商都是充分开发硬件功能才有高性能

的表玎ͼ那么我D个例子,很多2D游戏的渲染虽然用?DirectDrawQ但却是UY件在内存帧缓冲区?/p>

染,最后调用DirectDraw图象Swap到屏q。对?D游戏加今天的机器配置QGDI加直 接~冲操作?/p>

l够,需要更先进的渲染能力时p使用3D技术,q也是在DX8中DirectDraw和Direct3D都被Z3D

?DirectGraphics替换掉的原因。但最主要的是Q选择SDL意味着跨^台?/p>

回到正题。象DX一PSDL的各个部分是可以单独使用的,但必LSDL_Base。窗口消息管理方式很?/p>

董,写过Win32E序的一定还记得switch...caseQ没错SDL用就是这个,但完全可以不用它的。SDL?C

风格很浓Q就像DirectX的COM风格很浓一P用非 C c语a的h?x)更愿意装一下再用?/p>

与DX相比QSDL有更快的启动速度Q方便的调试Q调试过DXE序吗?:( Q,z的接口Q很的q行?/p>

库,当然首要的是跨^台。SDL直接支持很多媒体文g格式Q与DX比v来非常的方便。但SDL即简单直?/p>

讉K媒体层,不象DX支持那么多功能,当然也因Z是每个^台都能提供那么多功能?/p>

样例代码上说Q比起DXQSDL的样例非常短精(zhn),E序程是直U式Q效果上一点也不差。非C语言?/p>

译版本保留?jin)C的风|没有利用先进的语aҎ(gu),是个遗憾。至于帮助文Ӟl对不如DirectXQ很

多有用的信息是头文g里的注释。但毕竟 C 接口比COM单得多,看看函数名和样例也就?x)用了(jin)。但?/p>

有中文资料,不爱看英文的可能?x)头痛。可能的话大家分工翻译一下,毕竟比DX文档多?jin)?/p>

详细信息在哪里?
http://www.libsdl.org/ SDL首页

http://www.delphi-jedi.org/ Delphi接口目首页

http://jsdl.sourceforge.net/ Java接口首页

http://csgl.sourceforge.net C#接口首页

http://phpsdl.sourceforge.net php接口首页

使用SDL的游戏有哪些Q?br />http://www.libsdl.org/games.php


有个列表QM非常?



我风 2010-08-11 10:22 发表评论
]]>
þѴƬ| þþþþŹƷ| þ Ʒ| þۺƵվ| þþ99Ʒһ| ˾Ʒþһ| þ޾Ʒվ| AVþþþò| ŮƷþþ2020| þѿaëƬ| ھƷþþþӰԺ| þþþþþþþþ| þþһƷ99þþƷ88| þþƷëƬѹۿ| ˾þþƷ| Ʒþþþþ| ˾þۺij| ĻƷþþþþ3Dն| þһѲ| þۺ97ɫֱ | Ʒ˾þ˵Ӱ | þav뾫Ʒ˳| þþþþѹۿ | þۺɫһ| ޾ƷþþþþĻ | þþþƷ| ŷһþþ| ۺ޾þһƷ| 99þó˹Ʒ| þۺϳDž| Ʒþþþþþþ| ƷþþþþĻ| ˾Ʒþ޸岻 | Ժձһձþ| ٸþĻ| Ʒþþþþ| ˾þۺij| 99þ뾫Ʒϵ| 99þۺϹƷ| þ97þ97Ʒӿ| þó˾ƷƵ|