`
hereson3
  • 浏览: 163017 次
  • 性别: 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 ;

}


分享到:
评论

相关推荐

    Dev-C++ 开源软件便携版

    **Dev-C++ 开源软件便携版** Dev-C++ 是一款免费且开源的集成开发环境(IDE),专为C和C++编程语言设计。这款软件的便携版本允许用户将其存储在USB驱动器等移动设备上,无需在目标计算机上进行安装即可使用,非常...

    WINDOWS SDL2库

    在开发过程中,你可能会遇到各种问题,如内存管理、性能优化、图形渲染、多线程同步等,这些问题都可以通过查阅SDL2的官方文档、在线资源或社区论坛来解决。总的来说,SDL2是一个强大的工具,可以帮助开发者在...

    Ubuntu下实现SDL2简易YUV视频播放器

    这个过程中,你不仅会学到如何使用SDL2库,还会接触到视频编码、色彩空间转换以及多媒体数据处理等概念。随着对SDL2的进一步探索,你还可以添加更多功能,如音轨支持、播放速度控制以及更复杂的用户界面。

    俄罗斯方块 C++ 版(单人+双人游戏).rar

    在C++中实现俄罗斯方块,开发者需要掌握基本的图形界面编程,通常会使用到如SDL(Simple DirectMedia Layer)或SFML(Simple and Fast Multimedia Library)这样的库来创建窗口和绘制图形。在这个模式下,程序会生成...

    C++打造流星雨特效源代码

    此外,考虑到"带有背景音乐"这一特点,项目可能包含了音频处理,这可能需要利用第三方库如SDL_mixer来播放背景音乐,实现声音与视觉效果的同步。 在程序结构上,一般会有一个主循环(main loop)来处理用户输入和...

    C++编写的射击游戏

    5. 声音处理:C++可以通过OpenAL或SDL Mixer等库来集成声音效果,提供游戏的音频反馈。 6. 状态管理:射击游戏往往包含多个游戏状态(如主菜单、游戏进行中、暂停、结束等)。C++的类和对象可以用来组织和管理这些...

    Dev-Cpp.5.10.TDM-GCC.4.8.1.Setup

    Dev-Cpp是一款经典的开源C++集成开发环境,特别适合初学者和专业开发者使用。这个软件包的名称"Dev-Cpp.5.10.TDM-GCC.4.8.1.Setup"表明它是一个安装程序,版本为5.10,内嵌了TDM-GCC编译器版本4.8.1。TDM-GCC是GCC...

    QT嵌入sdl2播放yuv文件

    在本文中,我们将深入探讨如何在C++的QT框架中嵌入SDL2库来播放YUV格式的视频文件。这是一项技术性强且实用的任务,它结合了多种编程技术和媒体处理知识。 首先,让我们理解一下涉及的技术术语: 1. **QT**:QT是...

    QT+SDL+OPENGL

    对于Ubuntu等Linux系统,可以通过包管理器安装,如`sudo apt-get install libqt5svg5-dev libsdl2-dev libglu1-mesa-dev`。 2. **创建QT项目**:使用QT Creator创建一个新的QT项目,选择C++作为编程语言。 3. **...

    用C++实现局域网聊天系统

    【标题】"用C++实现局域网聊天系统"揭示了这个项目的核心是利用C++编程语言构建一个能够在局域网环境下运行的聊天系统。在局域网内,多个用户可以通过该系统实现实时交流、文件共享以及多媒体功能,如音乐播放。C++...

    c++完成的飞机大战游戏

    在图形渲染方面,虽然C++本身并不支持图形库,但可以借助第三方库如SDL(Simple DirectMedia Layer)或SFML(Simple and Fast Multimedia Library)来处理。这些库提供了图形绘制、音频播放、事件处理等功能,使得...

    ubuntu下使用SDL和FFmpeg进行播放视频文件和实时流媒体

    下面是一个简单的C++示例,展示了如何使用SDL和FFmpeg播放视频文件: ```cpp #include #include #include #include &lt;SDL2/SDL.h&gt; // 省略初始化、打开文件、获取流等步骤 // 创建SDL渲染上下文 SDL_Init(SDL_...

    泡泡糖_泡泡堂_DEVC游戏_

    2. **DEVC++ IDE**:DEVC++是Bloodshed Software开发的一款免费、开源的C++集成开发环境,它包含MinGW编译器,可以方便地进行代码编写、编译和调试。在本项目中,DEVC++用于编辑源代码并构建游戏程序。 3. **游戏...

    Dev-cpp5.4.0及API帮助文档.rar

    Dev-C++是一款轻量级的C++集成开发环境(IDE),特别适合初学者学习和使用。这个压缩包“Dev-cpp5.4.0及API帮助文档.rar”包含的是Dev-C++ 5.4.0版本及其相关的API帮助文档,为用户提供了完整的编程工具和丰富的参考...

    ffmpeg+sdl.rar

    FFmpeg和SDL是两个在音视频处理领域广泛应用的开源库。FFmpeg是一个强大的跨平台工具...通过学习和使用这个项目,你可以深入理解FFmpeg和SDL的工作原理,以及如何在C/C++环境中整合这两个库来实现自己的多媒体应用。

    双人游戏代码

    6. **网络同步**(如果适用):虽然描述中没有明确指出,但如果是网络双人游戏,还需要处理网络同步问题。这可能涉及到使用TCP或UDP协议进行数据传输,确保两个玩家的状态保持一致。 在提供的压缩包文件"双人战斗...

    PyPI 官网下载 | pycsdl2-2.0.0.0.dev5.tar.gz

    `pycsdl2`使得Python程序员可以方便地利用SDL2的功能,而无需直接编写C或C++代码。 资源的全名`pycsdl2-2.0.0.0.dev5.tar.gz`揭示了一些关键信息。`2.0.0.0.dev5`表明这是pycsdl2的一个开发版本,版本号中的`dev`...

    ffmpeg_dev_packet.zip

    ffplay 是 FFmpeg 提供的一个简单播放器,基于 SDL 库构建。它能够播放各种音频和视频文件,同时提供了基本的播放控制功能,如暂停、快进、快退等。ffplay 的源代码是学习 FFmpeg 播放机制的好材料,开发者可以通过...

    Qt 使用ffmpeg库打开usb摄像头

    2. **打开摄像头**:使用ffmpeg的`avdevice_open_input`函数打开USB摄像头,提供设备名或URL(通常为`/dev/video0`或`rtsp://&lt;ip&gt;:&lt;port&gt;`)。 3. **配置视频流**:设置解码器上下文和帧率,使用`avformat_find_...

    V4L.rar_v4l

    在C++中,要创建一个V4L视频采集程序,首先要打开设备文件,通常位于`/dev/video0`或`/dev/videoN`(N代表设备编号)。使用`open`函数打开设备,并确保有适当的访问权限。接着,通过`ioctl`调用来获取设备信息,如...

Global site tag (gtag.js) - Google Analytics