[QUOTE=flag]你觉得象是什么问题?[/QUOTE]我刚接触linux下编程,所以不懂,麻烦各位帮我看看是什么问题+ [ l8 P% O8 o) g+ D
程序代码
& u* ]! V. M f! c+ O7 W 4 k [6 I* `/ l4 {2 G
#include <stdio.h> " K2 |5 O+ M. A" G
#include <stdlib.h>
; G7 Q7 @" z# R#include <SDL.h>
D: R9 C4 a* j6 P$ N# u0 l#include <SDL_image.h>
\- r' p8 D! N1 |# Y#define DIR_UP 0; R/ O' W& s5 A& j0 \
#define DIR_LEFT 1. \ _6 w9 o, V! M8 V# v, v$ d9 n9 A
#define DIR_DOWN 2- m R9 q; | F) {8 s' R
#define DIR_RIGHT 3
: r/ T- f( f- C! wSDL_Surface *screen;9 y: F. m( F* _7 b% `2 h
typedef struct Sprite_t {
) @8 M# ^1 f1 e( Z! c7 m( K int width;% }3 p0 I4 M& i2 F) {6 A5 `
int height;/ y; T( F% G" R( a& k( w/ n
int x;
* B7 J) \5 p: W5 A& ~5 y$ S1 ]+ B8 y+ T int y;
) J# G" i) h9 R, N- D; b int ox;
# R D0 H+ L1 Z7 }$ A: c/ N int oy;4 U4 ?* t! r6 {' z2 e, z
int dir;3 f W1 e# V# b4 a ~6 q4 k
int subframe;
8 u6 p- i" Z1 n; N int speed;
( _, _$ O% N1 c$ K5 G int timer;
6 n+ w4 [' N: }1 t0 B2 h% _' \8 f int moving; //use to calculate subframe" b d* }2 o. _, N
SDL_Surface *image;
) C2 F3 a6 I3 ]. w/ r2 g7 x6 j}Sprite_t;% G2 s Z" Y2 g0 D4 Z( N' ~
typedef enum GameState {
1 n) S8 s/ G6 L- _2 h GAME_RUNNING,
+ I% \0 W) l* \3 E( L9 } GAME_OVER,
# n- C1 w, F: m9 R' x1 g; W% L8 S}GameState;- X' ?! j, _! A$ Z
void Init_SDL()
: u9 [+ A5 q& C{
4 v: C; }( N$ b% L S1 f6 R7 b4 e" C if ( SDL_Init( SDL_INIT_VIDEO) < 0 ) {9 f$ B0 ^- x1 g. ^
fprintf(stderr,"Can't init SDL: %s\n",SDL_GetError());
/ J: }& y$ `& ] exit(1);; h3 n$ S4 d1 k! W3 S
}
3 k/ f+ ~/ `4 W8 K) ] screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);- O: @6 u0 v6 H% _# `- f- Y
if ( screen == NULL ) {0 P/ B/ q, e7 }2 g# P
fprintf(stderr, "Error: %s\n",SDL_GetError());
- L. X- X s, ]7 h, ^' \% a3 r exit(1);6 Y/ q: S( a3 y
}
' U0 w2 P% B& d0 p: V: Z atexit(SDL_Quit);0 L/ X4 w7 u9 X& G; j
}. l. c3 Q5 b% q; H0 M
void DrawSprite(SDL_Surface *surface,Sprite_t *sprite) * ~% ]& q# r1 N" S9 t
{ I6 |+ }' [8 @9 N
SDL_Rect src_rect,des_rect;
" ~& ^& t) ?$ Q3 p8 {9 u, O, N sprite->subframe=sprite->timer/4; ( p1 Z' E( ~; Y# p
src_rect.w=des_rect.w=sprite->width;
; w+ T# Y+ g! A src_rect.h=des_rect.h=sprite->height;- y4 _- ]" S. ]4 i8 B: G
src_rect.x=sprite->subframe*sprite->width;& ]5 i2 U/ h1 k$ H" W5 d& |% v, ?
src_rect.y=sprite->dir*sprite->height;$ u& {. l ^" c' W
des_rect.x=sprite->x;
: O7 @; z, L1 g8 ~ des_rect.y=sprite->y;
) z5 j: I# m/ {- a( H //Draw sprite to new position
4 N. ^: Z2 k$ H: g! l: m( q+ r SDL_BlitSurface(sprite->image,&src_rect,surface,&des_rect);- s8 B6 A8 I, ~3 g. m: k( N
}
+ Z/ L E3 T E' xvoid ClearSprite(SDL_Surface *surface,Sprite_t *sprite) 5 ]4 V0 n+ s9 n% V0 I
{7 M' z' K5 ^2 M! C+ J* e
SDL_Rect mask;7 o+ v. Y8 i$ J: H+ L+ ?/ h
mask.w=sprite->width;3 A m! d" S1 [# |! D# V
mask.h=sprite->height;
4 V8 b# q- O3 ` mask.x=sprite->ox;
$ W& ~$ a2 p3 e1 R mask.y=sprite->oy;9 V& G# t6 d7 ]1 r0 I% {3 e9 M# B. l
//Clear sprite from the old position
9 H: X1 o# o, l" g, p SDL_FillRect(surface,&mask,SDL_MapRGB(surface->format,0,0,0));
3 ^7 y! y; E$ q: P/ _6 a}2 O% j; L9 s' F& V! J
Uint32 TimeLeft() 1 U1 o, e1 l3 z$ a
{
% c6 J4 r/ h/ u- Q# ~ static Uint32 next_time=0;) E& Q) ]2 C5 P0 Z- ]: _
Uint32 now;4 O5 a3 N! f6 w5 z6 d/ z
now=SDL_GetTicks();
+ R1 n2 X7 @2 O1 I4 e0 Z9 N2 | if(next_time<=now){
' r8 H5 h) D G next_time=now+30;
7 ~- _, {7 F/ Y6 _# W return(0); c) ^. w9 { @* \( v7 o6 Z/ C
}( G1 `, O9 g Q' S" \
return(next_time-now);% f6 j7 U- f6 U* f( _
} _' E/ x4 J- Q! I, a$ }0 ^
7 P0 B) S# m# w. }8 {
9 U$ Q- [* k! f( ?6 e& e
int main()
! R: J% m' A1 ]7 j{
8 a% _- d$ r+ M6 R9 \ p" B GameState game_state;
$ h5 i6 c' [; V% p0 g7 a, m% Y; ^- k Sprite_t tank;/ u0 H/ [1 i! _! `- O2 H/ y
SDL_Event event;% f, G3 [ C9 k- r
Init_SDL();6 H2 V& H- P8 G8 S1 Y
tank.image=IMG_Load("tank.png");
0 B* e2 U* v' G( o SDL_SetColorKey(tank.image,SDL_SRCCOLORKEY,SDL_MapRGB(tank.image->format,255,0,255));. j9 n) a6 F% u$ V0 K
tank.image=SDL_DisplayFormat(tank.image);
$ y/ h8 k# ^% Q- y, G/ v+ m game_state=GAME_RUNNING;* `1 `+ t8 V8 q0 v9 H
tank.dir=DIR_RIGHT;
" T# C- n0 V" h& {& ~: r& t' l tank.width=32;! K4 s8 J1 l+ P5 n6 b
tank.height=32;
" @5 V& \! ]" i) k* S" \. w' M tank.x=300;
5 e/ g+ v' k5 y7 [+ u/ b+ A tank.y=200;
/ ?( o/ E' h" N: U! b) f. Q tank.ox=tank.x;
7 Z/ [& X, R \/ ^$ I* h8 F* h tank.oy=tank.y;* |! L, l) B1 Z6 Z! r9 ?
tank.moving=0;
! p7 [* K4 ]8 Q O0 M% C& G tank.speed=3;5 c# u3 u; h, u. C w S7 \4 H! }
tank.timer=0;
! ?4 x U; e8 R# Y# b1 m0 U while(game_state==GAME_RUNNING){
7 ?. n; m6 f& A4 Q7 N ClearSprite(screen,&tank);7 `4 i* f4 k5 q8 N# H/ r8 o
//Get Input
& c8 x1 P" r! H f0 Q SDL_PollEvent(&event);
9 A) t6 G- H9 V% K i( t d% \ switch(event.type){
! b/ V) b t" W+ E# A2 c0 ] case SDL_KEYDOWN: " k4 h; ^% g3 v8 e' u4 O# T, K
switch(event.key.keysym.sym){3 [& Z# F' w& z& b" L
case SDLK_ESCAPE:
. u5 Q# d8 c, w. a/ K$ | game_state=GAME_OVER;* C1 u& j" _; ~' o( m/ s# U' P$ n
break;
6 K l; c+ S* m: S case SDLK_UP:
8 Q1 K* Q5 w3 n5 _ tank.dir=DIR_UP;
8 u$ Z+ f7 K6 E. Y9 k6 v# d tank.y-=tank.speed;8 J6 G2 M% ~$ @7 t
break;0 O5 w0 h1 c: h" {+ W/ m |
case SDLK_DOWN:- o% O, n" g& Z: ^ i
tank.dir=DIR_DOWN;7 ^, g- h; h% N; N6 O2 ~& @) f9 Y
tank.y+=tank.speed;1 o9 p+ z3 ]+ I, f6 v
break;
( L' U' B% W* ]/ G6 }) |! n case SDLK_LEFT:
4 J8 E- k1 i9 n$ ~ tank.dir=DIR_LEFT;
2 I. p2 K9 k1 C6 ] tank.x-=tank.speed;
& D4 G" n, \( Z; M8 a break;
& a* [: t/ d( M- z' N* O f case SDLK_RIGHT:
' K) l4 D6 \2 k4 V tank.dir=DIR_RIGHT;- ?& @/ i& E/ U; P6 r* f4 w, \
tank.x+=tank.speed;; m* r2 e: `. G8 E& \9 j" w. Z
break;
& {- S; P5 F$ y+ e default:
. F3 ]. B" q- K' u! \ break;+ {/ r4 _. u; m
}
: D8 y: \+ @+ S6 l6 L9 S: |3 e( P! F3 j case SDL_KEYUP:
( q1 B2 d. w! I) t [$ X break;
* G4 n& p6 [, u5 A! } default:1 ~% j. M2 Y8 n2 o, q8 F2 w3 o
break;& h' i2 k0 |$ }4 h1 Q; \5 [9 l
}
, s' h0 u( | s) Y8 q) A1 x( R
8 c9 j5 A* S+ b; w5 ]( E DrawSprite(screen,&tank);
( Y6 Q9 R% x% Y* m2 d5 x9 _- ? tank.ox=tank.x;
" t2 `% Y8 O0 M; v: Q tank.oy=tank.y; 7 X0 Y u. y0 L8 w4 b8 x; G$ O
SDL_UpdateRect(screen,0,0,0,0);2 `3 v% ^/ y5 ~3 k) X
SDL_Delay(TimeLeft()); ) Z1 a0 _/ R$ i9 k: h8 Q! H
tank.timer++;; o# i& I/ y& L! g
tank.timer%=8;+ @5 `0 C w4 ^) o# d* ?/ C/ ]/ I/ @
} b5 _" d" @1 L+ b
SDL_FreeSurface(tank.image);
. g4 |% Z2 e! Y- x0 P* r}