summaryrefslogtreecommitdiff
path: root/noncore/games/sfcave-sdl/terrain.cpp
Unidiff
Diffstat (limited to 'noncore/games/sfcave-sdl/terrain.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/sfcave-sdl/terrain.cpp22
1 files changed, 3 insertions, 19 deletions
diff --git a/noncore/games/sfcave-sdl/terrain.cpp b/noncore/games/sfcave-sdl/terrain.cpp
index c001a56..b243f45 100644
--- a/noncore/games/sfcave-sdl/terrain.cpp
+++ b/noncore/games/sfcave-sdl/terrain.cpp
@@ -2,141 +2,141 @@
2#include "SDL_rotozoom.h" 2#include "SDL_rotozoom.h"
3#include "SDL_gfxPrimitives.h" 3#include "SDL_gfxPrimitives.h"
4 4
5#include "constants.h" 5#include "constants.h"
6#include "terrain.h" 6#include "terrain.h"
7#include "random.h" 7#include "random.h"
8#include "util.h" 8#include "util.h"
9#include "starfield.h" 9#include "starfield.h"
10 10
11Terrain :: Terrain( int w, int h, bool drawTop, bool drawBottom ) 11Terrain :: Terrain( int w, int h, bool drawTop, bool drawBottom )
12{ 12{
13 sWidth = w; 13 sWidth = w;
14 sHeight = h; 14 sHeight = h;
15 speed = 1; 15 speed = 1;
16 segSize = sWidth/(MAPSIZE-2)+1; 16 segSize = sWidth/(MAPSIZE-2)+1;
17 this->drawTop = drawTop; 17 this->drawTop = drawTop;
18 this->drawBottom = drawBottom; 18 this->drawBottom = drawBottom;
19 19
20 stars = new StarField( true ); 20 stars = new StarField( true );
21 21
22 SDL_Surface *tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, sWidth + 20, sHeight, 32, 22 SDL_Surface *tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, sWidth + 20, sHeight, 32,
23 0x000000ff,0x0000ff00, 0x00ff0000, 0xff000000); 23 0x000000ff,0x0000ff00, 0x00ff0000, 0xff000000);
24 terrainSurface = SDL_DisplayFormat( tmp ); 24 terrainSurface = SDL_DisplayFormat( tmp );
25 SDL_FreeSurface( tmp ); 25 SDL_FreeSurface( tmp );
26 26
27 initTerrain(); 27 initTerrain();
28 28
29} 29}
30 30
31Terrain :: ~Terrain() 31Terrain :: ~Terrain()
32{ 32{
33 SDL_FreeSurface( terrainSurface ); 33 SDL_FreeSurface( terrainSurface );
34 delete stars; 34 delete stars;
35} 35}
36 36
37void Terrain :: initTerrain() 37void Terrain :: initTerrain()
38{ 38{
39 dir = 1; 39 dir = 1;
40 offset = 0; 40 offset = 0;
41 41
42 maxHeight = 50; 42 maxHeight = 50;
43 43
44 mapTop[0] = (int)(nextInt(50)) + 5; 44 mapTop[0] = (int)(nextInt(50)) + 5;
45 mapBottom[0] = sHeight - (maxHeight - mapTop[0]); 45 mapBottom[0] = sHeight - (maxHeight - mapTop[0]);
46 for ( int i = 1 ; i < MAPSIZE ; ++i ) 46 for ( int i = 1 ; i < MAPSIZE ; ++i )
47 setPoint( i ); 47 setPoint( i );
48 48
49 SDL_FillRect( terrainSurface, 0, 0 ); 49 SDL_FillRect( terrainSurface, 0, 0 );
50
50 // Draw Terrain into surface 51 // Draw Terrain into surface
51 Sint16 px[5]; 52 Sint16 px[5];
52 Sint16 py[5]; 53 Sint16 py[5];
53 54
54 for ( int i = 0 ; i < MAPSIZE ; ++i ) 55 for ( int i = 0 ; i < MAPSIZE ; ++i )
55 { 56 {
56 int left = (i*segSize); 57 int left = (i*segSize);
57 int right = ((i+1)*segSize); 58 int right = ((i+1)*segSize);
58 px[0] = left; 59 px[0] = left;
59 py[0] = mapTop[i]; 60 py[0] = mapTop[i];
60 px[1] = right; 61 px[1] = right;
61 py[1] = mapTop[i+1]; 62 py[1] = mapTop[i+1];
62 px[2] = right; 63 px[2] = right;
63 py[2] = 0; 64 py[2] = 0;
64 px[3] = left; 65 px[3] = left;
65 py[3] = 0; 66 py[3] = 0;
66 67
67 if ( drawTop ) 68 if ( drawTop )
68 { 69 {
69 // Only display top landscape if not running FLY_GAME 70 // Only display top landscape if not running FLY_GAME
70 filledPolygonRGBA( terrainSurface, px, py, 4, 0, 190, 0, 255 ); 71 filledPolygonRGBA( terrainSurface, px, py, 4, 0, 190, 0, 255 );
71 } 72 }
72 73
73 if ( drawBottom ) 74 if ( drawBottom )
74 { 75 {
75 py[0] = mapBottom[i]; 76 py[0] = mapBottom[i];
76 py[1] = mapBottom[i+1]; 77 py[1] = mapBottom[i+1];
77 py[2] = sHeight; 78 py[2] = sHeight;
78 py[3] = sHeight; 79 py[3] = sHeight;
79 filledPolygonRGBA( terrainSurface, px, py, 4, 0, 190, 0, 255 ); 80 filledPolygonRGBA( terrainSurface, px, py, 4, 0, 190, 0, 255 );
80 } 81 }
81 82
82 } 83 }
83 84
84 85
85} 86}
86 87
87void Terrain :: moveTerrain( int amountToMove ) 88void Terrain :: moveTerrain( int amountToMove )
88{ 89{
89 stars->move(); 90 stars->move();
90 91
91 offset += amountToMove; 92 offset += amountToMove;
92 speed = offset/segSize; 93 speed = offset/segSize;
93 94
94 //printf( "offset - %d, speed - %d\n", offset, speed );
95 if ( offset >= segSize ) 95 if ( offset >= segSize )
96 { 96 {
97 for ( int i = 0 ; i < (MAPSIZE)-speed ; ++i ) 97 for ( int i = 0 ; i < (MAPSIZE)-speed ; ++i )
98 { 98 {
99 mapTop[i] = mapTop[i+speed]; 99 mapTop[i] = mapTop[i+speed];
100 mapBottom[i] = mapBottom[i+speed]; 100 mapBottom[i] = mapBottom[i+speed];
101 } 101 }
102 102
103 for ( int i = (MAPSIZE)-speed ; i < MAPSIZE ; ++i ) 103 for ( int i = (MAPSIZE)-speed ; i < MAPSIZE ; ++i )
104 { 104 {
105 setPoint( i ); 105 setPoint( i );
106 } 106 }
107 107
108 SDL_Rect dst; 108 SDL_Rect dst;
109 dst.x = offset; 109 dst.x = offset;
110 dst.y = 0; 110 dst.y = 0;
111 dst.w = sWidth; 111 dst.w = sWidth;
112 dst.h = sHeight; 112 dst.h = sHeight;
113 113
114 SDL_Rect dst2; 114 SDL_Rect dst2;
115 dst2.x = 0; 115 dst2.x = 0;
116 dst2.y = 0; 116 dst2.y = 0;
117 117
118 SDL_BlitSurface(terrainSurface, &dst, terrainSurface, &dst2 ); 118 SDL_BlitSurface(terrainSurface, &dst, terrainSurface, &dst2 );
119 119
120 dst.x = sWidth-5; 120 dst.x = sWidth-5;
121 dst.y = 0; 121 dst.y = 0;
122 dst.w = offset; 122 dst.w = offset;
123 dst.h = sHeight; 123 dst.h = sHeight;
124 SDL_FillRect( terrainSurface, &dst, 0 ); 124 SDL_FillRect( terrainSurface, &dst, 0 );
125 for ( int i = (MAPSIZE-1) - speed -1; i < MAPSIZE-1 ; ++i ) 125 for ( int i = (MAPSIZE-1) - speed -1; i < MAPSIZE-1 ; ++i )
126 { 126 {
127 Sint16 px[4]; 127 Sint16 px[4];
128 Sint16 py[5]; 128 Sint16 py[5];
129 int left = ((i-1)*segSize); 129 int left = ((i-1)*segSize);
130 int right = ((i)*segSize); 130 int right = ((i)*segSize);
131 // printf( "left = %d, right = %d\n", left, right ); 131 // printf( "left = %d, right = %d\n", left, right );
132 132
133 px[0] = left; 133 px[0] = left;
134 py[0] = mapTop[i]; 134 py[0] = mapTop[i];
135 px[1] = right; 135 px[1] = right;
136 py[1] = mapTop[i+1]; 136 py[1] = mapTop[i+1];
137 px[2] = right; 137 px[2] = right;
138 py[2] = 0; 138 py[2] = 0;
139 px[3] = left; 139 px[3] = left;
140 py[3] = 0; 140 py[3] = 0;
141 141
142 if ( drawTop ) 142 if ( drawTop )
@@ -150,149 +150,133 @@ void Terrain :: moveTerrain( int amountToMove )
150 py[0] = mapBottom[i]; 150 py[0] = mapBottom[i];
151 py[1] = mapBottom[i+1]; 151 py[1] = mapBottom[i+1];
152 py[2] = sHeight; 152 py[2] = sHeight;
153 py[3] = sHeight; 153 py[3] = sHeight;
154 filledPolygonRGBA( terrainSurface, px, py, 4, 0, 190, 0, 255 ); 154 filledPolygonRGBA( terrainSurface, px, py, 4, 0, 190, 0, 255 );
155 } 155 }
156 } 156 }
157 157
158 offset -= speed*segSize; 158 offset -= speed*segSize;
159 159
160 } 160 }
161 161
162} 162}
163 163
164void Terrain :: setPoint( int point ) 164void Terrain :: setPoint( int point )
165{ 165{
166 if ( nextInt( 100 ) >= 80 ) 166 if ( nextInt( 100 ) >= 80 )
167 dir *= -1; 167 dir *= -1;
168 168
169 mapTop[point] = mapTop[point-1] + (dir * nextInt( 5 )); 169 mapTop[point] = mapTop[point-1] + (dir * nextInt( 5 ));
170 if ( mapTop[point] < 0 ) 170 if ( mapTop[point] < 0 )
171 { 171 {
172 mapTop[point] = 0; 172 mapTop[point] = 0;
173 dir *= -1; 173 dir *= -1;
174 } 174 }
175 else if ( mapTop[point] >= maxHeight ) 175 else if ( mapTop[point] >= maxHeight )
176 { 176 {
177 mapTop[point] = maxHeight; 177 mapTop[point] = maxHeight;
178 dir *= -1; 178 dir *= -1;
179 } 179 }
180 180
181 mapBottom[point] = sHeight - (maxHeight - mapTop[point]); 181 mapBottom[point] = sHeight - (maxHeight - mapTop[point]);
182} 182}
183 183
184void Terrain :: increaseMaxHeight( int amount ) 184void Terrain :: increaseMaxHeight( int amount )
185{ 185{
186 maxHeight += amount; 186 maxHeight += amount;
187} 187}
188 188
189void Terrain :: drawTerrain( SDL_Surface *screen ) 189void Terrain :: drawTerrain( SDL_Surface *screen )
190{ 190{
191 // Blit terrain surface onto screen 191 // Blit terrain surface onto screen
192 192
193 SDL_Rect dst; 193 SDL_Rect dst;
194 dst.x = offset; 194 dst.x = offset;
195 dst.y = 0; 195 dst.y = 0;
196 dst.w = sWidth; 196 dst.w = sWidth;
197 dst.h = sHeight; 197 dst.h = sHeight;
198 //dst.h = maxHeight;
199 198
200 SDL_Rect dst2; 199 SDL_Rect dst2;
201 dst2.x = 0; 200 dst2.x = 0;
202 dst2.y = 0; 201 dst2.y = 0;
203 202
204 SDL_BlitSurface(terrainSurface, &dst, screen, &dst2 ); 203 SDL_BlitSurface(terrainSurface, &dst, screen, &dst2 );
205 204
206 stars->draw( screen ); 205 stars->draw( screen );
207
208 //dst.y = sHeight - maxHeight;
209 //dst2.y = sHeight - maxHeight;
210 //SDL_BlitSurface(terrainSurface, &dst, screen, &dst2 );
211
212/*
213 for ( int i = 0 ; i < MAPSIZE ; ++i )
214 {
215 int x1 = (i*segSize) - (offset*speed);
216 int x2 = ((i+1)*segSize)-(offset*speed);
217 if ( x2 >= sWidth )
218 x2 = sWidth-1;
219 aalineRGBA( screen, x1, mapTop[i], x2, mapTop[i+1], 0, 220, 0, 255 );
220 aalineRGBA( screen, x1, mapBottom[i], x2, mapBottom[i+1], 0, 220, 0, 255 );
221 }
222*/
223} 206}
224 207
225bool Terrain :: checkCollision( int x, int y, int h ) 208bool Terrain :: checkCollision( int x, int y, int h )
226{ 209{
227 if ( y < 0 || y > sHeight ) 210 if ( y < 0 || y > sHeight )
228 return true; 211 return true;
212
229 // First get segment that matches x 213 // First get segment that matches x
230 SDL_LockSurface( terrainSurface ); 214 SDL_LockSurface( terrainSurface );
231 215
232 Uint32 c = getpixel( terrainSurface, x, y ); 216 Uint32 c = getpixel( terrainSurface, x, y );
233 217
234 SDL_UnlockSurface( terrainSurface ); 218 SDL_UnlockSurface( terrainSurface );
235 219
236 if ( c == 0 ) 220 if ( c == 0 )
237 return false; 221 return false;
238 else 222 else
239 return true; 223 return true;
240} 224}
241 225
242 226
243// Test 227// Test
244#ifdef DEBUG_TERRAIN 228#ifdef DEBUG_TERRAIN
245SDL_Surface *screen; 229SDL_Surface *screen;
246Terrain *terrain; 230Terrain *terrain;
247 231
248void go() 232void go()
249{ 233{
250 /* Initialize SDL */ 234 // Initialize SDL
251 if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) 235 if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
252 { 236 {
253 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); 237 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
254 exit(1); 238 exit(1);
255 } 239 }
256 atexit(SDL_Quit); 240 atexit(SDL_Quit);
257 241
258 int videoflags = SDL_SWSURFACE ; 242 int videoflags = SDL_SWSURFACE ;
259 243
260 if ( (screen=SDL_SetVideoMode(280, 320,32,videoflags)) == NULL ) 244 if ( (screen=SDL_SetVideoMode(280, 320,32,videoflags)) == NULL )
261 { 245 {
262 fprintf(stderr, "Couldn't set %ix%i video mode: %s\n",WIDTH,HEIGHT,SDL_GetError()); 246 fprintf(stderr, "Couldn't set %ix%i video mode: %s\n",WIDTH,HEIGHT,SDL_GetError());
263 exit(2); 247 exit(2);
264 } 248 }
265 249
266 terrain = new Terrain( 240, 320 ); 250 terrain = new Terrain( 240, 320 );
267 251
268 bool done = false; 252 bool done = false;
269 while ( !done ) 253 while ( !done )
270 { 254 {
271 SDL_FillRect( screen, 0, 0 ); 255 SDL_FillRect( screen, 0, 0 );
272 terrain->drawTerrain( screen ); 256 terrain->drawTerrain( screen );
273 terrain->moveTerrain( 5 ); 257 terrain->moveTerrain( 5 );
274 258
275 SDL_Flip( screen ); 259 SDL_Flip( screen );
276 260
277 SDL_Delay( 5 ); 261 SDL_Delay( 5 );
278 262
279 SDL_Event event; 263 SDL_Event event;
280 while ( SDL_PollEvent(&event) ) 264 while ( SDL_PollEvent(&event) )
281 { 265 {
282 switch (event.type) 266 switch (event.type)
283 { 267 {
284 case SDL_KEYDOWN: 268 case SDL_KEYDOWN:
285 // Escape keypress quits the app 269 // Escape keypress quits the app
286 if ( event.key.keysym.sym != SDLK_ESCAPE ) 270 if ( event.key.keysym.sym != SDLK_ESCAPE )
287 { 271 {
288 terrain->moveTerrain( 5 ); 272 terrain->moveTerrain( 5 );
289 break; 273 break;
290 } 274 }
291 case SDL_QUIT: 275 case SDL_QUIT:
292 done = 1; 276 done = 1;
293 break; 277 break;
294 default: 278 default:
295 break; 279 break;
296 } 280 }
297 } 281 }
298 } 282 }