1 /*
2 * GNUjump
3 * =======
4 *
5 * Copyright (C) 2005-2008, Juan Pedro Bolivar Puente
6 *
7 * GNUjump is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * GNUjump is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include <stdio.h>
22
23 #include "gnujump.h"
24 #include "sprite.h"
25 #include "tools.h"
26
27 extern SDL_Surface *screen;
28 extern L_gblOptions gblOps;
29
30 L_spriteDataRot *
loadSpriteDataRot(char * filename,int sides,char * path)31 loadSpriteDataRot (char *filename, int sides, char *path)
32 {
33 FILE *tfile;
34 L_spriteDataRot *sprite = NULL;
35 char fname[MAX_CHAR];
36 int i;
37
38 if ((tfile = fopen (filename, "r")) == NULL)
39 {
40 fprintf (stderr, "ERROR: Could not load sprite file: %s", filename);
41 return NULL;
42 }
43 if ((sprite = malloc (sizeof (L_spriteDataRot))) == NULL)
44 {
45 return NULL;
46 }
47 /*checks the number of frames... */
48 sprite->nFrames = getValue_int (tfile, "frames");
49 sprite->sides = sides;
50 sprite->pic = NULL;
51 sprite->time = NULL;
52
53 /* Allocate memory for the images and the time data. */
54 sprite->pic =
55 (JPB_surfaceRot **) calloc ((sprite->nFrames * sprite->sides),
56 sizeof (JPB_surfaceRot *));
57 sprite->time = malloc (sprite->nFrames * sizeof (float));
58
59 for (i = 0; i < sprite->nFrames; i++)
60 {
61 /*and loads the pic and time of each frame... */
62 getValue_str (tfile, "pic", fname, path);
63 sprite->pic[i + (RIGHT * sprite->nFrames)] =
64 JPB_LoadImgRot (fname, gblOps.useGL, 1, 0, 0);
65
66 /*Loads the surface of the picture looking to the inverse side. */
67 if (sides > 1)
68 sprite->pic[i + (LEFT * sprite->nFrames)] =
69 JPB_LoadImgRot (fname, gblOps.useGL, 1, 0, 1);
70 sprite->time[i] = getValue_float (tfile, "time");
71 }
72
73 fclose (tfile);
74 return sprite;
75 }
76
77 L_spriteData *
loadSpriteData(char * filename,int sides,char * path)78 loadSpriteData (char *filename, int sides, char *path)
79 {
80 FILE *tfile;
81 L_spriteData *sprite = NULL;
82 char fname[MAX_CHAR];
83 int i;
84
85 if ((tfile = fopen (filename, "r")) == NULL)
86 {
87 fprintf (stderr, "ERROR: Could not load sprite file: %s", filename);
88 return NULL;
89 }
90 if ((sprite = malloc (sizeof (L_spriteData))) == NULL)
91 {
92 return NULL;
93 }
94 /*checks the number of frames... */
95 sprite->nFrames = getValue_int (tfile, "frames");
96 sprite->sides = sides;
97 //Allocate memory for the images and the time data.
98 sprite->pic =
99 malloc (sprite->nFrames * sprite->sides * sizeof (JPB_surface *));
100 sprite->time = malloc (sprite->nFrames * sizeof (float));
101
102 for (i = 0; i < sprite->nFrames; i++)
103 {
104 /*and loads the pic and time of each frame... */
105 getValue_str (tfile, "pic", fname, path);
106 sprite->pic[i + LEFT * sprite->nFrames] =
107 JPB_LoadImg (fname, gblOps.useGL, 1, 0, 0);
108
109 /*Loads the surface of the picture looking to the inverse side. */
110 if (sprite->sides > 1)
111 sprite->pic[i + RIGHT * sprite->nFrames] =
112 JPB_LoadImg (fname, gblOps.useGL, 1, 0, 1);
113
114 sprite->time[i] = getValue_float (tfile, "time");
115 }
116
117 fclose (tfile);
118 return sprite;
119 }
120
121 int
animateSprite(L_spriteCtl * sprite,float dt)122 animateSprite (L_spriteCtl * sprite, float dt)
123 {
124 sprite->elpTime += dt;
125 if (sprite->elpTime >= sprite->sdata->time[sprite->frame])
126 {
127 sprite->elpTime -= sprite->sdata->time[sprite->frame];
128 sprite->frame += 1;
129 if (sprite->frame >= sprite->sdata->nFrames)
130 {
131 sprite->frame = 0;
132 return TRUE;
133 }
134 }
135 return FALSE;
136 }
137
138 int
animateSpriteRot(L_spriteCtlRot * sprite,float dt)139 animateSpriteRot (L_spriteCtlRot * sprite, float dt)
140 {
141 sprite->elpTime += dt;
142 if (sprite->elpTime >= sprite->sdata->time[sprite->frame])
143 {
144 sprite->elpTime -= sprite->sdata->time[sprite->frame];
145 sprite->frame += 1;
146 if (sprite->frame >= sprite->sdata->nFrames)
147 {
148 sprite->frame = 0;
149 return TRUE;
150 }
151 }
152 return FALSE;
153 }
154
155 void
printSprite(L_spriteCtl * sprite,SDL_Rect * src_r,SDL_Rect * dest_r,int side)156 printSprite (L_spriteCtl * sprite, SDL_Rect * src_r, SDL_Rect * dest_r,
157 int side)
158 {
159 JPB_PrintSurface (sprite->sdata->
160 pic[sprite->frame + sprite->sdata->nFrames * side], src_r,
161 dest_r);
162 }
163
164 void
printSpriteRot(L_spriteCtlRot * sprite,SDL_Rect * src_r,SDL_Rect * dest_r,int side,float angle)165 printSpriteRot (L_spriteCtlRot * sprite, SDL_Rect * src_r, SDL_Rect * dest_r,
166 int side, float angle)
167 {
168 JPB_PrintSurfaceRot (sprite->sdata->
169 pic[sprite->frame + sprite->sdata->nFrames * side],
170 src_r, dest_r, angle);
171 }
172
173
174 void
freeSpriteData(L_spriteData * sprite)175 freeSpriteData (L_spriteData * sprite)
176 {
177 int i, j;
178 for (i = 0; i < sprite->sides; i++)
179 {
180 for (j = 0; j < sprite->nFrames; j++)
181 {
182 JPB_FreeSurface (sprite->pic[j + sprite->nFrames * i]);
183 }
184 }
185 free (sprite->pic);
186 free (sprite->time);
187 free (sprite);
188 }
189
190 void
freeSpriteDataRot(L_spriteDataRot * sprite)191 freeSpriteDataRot (L_spriteDataRot * sprite)
192 {
193 int i, j;
194
195 for (i = 0; i < sprite->sides; i++)
196 {
197 for (j = 0; j < sprite->nFrames; j++)
198 {
199 JPB_FreeSurfaceRot (sprite->pic[j + sprite->nFrames * i]);
200 }
201 }
202 free (sprite->pic);
203 free (sprite->time);
204 free (sprite);
205 }
206
207 JPB_surfaceRot *
getFrameRot(L_spriteCtlRot * sprite,int side)208 getFrameRot (L_spriteCtlRot * sprite, int side)
209 {
210 return sprite->sdata->pic[sprite->frame + sprite->sdata->nFrames * side];
211 }
212
213 void
initializeSpriteCtlRot(L_spriteCtlRot * sprite,L_spriteDataRot * data)214 initializeSpriteCtlRot (L_spriteCtlRot * sprite, L_spriteDataRot * data)
215 {
216 sprite->elpTime = 0;
217 sprite->frame = 0;
218 sprite->sdata = data;
219 }
220
221 void
initializeSpriteCtl(L_spriteCtl * sprite,L_spriteData * data)222 initializeSpriteCtl (L_spriteCtl * sprite, L_spriteData * data)
223 {
224 sprite->elpTime = 0;
225 sprite->frame = 0;
226 sprite->sdata = data;
227 }
228