all repos — hyperkaos @ eb1d90d5e03dd01249922e8591b1c34d0599ffe4

lightweight modular puzzle/adventure game engine in C with SDL 1.2

basics of the cutscene engine are fleshed out, working intro sequence
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAlumy4UACgkQO3+8IhRO
Y5hYUA/+Iwm4zC1n2kNLV2renylU4IF6hJdRyN8LRbexEsxrAyi/fVuL5mybhrVO
UMT0feGcITypAPVtHlzAABkRKv5eJFZd/KLP2e8jMmGWhBOMidXf7+nP8R5zVarP
hYYoomX6HW5xI/Zd+dqBmoDhECPhgUNNArDnqnBwCzJ4dFw76F7gAKYU6ZG0yGKp
lQdepy+qqKd2iMKHqzAMwYR/SBDIhNEyMlPMSVTZu6CJjwCJHucPa8oCMgSjHJZn
zz/u/HjnX6LJF9vWdQ3yU8nZs7Z6dXizbC4jx/oiZyPYvkZD8vY+0Ad610o2iNKP
/13Pf7PwJUwFT2kbRU7SbCo+/JCZrWTUPU/+rhJatBX27GR+vNnOP/suIWWftwXw
bCGoTmbJJg8VYA4eBdNbjvmYNKRx8V75dw5IAaGp2ag4BiZShT/M9AtPOvOsxIG/
8yRWwrmUzmzD2v76XtI3ipFtaXL3ma5Ios1/hUZ6iuNrxBMGEbQ4PwqsvwMpx/Xq
4S9jXTrtlA7/bap8jgRkAPeZwrzgau/yE5JD8Tno8V5crt4h0JUs3dH3+kHPgxre
zcU50bF4uZN89gNvBgz9zVy/oPemwZSiOiYnjiEcMDNR7qrdAyd7LRkNiMCrU+RN
DkaUEcZ+vrIdeHT9WuylyBrXkfp11UN9YMYM0vokjDS/+zZJt4w=
=yt3h
-----END PGP SIGNATURE-----
commit

eb1d90d5e03dd01249922e8591b1c34d0599ffe4

parent

ed6e55207cbb590f8e3cb231699f09089951fe17

4 files changed, 167 insertions(+), 0 deletions(-)

jump to
A Scene.c

@@ -0,0 +1,125 @@

+#include <stdio.h> + +#include <SDL/SDL.h> +#include <SDL/SDL_image.h> +#include <SDL/SDL_ttf.h> +#include <SDL/SDL_mixer.h> + +#include "Scene.h" +#include "Timer.h" +#include "Engine.h" + +typedef struct kaos Kaos; +typedef struct textBox TextBox; +typedef struct room Room; +typedef struct player Player; +#include "extern.h" + +SLayer* newSLayer(char* filename, int x, int y, int h, int v) +{ + SLayer* self = malloc(sizeof(SLayer)); + + self->sprite = loadImage(filename); + self->x = x; + self->y = y; + self->h = h; + self->v = v; + + self->oX = x; + self->oY = y; + + return self; +} + +void deleteSLayer(SLayer* target) +{ + SDL_FreeSurface(target->sprite); + free(target); +} + +Scene* newScene(int in, int out, int time, SDL_Color incolor, SDL_Color outcolor) +{ + Scene* self = malloc(sizeof(Scene)); + + self->sprites = NULL; + self->time = time; + self->nSprites = 0; + self->fade = (Transition){in, incolor, out, outcolor}; + + return self; +} + +void buildScene(Scene* self, SLayer* sprite) +{ + int i; + SLayer** temp; + if (self->nSprites) + temp = self->sprites; + self->sprites = malloc((self->nSprites+1)*sizeof(SLayer)); + if (self->nSprites) + { + for (i = 0; i < self->nSprites; i++) + self->sprites[i] = temp[i]; + } + self->sprites[self->nSprites++] = sprite; +} + +void playScene(Scene* self) +{ + int i, j; + int alphamod; + Uint32 icolor, ocolor; + SDL_Surface* fadeIn, *fadeOut; + + fadeIn = loadImage("assets/img/backgrounds/blueroom.png"); + fadeOut = fadeIn; + + icolor = SDL_MapRGB(fadeIn->format, self->fade.incolor.r, self->fade.incolor.g, self->fade.incolor.b); + ocolor = SDL_MapRGB(fadeIn->format, self->fade.outcolor.r, self->fade.outcolor.g, self->fade.outcolor.b); + + SDL_FillRect(fadeIn, NULL, icolor); + SDL_FillRect(fadeOut, NULL, ocolor); + + + for (i = 0; i < self->time; i++) + { + timeStart(fps); + for (j = 0; j < self->nSprites; j++) + { + applySurface(self->sprites[j]->x, self->sprites[j]->y, self->sprites[j]->sprite, screen, NULL); + self->sprites[j]->x += self->sprites[j]->h; + self->sprites[j]->y += self->sprites[j]->v; + } + if (i < self->fade.in) + { + alphamod = 255 - (int)(255*((float)i/self->fade.in)); + SDL_SetAlpha(fadeIn, SDL_SRCALPHA|SDL_RLEACCEL, alphamod); + applySurface(0,0, fadeIn, screen, NULL); + } + if (self->time - i < self->fade.out) + { + alphamod = 255 - (int)(255*((float)(self->time - i)/self->fade.out)); + SDL_SetAlpha(fadeOut, SDL_SRCALPHA|SDL_RLEACCEL, alphamod); + applySurface(0,0, fadeOut, screen, NULL); + } + SDL_Flip(screen); + timeDilation(); + } + for (j = 0; j < self->nSprites; j++) + { + self->sprites[j]->x = self->sprites[j]->oX; + self->sprites[j]->y = self->sprites[j]->oY; + } +} + +void deleteScene(Scene* target) +{ + int i; + for (i = 0; i < target->nSprites; i++) + { + SDL_FreeSurface(target->sprites[i]->sprite); + free(target->sprites[i]); + } + free(target->sprites); + free(target); +}
A Scene.h

@@ -0,0 +1,30 @@

+typedef struct sLayer +{ + SDL_Surface* sprite; + int x,y,h,v; + int oX, oY; +} SLayer; + +typedef struct transition +{ + int in; + SDL_Color incolor; + int out; + SDL_Color outcolor; +} Transition; + +typedef struct scene +{ + SLayer** sprites; + int nSprites; + int time; + Transition fade; +} Scene; + +SLayer* newSLayer(char* filename, int x, int y, int h, int v); +void deleteSLayer(SLayer* target); + +Scene* newScene(int in, int out, int time, SDL_Color incolor, SDL_Color outcolor); +void buildScene(Scene* self, SLayer* sprite); +void playScene(Scene* self); +void deleteScene(Scene* target);
M main.cmain.c

@@ -12,6 +12,7 @@ #include "TextBox.h"

#include "Kaos.h" #include "HyperKaos.h" #include "WorldData.h" +#include "Scene.h" /*const int SCREEN_WIDTH = 320; const int SCREEN_HEIGHT = 180;

@@ -68,6 +69,17 @@ printf("Init failed\n");

return 1; } + SDL_Color black = {0,0,0}; + SLayer* presents = newSLayer("assets/img/backgrounds/presents.png", 0,0,0,0); + SLayer* menuTransition = newSLayer("assets/img/backgrounds/mainmenu.png",0,0,0,0); + Scene* intro = newScene(30,30, 90, black, black); + Scene* transition = newScene(30,0,30, black, black); + buildScene(intro, presents); + buildScene(transition, menuTransition); + playScene(intro); + playScene(transition); + deleteScene(intro); + deleteScene(transition); // main game loop while (!quit)