用SDL在Linux实现图像的移动

2 views
Skip to first unread message

benegg

unread,
May 16, 2009, 9:12:13 AM5/16/09
to online_game_dev
http://www.benegg.com/?p=28

SDL(Simple DirectMedia Layer)是一套很底层的图形API, 支持Linux, unix, *BSD, MacOS,
Win32 and BeOS等平台. 由曾任暴雪公司lead software engineer的Sam Lantinga于1998年创建.

下面, 我在Linux用C语言和SDL编写一个移动图像的程序. 移动图像是2D游戏的基础. 因为SDL也支持Windows, 所以在
cygwin下可直接编译运行.

首先. 你需要安装SDL, 也就是下面的包 libsdl, libsdl-dev, libsdl-image, libsdl-image-
dev. libsdl-image是一套操作图形文件的的库, 使用它, 你只需要一个函数就能把png, jpg, bmp, gif等文件读入内
存, 而且支持png的透明键.

下面是程序:

//author: ideawu.net
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"

#define TICK_INTERVAL 15

// http://www.benegg.com/?p=28
int main(int argc, char *argv[]){
SDL_Surface *screen;
SDL_Surface *image;
SDL_Event event;
SDL_Rect r = {0,0,0,0};
int x=0,y=0;
//使用的图像文件名, 放在当前目录下. 你可以使用png,jpg,bmp,等格式, SDL支持它们.
char *file_name = "fish.png";
int timepass=0, timeold=0;

if(SDL_Init(SDL_INIT_VIDEO) < 0){
printf("Could not initializing SDL: %s.\n",SDL_GetError());
exit(-1);
}
atexit(SDL_Quit);
screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|
SDL_DOUBLEBUF);
if(screen == NULL){
fprintf(stderr, "Couldn't set 800x600x32 video mode: %s\n",
SDL_GetError());
exit(1);
}

image = IMG_Load(file_name);
if (image == NULL) {
fprintf(stderr, "Couldn't load %s: %s\n", file_name,
SDL_GetError());
return 1;
}
while(1){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_MOUSEMOTION:
x = event.motion.x; y = event.motion.y;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym){
case SDLK_UP:
y -= 4;
break;
case SDLK_DOWN:
y += 4;
break;
case SDLK_LEFT:
x -= 4;
break;
case SDLK_RIGHT:
x += 4;
break;
}
break;
case SDL_QUIT:
exit(0);
break;
}
if(x < -image->w + 2) x = -image->w + 2;
if(y < -image->h + 2) y = -image->h + 2;
if(x > screen->w + image->w - 2) x = screen->w + image->w
- 2;
if(y > screen->h + image->h - 2) y = screen->h + image->h
- 2;
r.x = x;
r.y = y;

timeold = SDL_GetTicks();

SDL_FillRect(screen, NULL, 0);
if(SDL_BlitSurface(image, NULL, screen, &r) < 0)
fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError
());
SDL_Flip(screen);
timepass = SDL_GetTicks() - timeold;
//printf("%d ", timepass);
if(timepass < TICK_INTERVAL){
//ideawu.net: SDL_Delay(TICK_INTERVAL - timepass);
}
}
}

return 1;
}

使用命令: gcc filename.c -lSDL_image -lSDL 编译. 然后 ./a.out 运行, 确保当前目录下有一个名为
fish.png的文件.
----------------
http://www.benegg.com/?p=28
Reply all
Reply to author
Forward
0 new messages