[QUOTE=flag]你觉得象是什么问题?[/QUOTE]我刚接触linux下编程,所以不懂,麻烦各位帮我看看是什么问题
& W0 Y" A) l% e程序代码
0 H1 j" C0 K7 F
( Y1 q% ]& P" f0 |9 c$ v4 T/ p#include <stdio.h>
- o* B& G2 |7 O. z2 e' @+ [0 o, e#include <stdlib.h>. R5 [- @+ \5 y# R
#include <SDL.h>, F; Q& H+ @+ j+ H
#include <SDL_image.h>
. z1 v# f& H D! g8 g#define DIR_UP 08 M/ x! o3 a! Y' r
#define DIR_LEFT 1
7 v: o" @# P4 } F7 h( I#define DIR_DOWN 2; e0 E6 Q' i( l0 o: @
#define DIR_RIGHT 3
" T W/ e( o2 k8 lSDL_Surface *screen;! f+ e( n$ R7 M4 ?
typedef struct Sprite_t {
% {- l# `; f! x. j' x' u, ~ int width;
3 e1 C9 x9 C& { int height;5 y- K% ?+ i4 X( I
int x;
9 A/ @' _5 R5 I9 L/ C int y;
. l) T; j& H# R! Q( s: `4 j. h( a int ox;
! m9 D$ f" ?5 t' l+ K1 p. |, n int oy;* m* X9 X; Y9 q3 _' n
int dir;, ?6 a7 C. b" C+ `; s o
int subframe;
2 C; d) [! B, b% J int speed;
% V) z0 V# t8 y5 k int timer;
1 K# e; X* e# b k+ E/ _& D# ? int moving; //use to calculate subframe
) O' n5 m% G" n; d6 o" t9 \3 N! f SDL_Surface *image;) w# ]; _2 I U+ ^9 U
}Sprite_t;
c# l7 H9 n% _; ]7 P: c9 {typedef enum GameState { % Q b$ d& a" X
GAME_RUNNING,) L! O9 G7 T- K
GAME_OVER,. \: I9 K* q4 X( M+ F+ o
}GameState;7 u0 F; L. ^) a% @: d) u
void Init_SDL()
+ v+ P& U4 _. K" J2 R{: p* h) @8 Z) I3 ^& f6 ^
if ( SDL_Init( SDL_INIT_VIDEO) < 0 ) {
) T7 ~9 g- j$ C fprintf(stderr,"Can't init SDL: %s\n",SDL_GetError());
& A5 h3 b% F8 M0 v. r: l exit(1);
" b$ D. G! y% C$ r$ c' N }# b& b( v) k" e$ o
screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);1 q D5 l5 N9 ~4 g# w
if ( screen == NULL ) {( C3 _! `4 H H. N
fprintf(stderr, "Error: %s\n",SDL_GetError());. m: d4 j( E( S }# D$ }8 q
exit(1);
7 i5 Q, X3 f, M2 E: q$ s( s }
, ^" w2 e$ }7 M; Q7 L i9 U atexit(SDL_Quit);
1 [3 g, D$ @* w9 [- H( q}0 t& P# ?2 h# O* _" e2 z" H0 N
void DrawSprite(SDL_Surface *surface,Sprite_t *sprite) ; g' p7 ]- L R2 q( t0 @6 C
{
* A6 S: H6 c9 W1 {% ~; G8 q SDL_Rect src_rect,des_rect;
+ C' S: O6 C- P1 S7 G3 v& q sprite->subframe=sprite->timer/4; # b$ @9 M/ U) N3 `
src_rect.w=des_rect.w=sprite->width;, c1 Z9 f& I1 P1 i" A
src_rect.h=des_rect.h=sprite->height;, u/ ]7 n, N0 C; J% ?$ a. `, F
src_rect.x=sprite->subframe*sprite->width;
* T I% |$ m0 c: O' M src_rect.y=sprite->dir*sprite->height;9 P2 d/ Y3 K4 Q% h4 V3 s
des_rect.x=sprite->x;* j) Q: j7 m6 R8 k- s: _
des_rect.y=sprite->y;
2 ^4 \9 U! q! b8 l //Draw sprite to new position + Q- A. E! Q% ?$ q7 l. x$ p2 Y1 d
SDL_BlitSurface(sprite->image,&src_rect,surface,&des_rect);
! @$ o; J& k1 p6 @0 a. ?}6 f3 ^2 V* z* ~+ ~
void ClearSprite(SDL_Surface *surface,Sprite_t *sprite)
* p0 Q8 c# q+ I; W2 d{8 b) V- F2 p* e/ c
SDL_Rect mask;- t7 [- r' ^; |" [' ?, I. n
mask.w=sprite->width;
% ~$ [- M C* S" T mask.h=sprite->height;4 t0 Z$ B; _$ b6 G* ~% z/ Z
mask.x=sprite->ox;
1 ~8 h3 S5 h0 p' Y mask.y=sprite->oy;
" H5 j. y E' h4 x //Clear sprite from the old position
. ]: A3 s3 R b; T SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,0,0,0));1 b& D6 Y% P- Q& p
}
+ F( w& V# Z( i0 sUint32 TimeLeft() / e& v# ]- A; D/ M9 H, H
{: A' x2 {( ^9 K. I, _( {
static Uint32 next_time=0;; e3 U. h5 r4 h, U
Uint32 now;
7 l: I; f3 ^0 x' Y now=SDL_GetTicks();
' B( \7 s* w6 p5 P) P* L if(next_time<=now){
0 p. e9 V- p: H4 T Z8 q, E. v next_time=now+30;
( T' v0 L1 ^+ a; z& z6 e" u return(0);
- q9 ]& m8 S! f. t: l$ j }
4 } L/ d4 J" G; L% M( q% i return(next_time-now);3 t' a7 x; y! ?0 S$ k& Y! k' f
}
+ I+ W8 y" i2 y% u
: g- _1 M8 v% A& u/ z3 X+ T, A; }% ^4 E/ l6 q
int main(): t0 A9 i2 h4 g Y! G& i% C
{) A( u& i5 b, N0 P M
GameState game_state;
( t3 Y2 y/ ]/ K5 x) I I2 G; M/ V Sprite_t tank;
' O# A0 y* m' u) S! @" v SDL_Event event;
5 h# a5 L# F( A+ k5 m) |; [4 n( e* g$ ^ Init_SDL();+ t' h1 y4 R; R1 R) n2 J
tank.image=IMG_Load("tank.png");3 ]/ j1 Y L# g" X6 s8 M: e
SDL_SetColorKey(tank.image,SDL_SRCCOLORKEY,SDL_MapRGB(tank.image->format,255,0,255));
/ ], t' N& q. ] tank.image=SDL_DisplayFormat(tank.image);
' J5 ?4 M9 G$ t s+ O0 w# Z game_state=GAME_RUNNING;, |- R6 y; A) \/ X* u
tank.dir=DIR_RIGHT;
# p, S5 M$ h( T' K4 V# r tank.width=32;
( o: [$ T$ G! t# t tank.height=32;
, _, }' D, K7 O L3 r tank.x=300; E% H. g% z" E' h/ D8 `+ S- }
tank.y=200;
, m& L; [ n- l, n+ H" Y ?* m tank.ox=tank.x;3 Q, W$ ?) b$ b9 G) }0 s) C
tank.oy=tank.y;- E' w# ~" N/ N+ c$ I* X
tank.moving=0;5 x, e, n* F! c& i) W, {) i1 B( T
tank.speed=3;
; U1 }3 X/ W8 |! X2 s8 y tank.timer=0;
5 T! e" p( ~' f f; u while(game_state==GAME_RUNNING){$ L2 p% K/ n1 J' U3 u/ G
ClearSprite(screen,&tank);( |3 G8 ]: Y: [0 U4 f
//Get Input/ K7 `7 ^7 R9 ]1 P( @# m
SDL_PollEvent(&event);
- ~, Z* _' Q: q f switch(event.type){
" R& T# I, L* `/ d case SDL_KEYDOWN: 9 W% T9 l/ f9 J3 N% C3 B
switch(event.key.keysym.sym){
k' p5 q5 j/ R8 L4 F* ?( J6 z case SDLK_ESCAPE:
" |2 Q3 W) E# e5 n7 L s1 |4 B game_state=GAME_OVER;
" T2 {( s* `# p/ v; y2 V! G4 e4 Z+ r break;! C, h5 I3 }# n% _
case SDLK_UP:& p$ F# d' k/ L1 |3 ]* `
tank.dir=DIR_UP;
" h0 A' w4 K9 O0 z6 ] K tank.y-=tank.speed;5 H7 `( l Q9 a# ~
break;7 j! B" e1 ]3 H) j
case SDLK_DOWN:( O6 T1 F# }. d! f+ N3 m
tank.dir=DIR_DOWN;* R$ j$ a. k. u: k7 d% x
tank.y+=tank.speed;
+ n5 i4 [7 n& d4 V5 g break;
" a* O! u% i0 V; }9 j' t# f" B- T& A1 s case SDLK_LEFT:& J2 ?4 F; Z. `! F! T. F z) C
tank.dir=DIR_LEFT;1 Y5 K% Y& @. m5 T
tank.x-=tank.speed;8 }8 K: j, ]( r" N0 \# ^; I
break;3 Y$ [: X! ?/ r. Z- m" T) D( ?
case SDLK_RIGHT:& H% ]7 o4 ?& M' `2 G: C& C: p
tank.dir=DIR_RIGHT;" S; W, ?" |$ h/ O ^7 y
tank.x+=tank.speed;
* R$ Z$ ?1 ], s# P, | break;0 d- x# R2 b: {! n& x+ b/ @
default:
2 q$ G8 v" e* k' o( l/ U4 b break;/ g. g) T0 F5 A0 }; u0 g c1 P
}
% d- c$ C9 F9 _* i) E. d case SDL_KEYUP:
" u) `& q# F C0 } break;+ {7 ^& g! r# G8 }
default:
" M. `9 X8 i# H' o& d) x break; ^4 ^: h' J ~' Y0 h4 z) W
}1 x: W. @; ?# N! v( I" D% x
3 P! S' I1 f; { DrawSprite(screen,&tank);
+ u( t- z4 z8 t' R* b$ u9 \ tank.ox=tank.x;
/ _' q" X; t8 X x tank.oy=tank.y;
9 q5 T" y; W, q SDL_UpdateRect(screen,0,0,0,0);" U3 r% D9 r7 ]/ x$ l3 x
SDL_Delay(TimeLeft());
; I6 X+ u1 I3 z$ R$ s5 z# ?+ K, v tank.timer++;
* `" E+ Q' W- |3 r tank.timer%=8;$ i8 ^% \4 f% j
}8 k* G1 F4 c; W2 O3 ~% T# _5 k
SDL_FreeSurface(tank.image);
+ X! Y- W3 _5 Q3 g4 {, |$ N}