注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Nihui's Blog

nihui的私人空间和日志

 
 
 

日志

 
 

SDL 简单入门  

2010-06-16 22:22:35|  分类: 工作側記 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

参考资料来源于http://lazyfoo.net/http://libsdl.org/

—— 2009 级面向对象程序设计课程项目指导

nihui

2010年6月17日

 


建立
/ 配置和编译 SDL 项目< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

http://www.libsdl.org/download-1.2.php 下载SDL-devel-1.2.**-VC8.zip

http://www.libsdl.org/projects/SDL_image/ 下载 SDL_image-devel-1.2.**-VC.zip(图像支持)

http://www.libsdl.org/projects/SDL_ttf/ 下载SDL_ttf-devel-2.0.**-VC8.zip(矢量字体支持)

http://www.libsdl.org/projects/SDL_mixer/ 下载 SDL_mixer-devel-1.2.**-VC.zip(混音器支持)

解压缩,工具->选项,添加包含文件的路径(xxxx/include)、库文件的路径(xxxx/lib)

SDL 简单入门 - nihui - Nihuis Blog

 

xxxx/lib 目录里的dll 文件复制入 C:\WINDOWS\SYSTEM32 或者项目中的 debug/release 文件夹中。

新建 Visual C++ Win32 控制台应用程序项目,应用程序类型=>控制台应用程序;附加选项=>空项目。

SDL 简单入门 - nihui - Nihuis Blog

 

新建 C++ 源代码文件,main.cpp

#include "SDL.h"

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

{

    SDL_Init( SDL_INIT_EVERYTHING );

    SDL_Quit();

    return 0;   

}

SDL 简单入门 - nihui - Nihuis Blog

 
SDL 简单入门 - nihui - Nihuis Blog
 
SDL 简单入门 - nihui - Nihuis Blog
 
SDL 简单入门 - nihui - Nihuis Blog
  


显示图片
/ 文字

SDL 简单入门 - nihui - Nihuis Blog
SDL 简单入门 - nihui - Nihuis Blog
  

图片 -> SDL_Surface

#include "SDL_image.h"

SDL_Surface* image2surface( std::string filename )

{

    SDL_Surface* raw_surface = IMG_Load( filename.c_str() );

    if ( !raw_surface )

       return NULL;

    SDL_Surface* image_surface = SDL_DisplayFormat( surface );

    SDL_FreeSurface( raw_surface );

return image_surface;

}

 

SDL_Surface* image_surface = image2surface( "xyz.png" );

 

文字 -> SDL_Surface

#include "SDL_ttf.h"

程序开头处TTF_Init();

程序结束处TTF_Quit();

 

TTF_Font* font = TTF_OpenFont( "simsun.ttc", 28 );

SDL_Color textColor = { 255, 255, 255 };

SDL_Surface* text_surface = TTF_RenderText_Solid( font, "My text to show you..", textColor );

TTF_CloseFont( font );

SDL 简单入门 - nihui - Nihuis Blog

 

SDL_FreeSurface( image_surface );

SDL_FreeSurface( text_surface );


播放声音

#include "SDL_mixer.h"

程序开头处Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 );///频率/格式/混音/采样

程序结束处Mix_CloseAudio();

 

/// 声效播放

Mix_Chunk* effect = Mix_LoadWAV( "shot.wav" );

Mix_PlayChannel( -1, effect, 0 );/// 自动声道/声效/循环次数(0为一次)

 

/// 音乐播放

Mix_Music* music = Mix_LoadMUS( "bgmusic.wav" );

Mix_PlayMusic( music, -1 );/// 音乐/循环次数(-1为永远循环)

Mix_HaltMusic();

Mix_ResumeMusic();

Mix_PauseMusic();

 

if ( Mix_PlayingMusic() == 1 )

    /// 音乐正在播放

else

    /// 音乐没有播放

if ( Mix_PausedMusic() == 1 )

    /// 音乐已经暂停

else

    /// 音乐未被暂停

Mix_FreeChunk( effect );

Mix_FreeMusic( music );


游戏主循环
/ fps / 定时器

bool running = true;

while ( running ) {

       /* events part

        * handle key input

        */

 

       /* logic part

        * move the objects / collision

        * change game variables

        */

 

       /* rendering part

        * show all the objects

        * update screen

        */

}

游戏主循环 => 死循环?

fps —— frame per second,每秒帧数,每次游戏主循环即一帧

固定 fps,稳定游戏运行速度(ps: 变速齿轮的原理——修改 fps…)

 

假如 fps 固定为 30,那么 1 秒钟只允许循环 30 次,每次循环应该固定为 1000/30毫秒

可行的方案:记录 /*event part*/ 开始前的时间,记录 /*rendering part*/ 结束后的时间,两者相减得到时间差 ticks,如果 ticks <1000/30毫秒,那么 SDL_Delay(1000/30-ticks);

 

#define FPS 30

bool running = true;

int frame_begin, frame_end;

while ( running ) {

       frame_begin = SDL_GetTicks();

       /* events part */

       /* logic part */

       /* rendering part */

       frame_end = SDL_GetTicks();

       int ticks = frame_end - frame_begin;

       if ( ticks < 1000/FPS )

               SDL_Delay( 1000/FPS - ticks );

}

http://lazyfoo.net/SDL_tutorials/lesson13/index.php   ? 定时器


键盘事件

事件引导后续对策和后续逻辑——获取事件->判断事件类型->按事件内容抉择

 

按键事件驱动的逻辑

SDL_Event event;

if ( SDL_PollEvent( &event ) ) {

       switch ( event.type ) {

               case SDL_QUIT:

running = false; break;

case SDL_KEYDOWN: {

                      switch ( event.key.keysym.sym ) {

                            case SDLK_UP: /**/; break;

                            case SDLK_DOWN: /**/; break;

                            case SDLK_a: /**/; break;

                            case SDLK_b: /**/; break;

                      }

}

       }

}

 

按键状态驱动的逻辑

Uint8* keystates = SDL_GetKeyState( NULL );

if ( keystates[ SDLK_UP ] )

        /// do something if up array is pressed

else if ( keystates[ SDLK_DOWN ] )

        /// do something if down array is pressed

else if ( keystates[ SDLK_a ] )

        /// do something if A is pressed

 

SDLK_*** 完整定义于SDL-1.2.**/docs/html/sdlkey.html


移动

说到底就是在一帧之后改变对象显示的位置

fps 达到 24 以上后,人的视觉就会认为是对象正在移动,而非跳跃。

SDL_BlitSurface 的最后一个参数决定了显示位置,所以每次循环都改一下这个参数就能实现移动。

 

SDL_Surface* image = image2surface( "xyz.png " );

SDL_Rect pos;

pos.x = 0;

pos.y = 0;

while ( running ) {

    /* events part begins here */

    /* logic part begins here */

    pos.x = pos.x + 1;

    /* rendering part begins here */

    SDL_BlitSurface( image, NULL, screen, &pos );

SDL_Flip( screen );

}

SDL_FreeSurface( image );


碰撞

SDL 简单入门 - nihui - Nihuis Blog
 

/* logic part begins from here */

a_left = A.x;

a_right = A.x + A.w;

a_top = A.y;

a_bottom = A.y + A.h;

b_left = B.x;

b_right = B.x + B.w;

b_top = B.y;

b_bottom = B.y + B.h;

if ( a_top <= b_bottom && a_bottom >= b_top

    && a_left <= b_right && a_right >= b_left ) {

    /// collosion here between A and B

}

 

 

  

 

 

 

  评论这张
 
阅读(4303)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017