intro.c
Super Tux - Intro Screen
-
+
by Bill Kendrick
bill@newbreedsoftware.com
http://www.newbreedsoftware.com/supertux/
- April 11, 2000 - April 23, 2000
+ April 11, 2000 - February 1st, 2004
*/
#include <stdio.h>
#include <SDL.h>
#include <SDL_image.h>
-#ifndef NOSOUND
-#include <SDL_mixer.h>
-#endif
-
#ifdef LINUX
#include <pwd.h>
#include <sys/types.h>
#include "globals.h"
#include "intro.h"
#include "screen.h"
-
+#include "texture.h"
+#include "timer.h"
char * intro_text[] = {
"Tux and Gown were having a nice picnic..",
int intro(void)
{
SDL_Event event;
- SDL_Surface * bkgd, * copter_squish, * copter_stretch, * beam,
- * gown_sit, * gown_lookup, * gown_upset,
- * tux_sit, * tux_upset, * tux_mad;
- SDL_Surface * copter[2];
+ texture_type bkgd, copter_squish, copter_stretch, beam,
+ gown_sit, gown_lookup, gown_upset,
+ tux_sit, tux_upset, tux_mad;
+ texture_type copter[2];
SDL_Rect src, dest;
- int done, i, quit, j;
+ int done, i, quit, j, scene;
int * height, * height_speed;
+ timer_type timer;
/* Load sprite images: */
-
- bkgd = load_image(DATA_PREFIX "/images/intro/intro.png", IGNORE_ALPHA);
-
- gown_sit = load_image(DATA_PREFIX "/images/intro/gown-sit.png", USE_ALPHA);
- gown_lookup = load_image(DATA_PREFIX "/images/intro/gown-lookup.png",
- USE_ALPHA);
- gown_upset = load_image(DATA_PREFIX "/images/intro/gown-upset.png",
- USE_ALPHA);
-
- tux_sit = load_image(DATA_PREFIX "/images/intro/tux-sit.png", USE_ALPHA);
- tux_upset = load_image(DATA_PREFIX "/images/intro/tux-upset.png",
- USE_ALPHA);
- tux_mad = load_image(DATA_PREFIX "/images/intro/tux-mad.png", USE_ALPHA);
-
- copter[0] = load_image(DATA_PREFIX "/images/intro/copter1.png", USE_ALPHA);
- copter[1] = load_image(DATA_PREFIX "/images/intro/copter2.png", USE_ALPHA);
-
- copter_squish = load_image(DATA_PREFIX "/images/intro/copter-squish.png",
- USE_ALPHA);
- copter_stretch = load_image(DATA_PREFIX "/images/intro/copter-stretch.png",
- USE_ALPHA);
-
- beam = load_image(DATA_PREFIX "/images/intro/beam.png", USE_ALPHA);
-
+ texture_load(&bkgd, DATA_PREFIX "/images/intro/intro.png", IGNORE_ALPHA);
+ texture_load(&gown_sit, DATA_PREFIX "/images/intro/gown-sit.png", USE_ALPHA);
+ texture_load(&gown_lookup, DATA_PREFIX "/images/intro/gown-lookup.png", USE_ALPHA);
+ texture_load(&gown_upset, DATA_PREFIX "/images/intro/gown-upset.png", USE_ALPHA);
+ texture_load(&tux_sit, DATA_PREFIX "/images/intro/tux-sit.png", USE_ALPHA);
+ texture_load(&tux_upset, DATA_PREFIX "/images/intro/tux-upset.png", USE_ALPHA);
+ texture_load(&tux_mad, DATA_PREFIX "/images/intro/tux-mad.png", USE_ALPHA);
+ texture_load(&copter[0], DATA_PREFIX "/images/intro/copter1.png", USE_ALPHA);
+ texture_load(&copter[1], DATA_PREFIX "/images/intro/copter2.png", USE_ALPHA);
+ texture_load(&copter_squish, DATA_PREFIX "/images/intro/copter-squish.png", USE_ALPHA);
+ texture_load(&copter_stretch, DATA_PREFIX "/images/intro/copter-stretch.png", USE_ALPHA);
+ texture_load(&beam, DATA_PREFIX "/images/intro/beam.png", USE_ALPHA);
/* Allocate buffer for height array: */
- height = malloc(sizeof(int) * (gown_upset -> w));
- height_speed = malloc(sizeof(int) * (gown_upset -> w));
+ height = (int*) malloc(sizeof(int) * (gown_upset.w));
+ height_speed = (int*) malloc(sizeof(int) * (gown_upset.w));
/* Initialize height arrays: */
- for (j = 0; j < (gown_upset -> w); j++)
+ for (j = 0; j < (gown_upset.w); j++)
{
height[j] = 400;
height_speed[j] = (rand() % 10) + 1;
}
+ /* Display background: */
- /* Display background: */
-
- drawimage(bkgd, 0, 0, UPDATE);
-
+ texture_draw_bg(&bkgd, UPDATE);
/* Animation: */
done = 0;
quit = 0;
+ scene = 0;
+ i = 0;
+
+ timer_start(&timer,10000);
- for (i = 0; i < (10000 / FPS) && !done && !quit; i++)
+ while (timer_check(&timer) && !done && !quit)
{
+
/* Handle events: */
while (SDL_PollEvent(&event))
}
+ /* Display background: */
+
/* Draw things: */
- if (i == 0)
+ if (timer_get_gone(&timer) < 2000 && scene == 0)
{
+ ++scene;
/* Gown and tux sitting: */
- drawimage(tux_sit, 270, 400, UPDATE);
- drawimage(gown_sit, 320, 400, UPDATE);
+ texture_draw(&tux_sit, 270, 400, UPDATE);
+ texture_draw(&gown_sit, 320, 400, UPDATE);
- drawcenteredtext(intro_text[0], 456, letters_blue, UPDATE);
+ text_drawf(&white_text, intro_text[0], 0, -8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
}
- if (i == (2000 / FPS))
+ if (timer_get_gone(&timer) >= 2000 && scene == 1)
{
+ ++scene;
/* Helicopter begins to fly in: */
- erasecenteredtext(intro_text[0], 456, bkgd, UPDATE);
- drawcenteredtext(intro_text[1], 456, letters_red, UPDATE);
+ erasecenteredtext(&white_text, intro_text[0], 454, &bkgd, NO_UPDATE, 1);
+ text_drawf(&white_text, intro_text[1], 0,-8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
}
- if (i > (2000 / FPS) && i < (4000 / FPS))
+ if (timer_get_gone(&timer) >= 2000 && timer_get_gone(&timer) < 4000)
{
/* Helicopter flying in: */
+ texture_draw_part(&bkgd,0,32, 0, 32, screen->w, (copter[0].h), NO_UPDATE);
- drawpart(bkgd, 0, 32, 640, (copter[0] -> h), NO_UPDATE);
-
- drawimage(copter[i % 2],
- (i - (2000 / FPS)) * (FPS / 5) - (copter[0] -> w), 32,
+ texture_draw(&copter[i % 2],
+ (float)(timer_get_gone(&timer) - 2000) / 5 - (copter[0].w), 32,
NO_UPDATE);
-
- SDL_UpdateRect(screen, 0, 32, 640, (copter[0] -> h));
+
+ update_rect(screen, 0, 32, screen->w, (copter[0].h));
}
- if (i == (2500 / FPS))
+ if (timer_get_gone(&timer) >= 2500 && scene == 2)
{
+ ++scene;
/* Gown notices something... */
- drawimage(gown_lookup, 320, 400, UPDATE);
+ texture_draw(&gown_lookup, 320, 400, UPDATE);
}
- if (i == (3500 / FPS))
+ if (timer_get_gone(&timer) >= 3500 && scene == 3)
{
+ ++scene;
/* Gown realizes it's bad! */
- drawimage(gown_upset, 320, 400, UPDATE);
+ texture_draw(&gown_upset, 320, 400, UPDATE);
}
- if (i > (4000 / FPS) && i < (8000 / FPS))
+ if (timer_get_gone(&timer) >= 4000 && timer_get_gone(&timer) < 8000)
{
/* Helicopter sits: */
+ texture_draw_part(&bkgd,0,32, 0, 32, screen->w, (copter[0].h), NO_UPDATE);
- drawpart(bkgd, 0, 32, 640, (copter[0] -> h), NO_UPDATE);
-
- drawimage(copter[i % 2], 400 - (copter[0] -> w), 32, NO_UPDATE);
-
- SDL_UpdateRect(screen, 0, 32, 640, (copter[0] -> h));
+ texture_draw(&copter[i % 2], 400 - (copter[0].w), 32, NO_UPDATE);
+ update_rect(screen, 0, 32, screen->w, (copter[0].h));
}
- if (i == (5000 / FPS))
+ if (timer_get_gone(&timer) >= 5000 && scene == 4)
{
+ ++scene;
/* Tux realizes something's happening: */
- drawimage(tux_upset, 270, 400, UPDATE);
+ texture_draw(&tux_upset, 270, 400, UPDATE);
- erasecenteredtext(intro_text[1], 456, bkgd, UPDATE);
- drawcenteredtext(intro_text[2], 456, letters_red, UPDATE);
+ erasecenteredtext(&white_text, intro_text[1], 454, &bkgd, UPDATE, 1);
+ text_drawf(&white_text, intro_text[2], 0,-8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
}
- if (i > (5000 / FPS))
+ if (timer_get_gone(&timer) >= 5000 && timer_get_gone(&timer) <= 8000 && height[j] != 105)
{
/* Beam gown up! */
- drawpart(bkgd,
- 320,
- 32 + (copter[0] -> h),
- (gown_upset -> w),
- 368 + (gown_upset -> h) - (copter[0] -> h), NO_UPDATE);
+ texture_draw_part(&bkgd,
+ 310, 32 + (copter[0].h), 310,
+ 32 + (copter[0].h),
+ (gown_upset.w) + 20,
+ 378 + (gown_upset.h) - (copter[0].h), NO_UPDATE);
- for (j = 0; j < (gown_upset -> w); j++)
+ for (j = 0; j < (gown_upset.sdl_surface -> w); j++)
{
- drawimage(beam, 320 + j - ((beam -> w) / 2), height[j],
+ texture_draw(&beam, 320 + j - ((beam.w) / 2), height[j],
NO_UPDATE);
src.x = j;
src.y = 0;
src.w = 1;
- src.h = (gown_upset -> h);
+ src.h = (gown_upset.h);
dest.x = 320 + j;
dest.y = height[j];
dest.w = src.w;
dest.h = src.h;
- SDL_BlitSurface(gown_upset, &src, screen, &dest);
+ texture_draw_part(&gown_upset,src.x,src.y,dest.x,dest.y,dest.w,dest.h,NO_UPDATE);
- height[j] = height[j] - height_speed[j];
+ height[j] = 400 + rand() % 10 - (int)(300. * ((float)(timer_get_gone(&timer) - 5000)/(float)3000.));
+ if(height[j] < 105)
+ height[j] = 105;
- if ((i % 2) == 0)
- height_speed[j]++;
+ height_speed[j] = (float)(timer_get_gone(&timer) - 5000) / 300.;
}
-
- SDL_UpdateRect(screen,
- 320,
- 32 + (copter[0] -> h),
- (gown_upset -> w),
- 400 + (gown_upset -> h) - (copter[0] -> h));
+
+ update_rect(screen,
+ 310,
+ 32 + (copter[0].h),
+ (gown_upset.w) + 20,
+ 400 + (gown_upset.h) - (copter[0].h));
}
- if (i == (8000 / FPS))
+ if (timer_get_gone(&timer) >= 8000 && scene == 5)
{
+ texture_draw_part(&bkgd,
+ 310, 32 + (copter[0].h), 310,
+ 32 + (copter[0].h),
+ (gown_upset.w) + 20,
+ 368 + (gown_upset.h) - (copter[0].h), NO_UPDATE);
+
+ ++scene;
/* Tux gets mad! */
- drawimage(tux_mad, 270, 400, UPDATE);
+ texture_draw(&tux_mad, 270, 400, UPDATE);
- erasecenteredtext(intro_text[2], 456, bkgd, UPDATE);
- drawcenteredtext(intro_text[3], 456, letters_gold, UPDATE);
+ erasecenteredtext(&white_text, intro_text[2], 454, &bkgd, UPDATE, 1);
+ text_drawf(&white_text, intro_text[3], 0,-8, A_HMIDDLE, A_BOTTOM, 0, NO_UPDATE);
}
- if (i > (8000 / FPS) && i < (8250 / FPS))
+ if (timer_get_gone(&timer) >= 8000 && timer_get_gone(&timer) <= 8250)
{
/* Helicopter starting to speed off: */
- drawpart(bkgd, 0, 32, 640, (copter_squish -> h), NO_UPDATE);
+ texture_draw_part(&bkgd, 0, 32, 0, 32, screen->w, (copter_squish.h), NO_UPDATE);
- drawimage(copter_squish,
- 400 - (copter[0] -> w), 32,
+ texture_draw(&copter_squish,
+ 400 - (copter[0].w), 32,
NO_UPDATE);
-
- SDL_UpdateRect(screen, 0, 32, 640, (copter_squish -> h));
+
+ update_rect(screen, 0, 32, screen->w, (copter_squish.h));
}
- if (i > (8250 / FPS))
+ if (timer_get_gone(&timer) >= 8250)
{
/* Helicopter speeding off: */
- drawpart(bkgd, 0, 32, 640, (copter_stretch -> h), NO_UPDATE);
+ texture_draw_part(&bkgd, 0, 32, 0, 32, screen->w, (copter_stretch.h), NO_UPDATE);
- drawimage(copter_stretch,
- (i - (8250 / FPS)) * 30 + 400 - (copter[0] -> w),
+ texture_draw(&copter_stretch,
+ (timer_get_gone(&timer) - 8250) /*(i - (8250 / FPS)) * 30*/ + 400 - (copter[0].w),
32,
NO_UPDATE);
-
- SDL_UpdateRect(screen, 0, 32, 640, (copter_stretch -> h));
+
+ update_rect(screen, 0, 32, screen->w, (copter_stretch.h));
}
-
+
+ flipscreen();
+
+ ++i;
/* Pause: */
-
- SDL_Delay(FPS);
+ SDL_Delay(20);
}
/* Free surfaces: */
- SDL_FreeSurface(bkgd);
-
- SDL_FreeSurface(gown_sit);
- SDL_FreeSurface(gown_lookup);
- SDL_FreeSurface(gown_upset);
-
- SDL_FreeSurface(tux_sit);
- SDL_FreeSurface(tux_upset);
- SDL_FreeSurface(tux_mad);
-
- SDL_FreeSurface(copter[0]);
- SDL_FreeSurface(copter[1]);
-
- SDL_FreeSurface(copter_squish);
- SDL_FreeSurface(copter_stretch);
-
- SDL_FreeSurface(beam);
+ texture_free(&bkgd);
+ texture_free(&gown_sit);
+ texture_free(&gown_lookup);
+ texture_free(&gown_upset);
+ texture_free(&tux_sit);
+ texture_free(&tux_upset);
+ texture_free(&tux_mad);
+ texture_free(&copter[0]);
+ texture_free(&copter[1]);
+ texture_free(&copter_squish);
+ texture_free(&copter_stretch);
+ texture_free(&beam);
/* Free array buffers: */