`
hereson3
  • 浏览: 160672 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Dev c++ & Sdl 同步学2

阅读更多

加载并显示图片

今天我们要做的很简单,就是绘制一个好看的背景,然后绘制一个方块在上面,你能使用

键盘来移动方块。

定义三个表面,和一个坐标

SDL_Surface *
back;


SDL_Surface *
image;


SDL_Surface *
screen;


 
int

 xpos=
0
,

ypos=
0
;


然后用下面的函数将图片加载到表面上

int

 InitImages()


{

  
back =
 SDL_LoadBMP(

"bg.bmp"
);


  
image =
 SDL_LoadBMP(

"image.bmp"
);


  
return

 0
;


}

接下来2
个函数将图片位拷贝到表面上:

int

 SDL_BlitSurface(

SDL_Surface *
src,

 SDL_Rect *
srcrect,


                        
SDL_Surface *
dst,

 SDL_Rect *
dstrect);


参数1
,原位图,参数2
,原位图矩形,参数3
,目标位图,参数4
,目标矩形
下面这个函数是我们创建的第一个DrawIMG
,忽略了参数4
,以及参数2widthheight
void

 DrawIMG(

SDL_Surface *
img,

 int

 x,

 int

 y)


{

  
SDL_Rect dest;


  
dest.

x =
 x;


  
dest.

y =
 y;


  
SDL_BlitSurface(

img,

 NULL,

 screen,

 &
dest);


}

2 drawing 函数

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


}

接下来看这个绘制屏幕的主函数

void

 DrawScene()


{

  
DrawIMG(

back,

 xpos-
2
,

 ypos-
2
,

 132
,

 132
,

 xpos-
2
,

 ypos-
2
);


  
DrawIMG(

image,

 xpos,

 ypos);


 
  
SDL_Flip(

screen);


}

剩下要做的的就在main
函数里面了,我们设置了一个uint8
的指针变量,

int main ( int argc, char * argv[])

{

  Uint8* keys;

// 标准的初始化

  if ( SDL_Init( SDL_INIT_AUDIO| SDL_INIT_VIDEO) < 0 )

  {

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

    exit( 1 );

  }

  atexit( SDL_Quit);

 

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

  }

  InitImages();

    DrawBG();

// 开始主循环,检测退出以及escape 按键.

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

      }

}

然后我们调用SDL_GetKeyState(

NULL)


得到当下的按键状态,我们之所以没有在

游戏的主循环检测方向键,是因为没有在主循环中,只有按键被按下的时候才发生,而不知道目前是否依然处于按下状态。

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

  }

// 最后退出

  return 0 ;

}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics