LinuxÒÁµéÔ°ÂÛ̳'s Archiver

chenrenjin ·¢±íÓÚ 2006-12-20 19:16

SDLÎÊÌâ

ÎÒ¸Õ½Ó´¥linuxϱà³Ì£¬ËùÒÔ²»¶®£¬Âé·³¸÷λ°ïÎÒ¿´¿´ÊÇʲôÎÊÌâf lZu!fX
³ÌÐò´úÂë
OU u S$w\1K O*|;q/y$^` j
#include <stdio.h> 1^^eb5n [
#include <stdlib.h>2P.^8{NI!KY
#include <SDL.h>
5r(l*Kt)q9MOF)Z&n3|.I(^ #include <SDL_image.h>
6EF5\*[4kx y #define DIR_UP 0
_l z#Px R+l #define DIR_LEFT 17rZ!oP$fft&r
#define DIR_DOWN 2
?(}4VW"PwjExD #define DIR_RIGHT 3Y ekq*M/Bj)D z$D
SDL_Surface *screen;
#F,w$Y+vM OFaj1q typedef struct Sprite_t {
)[AUH G4~*b int width;
;M2@] O_eX int height;%D3H"fr:}
int x;;O uE8G4OHF
int y;
,oG e HJ._KIP int ox;
7ZJ8Y%C,Y%IX int oy;C|q5A"F3F&R$g$L3R;D
int dir;
]e,k2~IZq(w/B"^ int subframe;C|WM1O g
int speed;
W;cs+CipV@ int timer;
eTw*Ku A int moving; //use to calculate subframe
i1[9P Mm/Og SDL_Surface *image;
Q&U$C%W)O s*Xm }Sprite_t;
!PN!PTO#]f typedef enum GameState {
1`L6` a-h7}I5p%W GAME_RUNNING,
8M%{"[2VWVj GAME_OVER,fzm4t'VF/s
}GameState;E'O8]Y m
void Init_SDL() -u3oD!r7x m#w&YU
{h7D2yU"W/U\O
if ( SDL_Init( SDL_INIT_VIDEO) < 0 ) {{+_g@4@:n$b4? s
fprintf(stderr,"Can't init SDL: %s\n",SDL_GetError());
Vz c!Y;eNU D exit(1);
]^JX(M-Z*XT }
} }JO(nb n5| screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);9i@DG ^
if ( screen == NULL ) {)Uv+`:IAp F }+g
fprintf(stderr, "Error: %s\n",SDL_GetError());(U(qT7?Jq6KV l:D [
exit(1);
B-H H#Af/D b }1G1pT,b1F
atexit(SDL_Quit);
H(Ev/yXa#YjK-K%A3] }
6W M | r^j B void DrawSprite(SDL_Surface *surface,Sprite_t *sprite)
9cr7C:A7{2rf8x h*r)K3l/X {
H3Ff0h I.j SDL_Rect src_rect,des_rect;xTB4@9E7Qc5K#m
sprite->subframe=sprite->timer/4;
$OkU{ ht2g src_rect.w=des_rect.w=sprite->width;vKS ^I!N8P {
src_rect.h=des_rect.h=sprite->height;2kIa V(~%m!VH`
src_rect.x=sprite->subframe*sprite->width;
/|6a7Ao[+J src_rect.y=sprite->dir*sprite->height;
W*tyC_vZ des_rect.x=sprite->x;
-k,Rpn AE$z2M des_rect.y=sprite->y; Y!Sf5_2u^7`
//Draw sprite to new position
v"`#k4P$}4L SDL_BlitSurface(sprite->image,&src_rect,surface,&des_rect);
"a;v*Je#}y }
k9A&l,Ja:g void ClearSprite(SDL_Surface *surface,Sprite_t *sprite) bf1J&lm W$R
{!\Q#{j \ty
SDL_Rect mask;-WP/d!V3MK5|
mask.w=sprite->width;
w7XT5\:{ mask.h=sprite->height;
8@5_'m;jac)i,~ mask.x=sprite->ox;
,X(Z)q*@Bk mask.y=sprite->oy;/\%S:R7X4M ?F-p/q
//Clear sprite from the old positions0J ?/|J:O\ e
SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,0,0,0));(gB![R.i9K"[
}
'IsEk0\ t Uint32 TimeLeft() 9O'pH&^HY
{Li:l"Vt,se)ms
static Uint32 next_time=0;HC%Rzm!?~m9T$\
Uint32 now;p&T8B_Pg;U
now=SDL_GetTicks();
;aI R.RI if(next_time<=now){
W5`@I!y&w:} next_time=now+30;
4bg u~K6w return(0);
7u&i;g ej~ }
-N9ew1T:AU return(next_time-now);
l-j0^2qorj }
6X8G/Fc6eX&f9d
/U(?'[&_-CA;o-J?
V`Sx:u\b int main()-{"THH#lg w9q
{
8zh8US)M TB GameState game_state;GG` ?1iy Sf~
Sprite_t tank;
;{0XH u yu+c+LB SDL_Event event;
I4klp4e:?/d$X Init_SDL(); P!iEW lR]L
tank.image=IMG_Load("tank.png");
4[ YYS4k0rb[)m SDL_SetColorKey(tank.image,SDL_SRCCOLORKEY,SDL_MapRGB(tank.image->format,255,0,255));N0fTZt&@ t
tank.image=SDL_DisplayFormat(tank.image);1O.Wa@ |^JJ&JS{
game_state=GAME_RUNNING;
8d9M] f5}+C7u!g&i tank.dir=DIR_RIGHT;
q1jv8q1rDJK~#H tank.width=32;Gp/n$v!V(ne7NE
tank.height=32;
rR9V-Z IQN&k"?*_ V*w1~ tank.x=300;"bZ,TG1mlM
tank.y=200;
(O1UW%a HvE tank.ox=tank.x;
[~.}Ca:g+T tank.oy=tank.y;
#~J} js,X;u4C'k9Z1Js tank.moving=0;9r!u|%NN$M}'Q$M
tank.speed=3;,x u(KUn
tank.timer=0;$bPZ_xn4{
while(game_state==GAME_RUNNING){
2T GebT1Z ClearSprite(screen,&tank);u2e8L0_ F2o rT
//Get Input
y6Z!uaM1{ SDL_PollEvent(&event);
O;}Ku^7XB!I| switch(event.type){
K5Q3j2v1[4mdlgu case SDL_KEYDOWN: ,Cq'sz,D#u_
switch(event.key.keysym.sym){
F {$D#~3k$rH(I case SDLK_ESCAPE:
,MV0FT\ J"O game_state=GAME_OVER;:P9^@|3RQ;y~ c
break;
yniZ~c+_p \f3B#I case SDLK_UP:
h6??7f&o)qB tank.dir=DIR_UP;a|B$H8di
tank.y-=tank.speed;
@8XlfxH break;,~5b'L-XE/S
case SDLK_DOWN:
eM9Aqk*F tank.dir=DIR_DOWN;-V7v e1\ |-u
tank.y+=tank.speed;7dU e} {wZ'nD:T
break;
M"cu,L6U;P case SDLK_LEFT:[1H(xI6bwH4N
tank.dir=DIR_LEFT;
'KoV gO-rm:B8X tank.x-=tank.speed;
D%FeKbn5N'h0c break;
o;m;EG:SPF R case SDLK_RIGHT:
ac1M3Wqs tank.dir=DIR_RIGHT;bL`a7c M
tank.x+=tank.speed;
EDC~r8d)d#A break;
v ^7H?,|:K*OZ @i,\ default:n#s8b9R ^0I~3i+Gc7D*L$o
break;1yI? p"} \N P }n
},_*K-]^3H#r.v%l0{Ps ^
case SDL_KEYUP: #A Tt-o{%J1K2P
break;
1e#Qn NCZ default: Zj(f"N ~D6^,T
break;3@r;ui;[])T \$K
}
"\;A$E+v9Z n0M d ?.kO1S
DrawSprite(screen,&tank);
8a.w,ox6jF%W tank.ox=tank.x;
N7J:F.]r*gj Q tank.oy=tank.y; 'Ez M @[
SDL_UpdateRect(screen,0,0,0,0);
$ZwvNlYs SDL_Delay(TimeLeft());
E%MP c,Y4mV4@ tank.timer++;ZV#| ]W$zo ^*CE:W
tank.timer%=8;
*|s$L x*]w#y }
9OAH&\2R!| |_ SDL_FreeSurface(tank.image);
aJG l-e?5T I }
.}q)~ uA6k G4N
:d*al)?o%}pa(L ±àÒëµÄʱºòÌáʾ
FCrq bM /tmp/ccCxlEey.o(.text+0xlf8):in function 'main';
$HVw1^p test.c:undefined reference to 'IMG_Load'
F5TlkgR collect2:ld ·µ»Ø 1
~ro)B6viS ÊDz»ÊÇtank.image=IMG_Load("tank.png");Õâ¾äÓÐÎÊÌ⣿
M/]6\K}2Q kHG Çë¸÷λָµãÒÔÏÂÎÒ¸ÃÔõô¸Ä£¬Ð»Ð»

chayedan ·¢±íÓÚ 2007-3-9 17:07

ÊǸö̹¿ËÓÎÏ·³ÌÐò°É£¬IMG_Load£¨£©º¯Êý¶¨ÒåÁËûÓУ¿ºÃÏñÊÇû¶¨Òå°¡

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.