26 Commits

Author SHA1 Message Date
3d52c45f5c Actualizado Makefile 2022-10-14 10:55:27 +02:00
3276027044 Subido el numero de versión 2022-10-14 10:46:18 +02:00
8041595976 Añadido contador al quitar el menu de pausa del juego 2022-10-14 10:44:50 +02:00
fa53c1b01a Merge branch 'master' of https://gitea.sustancia.synology.me/JailDesigner/coffee_crisis 2022-10-14 09:56:22 +02:00
20b362160e Arreglado el fallo en el sprite de muerte del arounder, tenia pantalón corto 2022-10-14 09:56:04 +02:00
5cabbfc487 Eliminar 'data/config/config.bin' 2022-10-14 09:53:38 +02:00
9f5e001c70 Eliminar 'data/config/score.bin' 2022-10-14 09:53:27 +02:00
112c3afc76 Solucionado el problema de no cerrar el juego durante la demo o las instrucciones 2022-10-14 09:52:15 +02:00
f4215384fe Actualizado Makefile 2022-10-13 10:46:40 +02:00
7796cee51a Actualizado Makefile 2022-10-13 10:41:22 +02:00
f83154c062 Listo para lanzamiento 2022-10-09 14:23:45 +02:00
9e73f7f97d Eliminado todo.txt 2022-10-09 13:02:18 +02:00
742ca02573 Revisados varios pequeños bugs 2022-10-09 12:58:23 +02:00
d77757853d Quitadas las cabezas rojas de powerup y acelerada la animación 2022-10-09 12:01:28 +02:00
ca7ae7418e Arreglado el modo 2P 2022-10-09 11:46:11 +02:00
f880bb7d74 Modificado el ritmo de las numbes i el cambio de color del cielo 2022-10-08 00:14:14 +02:00
9784b5517a Trabajando el menu de game over y el player_fire 2022-10-07 22:44:57 +02:00
88041eba23 Merge branch 'master' of https://gitea.sustancia.synology.me/JailDesigner/coffee_crisis 2022-10-07 18:30:44 +02:00
698721ae03 Trabajando en la pantalla de game over 2022-10-07 18:30:41 +02:00
c7109a46cd Pequeños ajustes y detalles 2022-10-07 13:56:51 +02:00
bb20522172 Arreglados dos fallos del menu 2022-10-06 19:06:39 +02:00
bebc016f3c Las instrucciones ya usan las nuevas texturas de objetos 2022-10-06 13:46:41 +02:00
56c1a1d7f3 Arreglada la animacion de morir. Ya no se usan smartsprites 2022-10-06 13:13:27 +02:00
50d2a5d1c7 Ya va pasando del titulo a las instrucciones, a la demo, etc.. 2022-10-06 10:31:48 +02:00
83103ddfea Arreglados los cambios de lenguaje 2022-10-06 09:39:39 +02:00
f4f7bb52b3 Actualizado makefile 2022-10-06 08:01:23 +02:00
45 changed files with 1793 additions and 897 deletions

6
.gitignore vendored
View File

@@ -1,6 +1,6 @@
.vscode .vscode
*.DS_Store *.DS_Store
bin bin
data/config.txt data/config/config.txt
data/config.bin data/config/config.bin
data/score.bin data/config/score.bin

View File

@@ -1,14 +1,16 @@
executable = coffee_crisis executable = coffee_crisis
windows: windows:
mkdir bin @echo off
g++ -std=c++11 -Wall -O2 source/*.cpp -lmingw32 -lSDL2main -lSDL2 -o bin/coffee_crisis.exe if not exist bin\ (mkdir bin)
g++ -std=c++11 -Wall -O2 source/*.cpp -lmingw32 -lSDL2main -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -static-libstdc++ -o bin/$(executable).exe
strip -s -R .comment -R .gnu.version bin/$(executable).exe --strip-unneeded
macos: macos:
mkdir -p bin mkdir -p bin
g++ -std=c++11 -Wall -O2 source/*.cpp -o bin/$(executable)_macos -lSDL2 g++ source/*.cpp -std=c++11 -Wall -O2 -lSDL2 -ffunction-sections -fdata-sections -o bin/$(executable)_macos
linux: linux:
mkdir -p bin mkdir -p bin
g++ source/*.cpp -std=c++11 -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o bin/$(executable)_linux g++ source/*.cpp -std=c++11 -Wall -Os -lSDL2 -ffunction-sections -fdata-sections -Wl,--gc-sections -o bin/$(executable)_linux
strip -s -R .comment -R .gnu.version bin/$(executable)_linux --strip-unneeded strip -s -R .comment -R .gnu.version bin/$(executable)_linux --strip-unneeded
opendingux: opendingux:
mkdir -p bin mkdir -p bin

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
data/gfx/menu_game_over.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -43,6 +43,8 @@ loop=0
frames=20,21,22,23 frames=20,21,22,23
[/animation] [/animation]
[animation] [animation]
name=sideshoot name=sideshoot
speed=5 speed=5
@@ -83,4 +85,92 @@ name=centershoot_2C
speed=5 speed=5
loop=0 loop=0
frames=44,45,46,47 frames=44,45,46,47
[/animation]
[animation]
name=walk_pwr
speed=3
loop=0
frames=0,1,2,3
[/animation]
[animation]
name=stand_pwr
speed=5
loop=0
frames=4,5,6,7
[/animation]
[animation]
name=walk_1C_pwr
speed=3
loop=0
frames=8,9,10,11
[/animation]
[animation]
name=stand_1C_pwr
speed=5
loop=0
frames=12,13,14,15
[/animation]
[animation]
name=walk_2C_pwr
speed=3
loop=0
frames=16,17,18,19
[/animation]
[animation]
name=stand_2C_pwr
speed=5
loop=0
frames=20,21,22,23
[/animation]
[animation]
name=sideshoot_pwr
speed=2
loop=0
frames=24,25,26,27
[/animation]
[animation]
name=centershoot_pwr
speed=2
loop=0
frames=28,29,30,31
[/animation]
[animation]
name=sideshoot_1C_pwr
speed=2
loop=0
frames=32,33,34,35
[/animation]
[animation]
name=centershoot_1C_pwr
speed=2
loop=0
frames=36,37,38,39
[/animation]
[animation]
name=sideshoot_2C_pwr
speed=2
loop=0
frames=40,41,42,43
[/animation]
[animation]
name=centershoot_2C_pwr
speed=2
loop=0
frames=44,45,46,47
[/animation] [/animation]

9
data/gfx/player_fire.ani Normal file
View File

@@ -0,0 +1,9 @@
frameWidth=28
frameHeight=32
[animation]
name=default
speed=5
loop=0
frames=0,1,2,3
[/animation]

View File

@@ -61,54 +61,54 @@ frames=28,29,30,31
name=sideshoot name=sideshoot
speed=5 speed=5
loop=0 loop=0
frames=32,33,34,35 frames=16,17,18,19
[/animation] [/animation]
[animation] [animation]
name=centershoot name=centershoot
speed=5 speed=5
loop=0 loop=0
frames=36,37,38,39 frames=20,21,22,23
[/animation] [/animation]
[animation] [animation]
name=sideshoot_1C name=sideshoot_1C
speed=5 speed=5
loop=0 loop=0
frames=40,41,42,43 frames=24,25,26,27
[/animation] [/animation]
[animation] [animation]
name=centershoot_1C name=centershoot_1C
speed=5 speed=5
loop=0 loop=0
frames=44,45,46,47 frames=28,29,30,31
[/animation] [/animation]
[animation] [animation]
name=sideshoot_pwr name=sideshoot_pwr
speed=5 speed=2
loop=0 loop=0
frames=48,49,50,51 frames=16,17,18,19
[/animation] [/animation]
[animation] [animation]
name=centershoot_pwr name=centershoot_pwr
speed=5 speed=2
loop=0 loop=0
frames=52,53,54,55 frames=20,21,22,23
[/animation] [/animation]
[animation] [animation]
name=sideshoot_1C_pwr name=sideshoot_1C_pwr
speed=5 speed=2
loop=0 loop=0
frames=56,57,58,59 frames=24,25,26,27
[/animation] [/animation]
[animation] [animation]
name=centershoot_1C_pwr name=centershoot_1C_pwr
speed=5 speed=2
loop=0 loop=0
frames=60,61,62,63 frames=28,29,30,31
[/animation] [/animation]

View File

@@ -1,160 +1,239 @@
## 0 - MENU DEL TITULO ## 0 - MENU DEL TITULO
JUGAR JUGAR
## 1 - MENU DEL TITULO ## 1 - MENU DEL TITULO
OPCIONS OPCIONS
## 2 - MENU DEL TITULO ## 2 - MENU DEL TITULO
INSTRUCCIONS INSTRUCCIONS
## 3 - MENU DEL TITULO ## 3 - MENU DEL TITULO
EIXIR EIXIR
## 4 - MENU DE OPCIONES ## 4 - MENU DE OPCIONES
FINESTRA FINESTRA
## 5 - MENU DE OPCIONES ## 5 - MENU DE OPCIONES
PANTALLA COMPLETA PANTALLA COMPLETA
## 6 - MENU DE OPCIONES ## 6 - MENU DE OPCIONES
PANTALLA COMPLETA FALSA PANTALLA COMPLETA FALSA
## 7 - MENU DE OPCIONES ## 7 - MENU DE OPCIONES
TAMANY DE FINESTRA TAMANY DE FINESTRA
## 8 - MENU DE OPCIONES ## 8 - MENU DE OPCIONES
IDIOMA IDIOMA
## 9 - MENU DE OPCIONES ## 9 - MENU DE OPCIONES
[ ACEPTAR ] [ ACEPTAR ]
## 10 - MENU DE OPCIONES ## 10 - MENU DE OPCIONES
[ CANCELAR ] [ CANCELAR ]
## 11 - INSTRUCCIONES ## 11 - INSTRUCCIONES
OBJECTIU OBJECTIU
## 12 - INSTRUCCIONES ## 12 - INSTRUCCIONES
HAS D'EXPLOTAR HAS D'EXPLOTAR
## 13 - INSTRUCCIONES ## 13 - INSTRUCCIONES
TANTS GLOBUS COM PUGUES TANTS GLOBUS COM PUGUES
## 14 - INSTRUCCIONES ## 14 - INSTRUCCIONES
LA DIFICULTAT AUGMENTA LA DIFICULTAT AUGMENTA
## 15 - INSTRUCCIONES ## 15 - INSTRUCCIONES
A MESURA QUE VAS PUNTUANT A MESURA QUE VAS PUNTUANT
## 16 - INSTRUCCIONES ## 16 - INSTRUCCIONES
OBJECTES OBJECTES
## 17 - INSTRUCCIONES ## 17 - INSTRUCCIONES
1.000 PUNTS 1.000 PUNTS
## 18 - INSTRUCCIONES ## 18 - INSTRUCCIONES
2.500 PUNTS 2.500 PUNTS
## 19 - INSTRUCCIONES ## 19 - INSTRUCCIONES
5.000 PUNTS 5.000 PUNTS
## 20 - INSTRUCCIONES ## 20 - INSTRUCCIONES
PARA EL TEMPS PARA EL TEMPS
## 21 - INSTRUCCIONES ## 21 - INSTRUCCIONES
VIDA EXTRA VIDA EXTRA
## 22 - INSTRUCCIONES ## 22 - INSTRUCCIONES
PREM UNA TECLA PER A TORNAR PREM UNA TECLA PER A TORNAR
## 23 - TITULO ## 23 - TITULO
PREM QUALSEVOL TECLA PREM QUALSEVOL TECLA
## 24 - MENU SELECCION DE IDIOMA ## 24 - MENU SELECCION DE IDIOMA
ESPA{OL (ESPANYOL) ESPA{OL (ESPANYOL)
## 25 - MENU SELECCION DE IDIOMA ## 25 - MENU SELECCION DE IDIOMA
BALOONCIA BALOONCIA
## 26 - MENU SELECCION DE IDIOMA ## 26 - MENU SELECCION DE IDIOMA
ENGLISH (ANGLES) ENGLISH (ANGLES)
## 27 - INTRO ## 27 - INTRO
Un dia qualsevol de l'any 2000 Un dia qualsevol de l'any 2000
## 28 - INTRO ## 28 - INTRO
Tot esta tranquil a la UPV Tot esta tranquil a la UPV
## 29 - INTRO ## 29 - INTRO
Fins que un desaprensiu... Fins que un desaprensiu...
## 30 - INTRO ## 30 - INTRO
HEY! ME ANE A FERME UN CORTAET... HEY! ME ANE A FERME UN CORTAET...
## 31 - INTRO ## 31 - INTRO
UAAAAAAAAAAAAA!!! UAAAAAAAAAAAAA!!!
## 32 - INTRO ## 32 - INTRO
Espera un moment... Espera un moment...
## 33 - INTRO ## 33 - INTRO
Si resulta que no tinc solt! Si resulta que no tinc solt!
## 34 - INTRO ## 34 - INTRO
MERDA DE MAQUINA! MERDA DE MAQUINA!
## 35 - INTRO ## 35 - INTRO
Blop... blop... blop... Blop... blop... blop...
## 36 - TEXTOS DEL JUEGO ## 36 - TEXTOS DEL JUEGO
Temps detes: Temps detes:
## 37 - TEXTOS DEL JUEGO ## 37 - TEXTOS DEL JUEGO
D E M O D E M O
## 38 - TEXTOS DEL JUEGO ## 38 - TEXTOS DEL JUEGO
fases mes! fases mes!
## 39 -
## 40 - ## 39 - MENU SELECCION DE JUGADOR
Selecciona personatge
## 41 - ## 40 - MENU SELECCION DE JUGADOR
Enrere
## 41 - MENU DE PAUSA
Menu de pausa
## 42 - ## 42 -
-
## 43 - PANTALLA DE GAME OVER ## 43 - PANTALLA DE GAME OVER
FI DEL JOC FI DEL JOC
## 44 - PANTALLA DE GAME OVER ## 44 - PANTALLA DE GAME OVER
ELS TEUS PUNTS: ELS TEUS PUNTS:
## 45 - PANTALLA DE GAME OVER ## 45 - PANTALLA DE GAME OVER
CONTINUAR? CONTINUAR?
## 46 - MENU DE PAUSA ## 46 - MENU DE PAUSA
CONTINUAR CONTINUAR
## 47 - MENU DE PAUSA ## 47 - MENU DE PAUSA
EIXIR DEL JOC EIXIR DEL JOC
## 48 - MENU GAME OVER ## 48 - MENU GAME OVER
SI SI
## 49 - MENU GAME OVER ## 49 - MENU GAME OVER
NO NO
## 50 - TEXTO DE COMPLETAR EL JUEGO ## 50 - TEXTO DE COMPLETAR EL JUEGO
Felicitats!! Felicitats!!
## 51 - MENU DEL TITULO ## 51 - MENU DEL TITULO
1 JUGADOR 1 JUGADOR
## 52 - MENU DEL TITULO ## 52 - MENU DEL TITULO
2 JUGADORS 2 JUGADORS
## 53 MARCADOR ## 53 MARCADOR
jugador 1 jugador 1
## 54 MARCADOR ## 54 MARCADOR
jugador 2 jugador 2
## 55 MARCADOR ## 55 MARCADOR
mult mult
## 56 MARCADOR ## 56 MARCADOR
max. puntuacio max. puntuacio
## 57 MARCADOR ## 57 MARCADOR
fase fase
## 58 - MENU DE OPCIONES ## 58 - MENU DE OPCIONES
MODE DE VISUALITZACIO MODE DE VISUALITZACIO
## 59 - MENU DE OPCIONES ## 59 - MENU DE OPCIONES
DIFICULTAT DIFICULTAT
## 60 - MENU DE OPCIONES ## 60 - MENU DE OPCIONES
FILTRE FILTRE
## 61 - MENU DE OPCIONES ## 61 - MENU DE OPCIONES
SINC. VERTICAL SINC. VERTICAL
## 62 - MENU DE OPCIONES ## 62 - MENU DE OPCIONES
CONTROLS DEL JUGADOR 1 CONTROLS DEL JUGADOR 1
## 63 - MENU DE OPCIONES ## 63 - MENU DE OPCIONES
CONTROLS DEL JUGADOR 2 CONTROLS DEL JUGADOR 2
## 64 - ## 64 -
-
## 65 - ## 65 -
-
## 66 - MENU DE OPCIONES ## 66 - MENU DE OPCIONES
FACIL FACIL
## 67 - MENU DE OPCIONES ## 67 - MENU DE OPCIONES
NORMAL NORMAL
## 68 - MENU DE OPCIONES ## 68 - MENU DE OPCIONES
DIFICIL DIFICIL
## 69 - MENU DE OPCIONES ## 69 - MENU DE OPCIONES
TECLAT TECLAT
## 70 - MENU DE OPCIONES ## 70 - MENU DE OPCIONES
MANDO MANDO
## 71 - MENU DE OPCIONES ## 71 - MENU DE OPCIONES
LINEAL LINEAL
## 72 - MENU DE OPCIONES ## 72 - MENU DE OPCIONES
NEAREST NEAREST
## 73 - MENU DE OPCIONES ## 73 - MENU DE OPCIONES
ACTIVADA ACTIVADA
## 74 - MENU DE OPCIONES ## 74 - MENU DE OPCIONES
DESACTIVADA DESACTIVADA
## 75 - JUEGO ## 75 - JUEGO
Endavant! Endavant!
## 76 - JUEGO ## 76 - JUEGO
1.000.000 de punts! 1.000.000 de punts!
## 77 - PANTALLA DE GAME OVER ## 77 - PANTALLA DE GAME OVER
PUNTS J1: PUNTS J1:
## 78 - PANTALLA DE GAME OVER ## 78 - PANTALLA DE GAME OVER
PUNTS J2: PUNTS J2:
## 79 - TEXTOS DEL JUEGO ## 79 - TEXTOS DEL JUEGO
Ultima fase! Ultima fase!

View File

@@ -1,160 +1,239 @@
## 0 - MENU DEL TITULO ## 0 - MENU DEL TITULO
PLAY PLAY
## 1 - MENU DEL TITULO ## 1 - MENU DEL TITULO
OPTIONS OPTIONS
## 2 - MENU DEL TITULO ## 2 - MENU DEL TITULO
HOW TO PLAY HOW TO PLAY
## 3 - MENU DEL TITULO ## 3 - MENU DEL TITULO
QUIT QUIT
## 4 - MENU DE OPCIONES ## 4 - MENU DE OPCIONES
WINDOW WINDOW
## 5 - MENU DE OPCIONES ## 5 - MENU DE OPCIONES
FULLSCREEN FULLSCREEN
## 6 - MENU DE OPCIONES ## 6 - MENU DE OPCIONES
FAKE FULLSCREEN FAKE FULLSCREEN
## 7 - MENU DE OPCIONES ## 7 - MENU DE OPCIONES
WINDOW SIZE WINDOW SIZE
## 8 - MENU DE OPCIONES ## 8 - MENU DE OPCIONES
LANGUAGE LANGUAGE
## 9 - MENU DE OPCIONES ## 9 - MENU DE OPCIONES
[ ACCEPT ] [ ACCEPT ]
## 10 - MENU DE OPCIONES ## 10 - MENU DE OPCIONES
[ CANCEL ] [ CANCEL ]
## 11 - INSTRUCCIONES ## 11 - INSTRUCCIONES
OBJECTIVE OBJECTIVE
## 12 - INSTRUCCIONES ## 12 - INSTRUCCIONES
YOU HAVE TO POP AS MANY YOU HAVE TO POP AS MANY
## 13 - INSTRUCCIONES ## 13 - INSTRUCCIONES
BALLOONS AS YOU CAN BALLOONS AS YOU CAN
## 14 - INSTRUCCIONES ## 14 - INSTRUCCIONES
DIFFICULTY WILL BE INCREASED DIFFICULTY WILL BE INCREASED
## 15 - INSTRUCCIONES ## 15 - INSTRUCCIONES
AS YOU SCORE POINTS AS YOU SCORE POINTS
## 16 - INSTRUCCIONES ## 16 - INSTRUCCIONES
ITEMS ITEMS
## 17 - INSTRUCCIONES ## 17 - INSTRUCCIONES
1.000 POINTS 1.000 POINTS
## 18 - INSTRUCCIONES ## 18 - INSTRUCCIONES
2.500 POINTS 2.500 POINTS
## 19 - INSTRUCCIONES ## 19 - INSTRUCCIONES
5.000 POINTS 5.000 POINTS
## 20 - INSTRUCCIONES ## 20 - INSTRUCCIONES
TIME STOPPER TIME STOPPER
## 21 - INSTRUCCIONES ## 21 - INSTRUCCIONES
EXTRA HIT EXTRA HIT
## 22 - INSTRUCCIONES ## 22 - INSTRUCCIONES
PRESS ANY KEY TO RETURN PRESS ANY KEY TO RETURN
## 23 - TITULO ## 23 - TITULO
PRESS ANY KEY PRESS ANY KEY
## 24 - MENU SELECCION DE IDIOMA ## 24 - MENU SELECCION DE IDIOMA
ESPA{OL (SPANISH) ESPA{OL (SPANISH)
## 25 - MENU SELECCION DE IDIOMA ## 25 - MENU SELECCION DE IDIOMA
BALOONCIA (VALENCIAN) BALOONCIA (VALENCIAN)
## 26 - MENU SELECCION DE IDIOMA ## 26 - MENU SELECCION DE IDIOMA
ENGLISH ENGLISH
## 27 - INTRO ## 27 - INTRO
Any day of the year 2000 Any day of the year 2000
## 28 - INTRO ## 28 - INTRO
Everything is quiet at the UPV Everything is quiet at the UPV
## 29 - INTRO ## 29 - INTRO
Until a bastard arrives... Until a bastard arrives...
## 30 - INTRO ## 30 - INTRO
YO! GONNA TAKE A CAFELITO... YO! GONNA TAKE A CAFELITO...
## 31 - INTRO ## 31 - INTRO
AAAAAAAARGHHHH!!! AAAAAAAARGHHHH!!!
## 32 - INTRO ## 32 - INTRO
Wait a moment... Wait a moment...
## 33 - INTRO ## 33 - INTRO
I don't have any loose! I don't have any loose!
## 34 - INTRO ## 34 - INTRO
FUCKING MACHINE! FUCKING MACHINE!
## 35 - INTRO ## 35 - INTRO
Blop... blop... blop... Blop... blop... blop...
## 36 - TEXTOS DEL JUEGO ## 36 - TEXTOS DEL JUEGO
Time stopped: Time stopped:
## 37 - TEXTOS DEL JUEGO ## 37 - TEXTOS DEL JUEGO
D E M O D E M O
## 38 - TEXTOS DEL JUEGO ## 38 - TEXTOS DEL JUEGO
stages left! stages left!
## 39 -
## 40 - ## 39 - MENU SELECCION DE JUGADOR
Select Player
## 41 - ## 40 - MENU SELECCION DE JUGADOR
Back
## 41 - MENU DE PAUSA
Pause Menu
## 42 - ## 42 -
-
## 43 - PANTALLA DE GAME OVER ## 43 - PANTALLA DE GAME OVER
GAME OVER GAME OVER
## 44 - PANTALLA DE GAME OVER ## 44 - PANTALLA DE GAME OVER
YOUR SCORE: YOUR SCORE:
## 45 - PANTALLA DE GAME OVER ## 45 - PANTALLA DE GAME OVER
CONTINUE? CONTINUE?
## 46 - MENU DE PAUSA ## 46 - MENU DE PAUSA
CONTINUE CONTINUE
## 47 - MENU DE PAUSA ## 47 - MENU DE PAUSA
LEAVE GAME LEAVE GAME
## 48 - MENU GAME OVER ## 48 - MENU GAME OVER
YES YES
## 49 - MENU GAME OVER ## 49 - MENU GAME OVER
NO NO
## 50 - TEXTO DE COMPLETAR EL JUEGO ## 50 - TEXTO DE COMPLETAR EL JUEGO
Congratulations!! Congratulations!!
## 51 - MENU DEL TITULO ## 51 - MENU DEL TITULO
1 PLAYER 1 PLAYER
## 52 - MENU DEL TITULO ## 52 - MENU DEL TITULO
2 PLAYERS 2 PLAYERS
## 53 - MARCADOR ## 53 - MARCADOR
player 1 player 1
## 54 - MARCADOR ## 54 - MARCADOR
player 2 player 2
## 55 - MARCADOR ## 55 - MARCADOR
mult mult
## 56 - MARCADOR ## 56 - MARCADOR
high score high score
## 57 - MARCADOR ## 57 - MARCADOR
stage stage
## 58 - MENU DE OPCIONES ## 58 - MENU DE OPCIONES
DISPLAY MODE DISPLAY MODE
## 59 - MENU DE OPCIONES ## 59 - MENU DE OPCIONES
DIFFICULTY DIFFICULTY
## 60 - MENU DE OPCIONES ## 60 - MENU DE OPCIONES
FILTER FILTER
## 61 - MENU DE OPCIONES ## 61 - MENU DE OPCIONES
VSYNC VSYNC
## 62 - MENU DE OPCIONES ## 62 - MENU DE OPCIONES
PLAYER 1 CONTROLS PLAYER 1 CONTROLS
## 63 - MENU DE OPCIONES ## 63 - MENU DE OPCIONES
PLAYER 2 CONTROLS PLAYER 2 CONTROLS
## 64 - ## 64 -
-
## 65 - ## 65 -
-
## 66 - MENU DE OPCIONES ## 66 - MENU DE OPCIONES
EASY EASY
## 67 - MENU DE OPCIONES ## 67 - MENU DE OPCIONES
NORMAL NORMAL
## 68 - MENU DE OPCIONES ## 68 - MENU DE OPCIONES
HARD HARD
## 69 - MENU DE OPCIONES ## 69 - MENU DE OPCIONES
KEYBOARD KEYBOARD
## 70 - MENU DE OPCIONES ## 70 - MENU DE OPCIONES
GAME CONTROLLER GAME CONTROLLER
## 71 - MENU DE OPCIONES ## 71 - MENU DE OPCIONES
LINEAL LINEAL
## 72 - MENU DE OPCIONES ## 72 - MENU DE OPCIONES
NEAREST NEAREST
## 73 - MENU DE OPCIONES ## 73 - MENU DE OPCIONES
ON ON
## 74 - MENU DE OPCIONES ## 74 - MENU DE OPCIONES
OFF OFF
## 75 - JUEGO ## 75 - JUEGO
Get Ready! Get Ready!
## 76 - JUEGO ## 76 - JUEGO
1.000.000 points! 1.000.000 points!
## 77 - PANTALLA DE GAME OVER ## 77 - PANTALLA DE GAME OVER
PLAYER1 SCORE: PLAYER1 SCORE:
## 78 - PANTALLA DE GAME OVER ## 78 - PANTALLA DE GAME OVER
PLAYER2 SCORE: PLAYER2 SCORE:
## 79 - TEXTOS DEL JUEGO ## 79 - TEXTOS DEL JUEGO
Last stage! Last stage!

View File

@@ -1,160 +1,239 @@
## 0 - MENU DEL TITULO ## 0 - MENU DEL TITULO
JUGAR JUGAR
## 1 - MENU DEL TITULO ## 1 - MENU DEL TITULO
OPCIONES OPCIONES
## 2 - MENU DEL TITULO ## 2 - MENU DEL TITULO
INSTRUCCIONES INSTRUCCIONES
## 3 - MENU DEL TITULO ## 3 - MENU DEL TITULO
SALIR SALIR
## 4 - MENU DE OPCIONES ## 4 - MENU DE OPCIONES
VENTANA VENTANA
## 5 - MENU DE OPCIONES ## 5 - MENU DE OPCIONES
PANTALLA COMPLETA PANTALLA COMPLETA
## 6 - MENU DE OPCIONES ## 6 - MENU DE OPCIONES
PANTALLA COMPLETA FALSA PANTALLA COMPLETA FALSA
## 7 - MENU DE OPCIONES ## 7 - MENU DE OPCIONES
TAMA{O DE VENTANA TAMA{O DE VENTANA
## 8 - MENU DE OPCIONES ## 8 - MENU DE OPCIONES
IDIOMA IDIOMA
## 9 - MENU DE OPCIONES ## 9 - MENU DE OPCIONES
[ ACEPTAR ] [ ACEPTAR ]
## 10 - MENU DE OPCIONES ## 10 - MENU DE OPCIONES
[ CANCELAR ] [ CANCELAR ]
## 11 - INSTRUCCIONES ## 11 - INSTRUCCIONES
OBJETIVO OBJETIVO
## 12 - INSTRUCCIONES ## 12 - INSTRUCCIONES
TIENES QUE EXPLOTAR TIENES QUE EXPLOTAR
## 13 - INSTRUCCIONES ## 13 - INSTRUCCIONES
TANTOS GLOBOS COMO PUEDAS TANTOS GLOBOS COMO PUEDAS
## 14 - INSTRUCCIONES ## 14 - INSTRUCCIONES
LA DIFICULTAD SE INCREMENTA LA DIFICULTAD SE INCREMENTA
## 15 - INSTRUCCIONES ## 15 - INSTRUCCIONES
A MEDIDA QUE VAS PUNTUANDO A MEDIDA QUE VAS PUNTUANDO
## 16 - INSTRUCCIONES ## 16 - INSTRUCCIONES
OBJETOS OBJETOS
## 17 - INSTRUCCIONES ## 17 - INSTRUCCIONES
1.000 PUNTOS 1.000 PUNTOS
## 18 - INSTRUCCIONES ## 18 - INSTRUCCIONES
2.500 PUNTOS 2.500 PUNTOS
## 19 - INSTRUCCIONES ## 19 - INSTRUCCIONES
5.000 PUNTOS 5.000 PUNTOS
## 20 - INSTRUCCIONES ## 20 - INSTRUCCIONES
DETIENE EL TIEMPO DETIENE EL TIEMPO
## 21 - INSTRUCCIONES ## 21 - INSTRUCCIONES
VIDA EXTRA VIDA EXTRA
## 22 - INSTRUCCIONES ## 22 - INSTRUCCIONES
PULSA UNA TECLA PARA VOLVER PULSA UNA TECLA PARA VOLVER
## 23 - TITULO ## 23 - TITULO
PULSA CUALQUIER TECLA PULSA CUALQUIER TECLA
## 24 - MENU SELECCION DE IDIOMA ## 24 - MENU SELECCION DE IDIOMA
ESPA{OL ESPA{OL
## 25 - MENU SELECCION DE IDIOMA ## 25 - MENU SELECCION DE IDIOMA
BALOONCIA (VALENCIANO) BALOONCIA (VALENCIANO)
## 26 - MENU SELECCION DE IDIOMA ## 26 - MENU SELECCION DE IDIOMA
ENGLISH (INGLES) ENGLISH (INGLES)
## 27 - INTRO ## 27 - INTRO
Un dia cualquiera del a{o 2000 Un dia cualquiera del a{o 2000
## 28 - INTRO ## 28 - INTRO
Todo esta tranquilo en la UPV Todo esta tranquilo en la UPV
## 29 - INTRO ## 29 - INTRO
Hasta que un desaprensivo... Hasta que un desaprensivo...
## 30 - INTRO ## 30 - INTRO
HEY! VOY A SACARME UN TALLADET... HEY! VOY A SACARME UN TALLADET...
## 31 - INTRO ## 31 - INTRO
UAAAAAAAAAAAAA!!! UAAAAAAAAAAAAA!!!
## 32 - INTRO ## 32 - INTRO
Espera un momento... Espera un momento...
## 33 - INTRO ## 33 - INTRO
Si no llevo suelto encima! Si no llevo suelto encima!
## 34 - INTRO ## 34 - INTRO
MIERDA DE MAQUINA! MIERDA DE MAQUINA!
## 35 - INTRO ## 35 - INTRO
Blop... blop... blop... Blop... blop... blop...
## 36 - TEXTOS DEL JUEGO ## 36 - TEXTOS DEL JUEGO
Tiempo: Tiempo:
## 37 - TEXTOS DEL JUEGO ## 37 - TEXTOS DEL JUEGO
D E M O D E M O
## 38 - TEXTOS DEL JUEGO ## 38 - TEXTOS DEL JUEGO
fases mas! fases mas!
## 39 -
## 40 - ## 39 - MENU SELECCION DE JUGADOR
Selecciona jugador
## 41 - ## 40 - MENU SELECCION DE JUGADOR
Volver
## 41 - MENU DE PAUSA
Menu de pausa
## 42 - ## 42 -
-
## 43 - PANTALLA DE GAME OVER ## 43 - PANTALLA DE GAME OVER
FIN DE JUEGO FIN DE JUEGO
## 44 - PANTALLA DE GAME OVER ## 44 - PANTALLA DE GAME OVER
TU PUNTUACION: TU PUNTUACION:
## 45 - PANTALLA DE GAME OVER ## 45 - PANTALLA DE GAME OVER
CONTINUAR? CONTINUAR?
## 46 - MENU DE PAUSA ## 46 - MENU DE PAUSA
CONTINUAR CONTINUAR
## 47 - MENU DE PAUSA ## 47 - MENU DE PAUSA
SALIR DEL JUEGO SALIR DEL JUEGO
## 48 - MENU GAME OVER ## 48 - MENU GAME OVER
SI SI
## 49 - MENU GAME OVER ## 49 - MENU GAME OVER
NO NO
## 50 - TEXTO DE COMPLETAR EL JUEGO ## 50 - TEXTO DE COMPLETAR EL JUEGO
Felicidades!! Felicidades!!
## 51 - MENU DEL TITULO ## 51 - MENU DEL TITULO
1 JUGADOR 1 JUGADOR
## 52 - MENU DEL TITULO ## 52 - MENU DEL TITULO
2 JUGADORES 2 JUGADORES
## 53 - MARCADOR ## 53 - MARCADOR
jugador 1 jugador 1
## 54 - MARCADOR ## 54 - MARCADOR
jugador 2 jugador 2
## 55 - MARCADOR ## 55 - MARCADOR
mult mult
## 56 - MARCADOR ## 56 - MARCADOR
max. puntuacion max. puntuacion
## 57 - MARCADOR ## 57 - MARCADOR
FASE FASE
## 58 - MENU DE OPCIONES ## 58 - MENU DE OPCIONES
MODO DE VISUALIZACION MODO DE VISUALIZACION
## 59 - MENU DE OPCIONES ## 59 - MENU DE OPCIONES
DIFICULTAD DIFICULTAD
## 60 - MENU DE OPCIONES ## 60 - MENU DE OPCIONES
FILTRO FILTRO
## 61 - MENU DE OPCIONES ## 61 - MENU DE OPCIONES
SINC. VERTICAL SINC. VERTICAL
## 62 - MENU DE OPCIONES ## 62 - MENU DE OPCIONES
CONTROLES DEL JUGADOR 1 CONTROLES DEL JUGADOR 1
## 63 - MENU DE OPCIONES ## 63 - MENU DE OPCIONES
CONTROLES DEL JUGADOR 2 CONTROLES DEL JUGADOR 2
## 64 - ## 64 -
-
## 65 - ## 65 -
-
## 66 - MENU DE OPCIONES ## 66 - MENU DE OPCIONES
FACIL FACIL
## 67 - MENU DE OPCIONES ## 67 - MENU DE OPCIONES
NORMAL NORMAL
## 68 - MENU DE OPCIONES ## 68 - MENU DE OPCIONES
DIFICIL DIFICIL
## 69 - MENU DE OPCIONES ## 69 - MENU DE OPCIONES
TECLADO TECLADO
## 70 - MENU DE OPCIONES ## 70 - MENU DE OPCIONES
MANDO MANDO
## 71 - MENU DE OPCIONES ## 71 - MENU DE OPCIONES
LINEAL LINEAL
## 72 - MENU DE OPCIONES ## 72 - MENU DE OPCIONES
NEAREST NEAREST
## 73 - MENU DE OPCIONES ## 73 - MENU DE OPCIONES
ACTIVADA ACTIVADA
## 74 - MENU DE OPCIONES ## 74 - MENU DE OPCIONES
DESACTIVADA DESACTIVADA
## 75 - JUEGO ## 75 - JUEGO
Adelante! Adelante!
## 76 - JUEGO ## 76 - JUEGO
1.000.000 de puntos! 1.000.000 de puntos!
## 77 - PANTALLA DE GAME OVER ## 77 - PANTALLA DE GAME OVER
PUNTUACION J1: PUNTUACION J1:
## 78 - PANTALLA DE GAME OVER ## 78 - PANTALLA DE GAME OVER
PUNTUACION J2: PUNTUACION J2:
## 79 - TEXTOS DEL JUEGO ## 79 - TEXTOS DEL JUEGO
Ultima fase! Ultima fase!

View File

@@ -1,22 +1,21 @@
font_png=smb2.png font_png=smb2.png
font_txt=smb2.txt font_txt=smb2.txt
sound_cancel=menu_cancel.wav
sound_accept=menu_select.wav
sound_move=menu_move.wav sound_move=menu_move.wav
sound_accept=menu_select.wav
name=GAME OVER name=GAME OVER
x=0 x=0
y=112 y=120
backgroundType=0 backgroundType=0
backgroundColor=0,0,0,255 backgroundColor=128,64,0,0
areElementsCenteredOnX=true areElementsCenteredOnX=true
isCenteredOnX=true isCenteredOnX=true
centerX=128 centerX=199
selector_color=84,110,122,0 selector_color=255,122,0,255
selector_text_color=255,122,0 selector_text_color=255,255,235
defaultActionWhenCancel=1 defaultActionWhenCancel=1

View File

@@ -1,9 +1,8 @@
font_png=smb2.png font_png=smb2.png
font_txt=smb2.txt font_txt=smb2.txt
sound_cancel=menu_cancel.wav
sound_accept=menu_select.wav
sound_move=menu_move.wav sound_move=menu_move.wav
sound_accept=menu_select.wav
name=OPTIONS name=OPTIONS
x=0 x=0
@@ -20,7 +19,7 @@ isCenteredOnY=true
centerY=96 centerY=96
selector_color=229,28,35,255 selector_color=229,28,35,255
selector_text_color=255,180,0 selector_text_color=255,241,118
defaultActionWhenCancel=13 defaultActionWhenCancel=13

View File

@@ -1,13 +1,12 @@
font_png=smb2.png font_png=smb2.png
font_txt=smb2.txt font_txt=smb2.txt
sound_cancel=menu_cancel.wav
sound_accept=menu_select.wav
sound_move=menu_move.wav sound_move=menu_move.wav
sound_accept=menu_select.wav
name=PAUSE name=PAUSE
x=0 x=0
y=96 y=80
backgroundType=1 backgroundType=1
backgroundColor=41,57,65,240 backgroundColor=41,57,65,240
@@ -18,13 +17,19 @@ centerX=128
selector_color=255,122,0,255 selector_color=255,122,0,255
selector_text_color=255,255,255 selector_text_color=255,255,255
defaultActionWhenCancel=0 defaultActionWhenCancel=1
[item] [item]
text=SI text=PAUSE MENU
hPaddingDown=7
selectable=false
[/item]
[item]
text=CONTINUE
hPaddingDown=2 hPaddingDown=2
[/item] [/item]
[item] [item]
text=NO text=LEAVE GAME
[/item] [/item]

View File

@@ -0,0 +1,40 @@
font_png=smb2.png
font_txt=smb2.txt
sound_move=menu_move.wav
sound_accept=menu_select.wav
name=PLAYER_SELECT
x=0
y=116
backgroundType=0
backgroundColor=48,48,64,192
areElementsCenteredOnX=true
isCenteredOnX=true
centerX=128
selector_color=229,28,35,0
selector_text_color=255,180,0
defaultActionWhenCancel=3
[item]
text=SELECT PLAYER
hPaddingDown=7
selectable=false
[/item]
[item]
text=BAL1
hPaddingDown=2
[/item]
[item]
text=AROUNDER
hPaddingDown=7
[/item]
[item]
text=BACK
[/item]

View File

@@ -1,9 +1,8 @@
font_png=smb2.png font_png=smb2.png
font_txt=smb2.txt font_txt=smb2.txt
sound_cancel=menu_cancel.wav
sound_accept=menu_select.wav
sound_move=menu_move.wav sound_move=menu_move.wav
sound_accept=menu_select.wav
name=TITLE name=TITLE
x=0 x=0

Binary file not shown.

View File

@@ -493,4 +493,12 @@ void AnimatedSprite::setAnimationCounter(int value)
{ {
a.counter = value; a.counter = value;
} }
}
// Reinicia la animación
void AnimatedSprite::resetAnimation()
{
animation.at(currentAnimation).currentFrame = 0;
animation.at(currentAnimation).counter = 0;
animation.at(currentAnimation).completed = false;
} }

View File

@@ -8,7 +8,6 @@
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#ifndef ANIMATEDSPRITE_H #ifndef ANIMATEDSPRITE_H
#define ANIMATEDSPRITE_H #define ANIMATEDSPRITE_H
@@ -85,6 +84,9 @@ public:
// OLD - Establece el contador para todas las animaciones // OLD - Establece el contador para todas las animaciones
void setAnimationCounter(int value); void setAnimationCounter(int value);
// Reinicia la animación
void resetAnimation();
}; };
#endif #endif

View File

@@ -7,13 +7,8 @@
// Constructor // Constructor
Director::Director(std::string path) Director::Director(std::string path)
{ {
// Inicializa variables // Inicializa variables
section.name = PROG_SECTION_GAME;
section.subsection = GAME_SECTION_PLAY_1P;
section.name = PROG_SECTION_LOGO; section.name = PROG_SECTION_LOGO;
section.subsection = 0;
// Crea el objeto que controla los ficheros de recursos // Crea el objeto que controla los ficheros de recursos
asset = new Asset(path.substr(0, path.find_last_of("\\/")) + "/../"); asset = new Asset(path.substr(0, path.find_last_of("\\/")) + "/../");
@@ -103,7 +98,8 @@ bool Director::initSDL()
bool success = true; bool success = true;
// Inicializa SDL // Inicializa SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_AUDIO) < 0) if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
// if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMECONTROLLER | SDL_INIT_AUDIO) < 0)
{ {
printf("SDL could not initialize!\nSDL Error: %s\n", SDL_GetError()); printf("SDL could not initialize!\nSDL Error: %s\n", SDL_GetError());
success = false; success = false;
@@ -130,9 +126,13 @@ bool Director::initSDL()
{ {
// Crea un renderizador para la ventana. El vsync se activa en funcion de las opciones // Crea un renderizador para la ventana. El vsync se activa en funcion de las opciones
if (options->vSync) if (options->vSync)
{
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
}
else else
{
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
}
if (renderer == nullptr) if (renderer == nullptr)
{ {
@@ -182,7 +182,6 @@ bool Director::setFileList()
asset->add("data/sound/hiscore.wav", t_sound); asset->add("data/sound/hiscore.wav", t_sound);
asset->add("data/sound/itemdrop.wav", t_sound); asset->add("data/sound/itemdrop.wav", t_sound);
asset->add("data/sound/itempickup.wav", t_sound); asset->add("data/sound/itempickup.wav", t_sound);
asset->add("data/sound/menu_cancel.wav", t_sound);
asset->add("data/sound/menu_move.wav", t_sound); asset->add("data/sound/menu_move.wav", t_sound);
asset->add("data/sound/menu_select.wav", t_sound); asset->add("data/sound/menu_select.wav", t_sound);
asset->add("data/sound/player_collision.wav", t_sound); asset->add("data/sound/player_collision.wav", t_sound);
@@ -211,8 +210,9 @@ bool Director::setFileList()
asset->add("data/gfx/intro.png", t_bitmap); asset->add("data/gfx/intro.png", t_bitmap);
asset->add("data/gfx/logo.png", t_bitmap); asset->add("data/gfx/logo.png", t_bitmap);
asset->add("data/gfx/menu_game_over.png", t_bitmap);
asset->add("data/gfx/items.png", t_bitmap); asset->add("data/gfx/menu_game_over_end.png", t_bitmap);
asset->add("data/gfx/item_points1_disk.png", t_bitmap); asset->add("data/gfx/item_points1_disk.png", t_bitmap);
asset->add("data/gfx/item_points1_disk.ani", t_data); asset->add("data/gfx/item_points1_disk.ani", t_data);
asset->add("data/gfx/item_points2_gavina.png", t_bitmap); asset->add("data/gfx/item_points2_gavina.png", t_bitmap);
@@ -237,16 +237,19 @@ bool Director::setFileList()
asset->add("data/gfx/player_body.ani", t_data); asset->add("data/gfx/player_body.ani", t_data);
asset->add("data/gfx/player_legs.ani", t_data); asset->add("data/gfx/player_legs.ani", t_data);
asset->add("data/gfx/player_death.ani", t_data); asset->add("data/gfx/player_death.ani", t_data);
asset->add("data/gfx/player_fire.ani", t_data);
asset->add("data/gfx/player_bal1_head.png", t_bitmap); asset->add("data/gfx/player_bal1_head.png", t_bitmap);
asset->add("data/gfx/player_bal1_body.png", t_bitmap); asset->add("data/gfx/player_bal1_body.png", t_bitmap);
asset->add("data/gfx/player_bal1_legs.png", t_bitmap); asset->add("data/gfx/player_bal1_legs.png", t_bitmap);
asset->add("data/gfx/player_bal1_death.png", t_bitmap); asset->add("data/gfx/player_bal1_death.png", t_bitmap);
asset->add("data/gfx/player_bal1_fire.png", t_bitmap);
asset->add("data/gfx/player_arounder_head.png", t_bitmap); asset->add("data/gfx/player_arounder_head.png", t_bitmap);
asset->add("data/gfx/player_arounder_body.png", t_bitmap); asset->add("data/gfx/player_arounder_body.png", t_bitmap);
asset->add("data/gfx/player_arounder_legs.png", t_bitmap); asset->add("data/gfx/player_arounder_legs.png", t_bitmap);
asset->add("data/gfx/player_arounder_death.png", t_bitmap); asset->add("data/gfx/player_arounder_death.png", t_bitmap);
asset->add("data/gfx/player_arounder_fire.png", t_bitmap);
// Fuentes // Fuentes
asset->add("data/font/8bithud.png", t_font); asset->add("data/font/8bithud.png", t_font);
@@ -272,6 +275,7 @@ bool Director::setFileList()
asset->add("data/menu/options.men", t_data); asset->add("data/menu/options.men", t_data);
asset->add("data/menu/pause.men", t_data); asset->add("data/menu/pause.men", t_data);
asset->add("data/menu/gameover.men", t_data); asset->add("data/menu/gameover.men", t_data);
asset->add("data/menu/player_select.men", t_data);
return asset->check(); return asset->check();
} }
@@ -297,6 +301,7 @@ bool Director::loadConfigFile()
options->windowSize = 3; options->windowSize = 3;
options->language = ba_BA; options->language = ba_BA;
options->difficulty = DIFFICULTY_NORMAL; options->difficulty = DIFFICULTY_NORMAL;
options->playerSelected = 0;
options->filter = FILTER_NEAREST; options->filter = FILTER_NEAREST;
options->vSync = true; options->vSync = true;
options->screenWidth = GAME_WIDTH; options->screenWidth = GAME_WIDTH;

File diff suppressed because it is too large Load Diff

View File

@@ -31,6 +31,8 @@
#define STAGE_COUNTER 200 #define STAGE_COUNTER 200
#define SHAKE_COUNTER 10 #define SHAKE_COUNTER 10
#define HELP_COUNTER 1000 #define HELP_COUNTER 1000
#define GAME_COMPLETED_START_FADE 500
#define GAME_COMPLETED_END 700
// Formaciones enemigas // Formaciones enemigas
#define NUMBER_OF_ENEMY_FORMATIONS 100 #define NUMBER_OF_ENEMY_FORMATIONS 100
@@ -125,11 +127,12 @@ private:
std::vector<Item *> items; // Vector con los items std::vector<Item *> items; // Vector con los items
std::vector<SmartSprite *> smartSprites; // Vector con los smartsprites std::vector<SmartSprite *> smartSprites; // Vector con los smartsprites
LTexture *bulletTexture; // Textura para las balas LTexture *bulletTexture; // Textura para las balas
std::vector<LTexture *> itemTextures; // Vector con las texturas de los items std::vector<LTexture *> itemTextures; // Vector con las texturas de los items
std::vector<LTexture *> balloonTextures; // Vector con las texturas de los globos std::vector<LTexture *> balloonTextures; // Vector con las texturas de los globos
std::vector<LTexture *> player1Textures; // Vector con las texturas del jugador std::vector<LTexture *> player1Textures; // Vector con las texturas del jugador
std::vector<LTexture *> player2Textures; // Vector con las texturas del jugador std::vector<LTexture *> player2Textures; // Vector con las texturas del jugador
std::vector<std::vector<LTexture *>> playerTextures; // Vector con todas las texturas de los jugadores;
LTexture *gameBuildingsTexture; // Textura con los edificios de fondo LTexture *gameBuildingsTexture; // Textura con los edificios de fondo
LTexture *gameCloudsTexture; // Textura con las nubes de fondo LTexture *gameCloudsTexture; // Textura con las nubes de fondo
@@ -137,8 +140,8 @@ private:
LTexture *gamePowerMeterTexture; // Textura con el marcador de poder de la fase LTexture *gamePowerMeterTexture; // Textura con el marcador de poder de la fase
LTexture *gameSkyColorsTexture; // Textura con los diferentes colores de fondo del juego LTexture *gameSkyColorsTexture; // Textura con los diferentes colores de fondo del juego
LTexture *gameTextTexture; // Textura para los sprites con textos LTexture *gameTextTexture; // Textura para los sprites con textos
LTexture *gameOverTexture; // Textura para la pantalla de game over
LTexture *itemTexture; // Textura para los items LTexture *gameOverEndTexture; // Textura para la pantalla de game over de acabar el juego
std::vector<std::vector<std::string> *> itemAnimations; // Vector con las animaciones de los items std::vector<std::vector<std::string> *> itemAnimations; // Vector con las animaciones de los items
std::vector<std::vector<std::string> *> playerAnimations; // Vector con las animaciones del jugador std::vector<std::vector<std::string> *> playerAnimations; // Vector con las animaciones del jugador
@@ -164,10 +167,12 @@ private:
SmartSprite *n2500Sprite; // Sprite con el texto 2.500 SmartSprite *n2500Sprite; // Sprite con el texto 2.500
SmartSprite *n5000Sprite; // Sprite con el texto 5.000 SmartSprite *n5000Sprite; // Sprite con el texto 5.000
Sprite *buildingsSprite; // Sprite con los edificios de fondo Sprite *buildingsSprite; // Sprite con los edificios de fondo
Sprite *skyColorsSprite; // Sprite con los graficos del degradado de color de fondo Sprite *skyColorsSprite; // Sprite con los graficos del degradado de color de fondo
Sprite *grassSprite; // Sprite para la hierba Sprite *grassSprite; // Sprite para la hierba
Sprite *powerMeterSprite; // Sprite para el medidor de poder de la fase Sprite *powerMeterSprite; // Sprite para el medidor de poder de la fase
Sprite *gameOverSprite; // Sprite para dibujar los graficos del game over
Sprite *gameOverEndSprite; // Sprite para dibujar los graficos del game over de acabar el juego
JA_Sound balloonSound; // Sonido para la explosión del globo JA_Sound balloonSound; // Sonido para la explosión del globo
JA_Sound bulletSound; // Sonido para los disparos JA_Sound bulletSound; // Sonido para los disparos
@@ -188,10 +193,9 @@ private:
JA_Music gameMusic; // Musica de fondo JA_Music gameMusic; // Musica de fondo
// Variables // Variables
int numPlayers; // Numero de jugadores int numPlayers; // Numero de jugadores
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint8 ticksSpeed; // Velocidad a la que se repiten los bucles del programa Uint8 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
Uint32 hiScore; // Puntuación máxima Uint32 hiScore; // Puntuación máxima
bool hiScoreAchieved; // Indica si se ha superado la puntuación máxima bool hiScoreAchieved; // Indica si se ha superado la puntuación máxima
section_t section; // Seccion actual dentro del juego section_t section; // Seccion actual dentro del juego
@@ -201,7 +205,6 @@ private:
float stageBitmapPath[STAGE_COUNTER]; // Vector con los puntos Y por donde se desplaza el texto float stageBitmapPath[STAGE_COUNTER]; // Vector con los puntos Y por donde se desplaza el texto
float getReadyBitmapPath[STAGE_COUNTER]; // Vector con los puntos X por donde se desplaza el texto float getReadyBitmapPath[STAGE_COUNTER]; // Vector con los puntos X por donde se desplaza el texto
Uint16 deathCounter; // Contador para la animación de muerte del jugador Uint16 deathCounter; // Contador para la animación de muerte del jugador
Uint8 deathIndex; // Indice del vector de smartsprites que contiene el sprite del jugador
Uint8 menaceCurrent; // Nivel de amenaza actual Uint8 menaceCurrent; // Nivel de amenaza actual
Uint8 menaceThreshold; // Umbral del nivel de amenaza. Si el nivel de amenaza cae por debajo del umbral, se generan más globos. Si el umbral aumenta, aumenta el numero de globos Uint8 menaceThreshold; // Umbral del nivel de amenaza. Si el nivel de amenaza cae por debajo del umbral, se generan más globos. Si el umbral aumenta, aumenta el numero de globos
bool timeStopped; // Indica si el tiempo está detenido bool timeStopped; // Indica si el tiempo está detenido
@@ -223,13 +226,17 @@ private:
int gameCompletedCounter; // Contador para el tramo final, cuando se ha completado la partida y ya no aparecen más enemigos int gameCompletedCounter; // Contador para el tramo final, cuando se ha completado la partida y ya no aparecen más enemigos
Uint8 difficulty; // Dificultad del juego Uint8 difficulty; // Dificultad del juego
float difficultyScoreMultiplier; // Multiplicador de puntos en función de la dificultad float difficultyScoreMultiplier; // Multiplicador de puntos en función de la dificultad
color_t difficultyColor; // Color asociado a la dificultad
struct options_t *options; // Variable con todas las variables de las opciones del programa struct options_t *options; // Variable con todas las variables de las opciones del programa
Uint8 onePlayerControl; // Variable para almacenar el valor de las opciones Uint8 onePlayerControl; // Variable para almacenar el valor de las opciones
enemyFormation_t enemyFormation[NUMBER_OF_ENEMY_FORMATIONS]; // Vector con todas las formaciones enemigas enemyFormation_t enemyFormation[NUMBER_OF_ENEMY_FORMATIONS]; // Vector con todas las formaciones enemigas
enemyPool_t enemyPool[10]; // Variable con los diferentes conjuntos de formaciones enemigas enemyPool_t enemyPool[10]; // Variable con los diferentes conjuntos de formaciones enemigas
Uint8 lastStageReached; // Contiene el numero de la última pantalla que se ha alcanzado Uint8 lastStageReached; // Contiene el numero de la última pantalla que se ha alcanzado
demo_t demo; // Variable con todas las variables relacionadas con el modo demo
demo_t demo; // Variable con todas las variables relacionadas con el modo demo int totalPowerToCompleteGame; // La suma del poder necesario para completar todas las fases
int cloudsSpeed; // Velocidad a la que se desplazan las nubes
int pauseCounter; // Contador para salir del menu de pausa y volver al juego
bool leavingPauseMenu; // Indica si esta saliendo del menu de pausa para volver al juego
// Actualiza el juego // Actualiza el juego
void update(); void update();
@@ -399,9 +406,6 @@ private:
// Crea un SmartSprite para arrojar el item café al recibir un impacto // Crea un SmartSprite para arrojar el item café al recibir un impacto
void throwCoffee(int x, int y); void throwCoffee(int x, int y);
// Crea un SmartSprite para arrojar al jugador al morir
void throwPlayer(int x, int y, Player *player);
// Actualiza los SmartSprites // Actualiza los SmartSprites
void updateSmartSprites(); void updateSmartSprites();
@@ -462,9 +466,21 @@ private:
// Agita la pantalla // Agita la pantalla
void shakeScreen(); void shakeScreen();
// Actualiza las variables del menu de pausa del juego
void updatePausedGame();
// Dibuja el menu de pausa del juego
void renderPausedGame();
// Bucle para el menu de pausa del juego // Bucle para el menu de pausa del juego
void runPausedGame(); void runPausedGame();
// Actualiza los elementos de la pantalla de game over
void updateGameOverScreen();
// Dibuja los elementos de la pantalla de game over
void renderGameOverScreen();
// Bucle para la pantalla de game over // Bucle para la pantalla de game over
void runGameOverScreen(); void runGameOverScreen();
@@ -492,6 +508,9 @@ private:
// Elimina todos los objetos contenidos en vectores // Elimina todos los objetos contenidos en vectores
void deleteAllVectorObjects(); void deleteAllVectorObjects();
// Recarga las texturas
void reloadTextures();
public: public:
// Constructor // Constructor
Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang, Input *input, bool demo, options_t *options); Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang, Input *input, bool demo, options_t *options);

View File

@@ -3,206 +3,248 @@
const Uint8 SELF = 0; const Uint8 SELF = 0;
// Constructor // Constructor
Instructions::Instructions(SDL_Renderer *renderer, Screen *screen, Asset *mAsset, Lang *lang) Instructions::Instructions(SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang)
{ {
// Copia los punteros // Copia los punteros
mRenderer = renderer; this->renderer = renderer;
mScreen = screen; this->screen = screen;
this->mAsset = mAsset; this->asset = asset;
mLang = lang; this->lang = lang;
// Reserva memoria para los punteros // Reserva memoria para los punteros
mEventHandler = new SDL_Event(); LTexture *item1 = new LTexture(renderer, asset->get("item_points1_disk.png"));
mItemTexture = new LTexture(mRenderer, mAsset->get("items.png")); itemTextures.push_back(item1);
mSprite = new Sprite(0, 0, GAME_WIDTH, GAME_HEIGHT, mItemTexture, mRenderer);
mText = new Text(mAsset->get("smb2.png"), mAsset->get("smb2.txt"), mRenderer); LTexture *item2 = new LTexture(renderer, asset->get("item_points2_gavina.png"));
itemTextures.push_back(item2);
LTexture *item3 = new LTexture(renderer, asset->get("item_points3_pacmar.png"));
itemTextures.push_back(item3);
LTexture *item4 = new LTexture(renderer, asset->get("item_clock.png"));
itemTextures.push_back(item4);
LTexture *item5 = new LTexture(renderer, asset->get("item_coffee.png"));
itemTextures.push_back(item5);
LTexture *item6 = new LTexture(renderer, asset->get("item_coffee_machine.png"));
itemTextures.push_back(item6);
eventHandler = new SDL_Event();
sprite = new Sprite(0, 0, 16, 16, itemTextures.at(0), renderer);
text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer);
// Crea un backbuffer para el renderizador // Crea un backbuffer para el renderizador
mBackbuffer = SDL_CreateTexture(mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAME_WIDTH, GAME_HEIGHT); backbuffer = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAME_WIDTH, GAME_HEIGHT);
if (mBackbuffer == nullptr) if (backbuffer == nullptr)
{ {
printf("Backbuffer could not be created!\nSDL Error: %s\n", SDL_GetError()); printf("Backbuffer could not be created!\nSDL Error: %s\n", SDL_GetError());
} }
// Inicializa variables
section.name = SELF;
ticks = 0;
ticksSpeed = 15;
manualQuit = false;
counter = 0;
counterEnd = 600;
} }
// Destructor // Destructor
Instructions::~Instructions() Instructions::~Instructions()
{ {
mItemTexture->unload(); for (auto texture : itemTextures)
delete mItemTexture; {
texture->unload();
delete texture;
}
itemTextures.clear();
delete mSprite; delete sprite;
delete mEventHandler; delete eventHandler;
delete mText; delete text;
SDL_DestroyTexture(mBackbuffer); SDL_DestroyTexture(backbuffer);
} }
// Inicializa las variables necesarias para la sección 'Instructions' // Actualiza las variables
void Instructions::init() void Instructions::update()
{ {
// Inicializa variables // Comprueba los eventos
mSection.name = SELF; checkEventHandler();
mTicks = 0;
mTicksSpeed = 15; // Actualiza las variables
mManualQuit = false; if (SDL_GetTicks() - ticks > ticksSpeed)
mCounter = 0; {
// Actualiza el contador de ticks
ticks = SDL_GetTicks();
if (mode == m_auto)
{ // Modo automático
counter++;
if (counter == counterEnd)
{
section.name = PROG_SECTION_TITLE;
section.subsection = TITLE_SECTION_1;
}
}
else
{ // Modo manual
++counter %= 60000;
if (manualQuit)
{
section.name = PROG_SECTION_TITLE;
section.subsection = TITLE_SECTION_3;
}
}
}
}
// Pinta en pantalla
void Instructions::render()
{
// Pinta en pantalla
SDL_Rect window = {0, 0, GAME_WIDTH, GAME_HEIGHT};
SDL_Rect srcRect = {0, 0, 16, 16};
const color_t orangeColor = {0xFF, 0x7A, 0x00};
const SDL_Rect destRect1 = {60, 88 + (16 * 0), 16, 16}; // Disquito
const SDL_Rect destRect2 = {60, 88 + (16 * 1), 16, 16}; // Gavineixon
const SDL_Rect destRect3 = {60, 88 + (16 * 2), 16, 16}; // Pacmar
const SDL_Rect destRect4 = {60, 88 + (16 * 3), 16, 16}; // Time Stopper
const SDL_Rect destRect5 = {60, 88 + (16 * 4), 16, 16}; // Coffee
// Pinta en el backbuffer el texto y los sprites
SDL_SetRenderTarget(renderer, backbuffer);
SDL_SetRenderDrawColor(renderer, bgColor.r, bgColor.g, bgColor.b, 255);
SDL_RenderClear(renderer);
// Escribe el texto
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 8, lang->getText(11), 1, orangeColor, 1, shdwTxtColor);
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 24, lang->getText(12), 1, noColor, 1, shdwTxtColor);
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 34, lang->getText(13), 1, noColor, 1, shdwTxtColor);
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 48, lang->getText(14), 1, noColor, 1, shdwTxtColor);
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 58, lang->getText(15), 1, noColor, 1, shdwTxtColor);
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 75, lang->getText(16), 1, orangeColor, 1, shdwTxtColor);
text->writeShadowed(84, 92, lang->getText(17), shdwTxtColor);
text->writeShadowed(84, 108, lang->getText(18), shdwTxtColor);
text->writeShadowed(84, 124, lang->getText(19), shdwTxtColor);
text->writeShadowed(84, 140, lang->getText(20), shdwTxtColor);
text->writeShadowed(84, 156, lang->getText(21), shdwTxtColor);
if ((mode == m_manual) && (counter % 50 > 14))
{
text->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, GAME_HEIGHT - 12, lang->getText(22), 1, orangeColor, 1, shdwTxtColor);
}
// Disquito
sprite->setTexture(itemTextures.at(0));
sprite->setPos(destRect1);
srcRect.y = 16 * (((counter + 12) / 36) % 2);
sprite->setSpriteClip(srcRect);
sprite->render();
// Gavineixon
sprite->setTexture(itemTextures.at(1));
sprite->setPos(destRect2);
srcRect.y = 16 * (((counter + 9) / 36) % 2);
sprite->setSpriteClip(srcRect);
sprite->render();
// Pacmar
sprite->setTexture(itemTextures.at(2));
sprite->setPos(destRect3);
srcRect.y = 16 * (((counter + 6) / 36) % 2);
sprite->setSpriteClip(srcRect);
sprite->render();
// Time Stopper
sprite->setTexture(itemTextures.at(3));
sprite->setPos(destRect4);
srcRect.y = 16 * (((counter + 3) / 36) % 2);
sprite->setSpriteClip(srcRect);
sprite->render();
// Coffee
sprite->setTexture(itemTextures.at(4));
sprite->setPos(destRect5);
srcRect.y = 16 * (((counter + 0) / 36) % 2);
sprite->setSpriteClip(srcRect);
sprite->render();
// Cambia el destino de renderizado
SDL_SetRenderTarget(renderer, nullptr);
// Prepara para empezar a dibujar en la textura de juego
screen->start();
// Limpia la pantalla
screen->clean(bgColor);
// Establece la ventana del backbuffer
if (mode == m_auto)
{
window.y = std::max(8, GAME_HEIGHT - counter + 100);
}
else
{
window.y = 0;
}
// Copia el backbuffer al renderizador
SDL_RenderCopy(renderer, backbuffer, nullptr, &window);
// Vuelca el contenido del renderizador en pantalla
screen->blit();
}
// Comprueba los eventos
void Instructions::checkEventHandler()
{
// Comprueba los eventos que hay en la cola
while (SDL_PollEvent(eventHandler) != 0)
{
// Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT)
{
section.name = PROG_SECTION_QUIT;
break;
}
if ((eventHandler->type == SDL_KEYUP) || (eventHandler->type == SDL_JOYBUTTONUP))
{
if (mode == m_auto)
{
JA_StopMusic();
section.name = PROG_SECTION_TITLE;
section.subsection = TITLE_SECTION_1;
}
else
{
if (counter > 30)
{
manualQuit = true;
}
}
}
}
} }
// Bucle para la pantalla de instrucciones // Bucle para la pantalla de instrucciones
void Instructions::run(Uint8 mode) section_t Instructions::run(mode_e mode)
{ {
init(); this->mode = mode;
while (mSection.name == SELF) while (section.name == SELF)
{ {
// Comprueba los eventos que hay en la cola update();
while (SDL_PollEvent(mEventHandler) != 0) render();
{
// Evento de salida de la aplicación
if (mEventHandler->type == SDL_QUIT)
{
mSection.name = PROG_SECTION_QUIT;
break;
}
if ((mEventHandler->type == SDL_KEYDOWN) || (mEventHandler->type == SDL_JOYBUTTONDOWN))
{
if (mode == INSTRUCTIONS_MODE_AUTO)
{
JA_StopMusic();
mSection.name = PROG_SECTION_TITLE;
mSection.subsection = TITLE_SECTION_1;
}
else
{
mManualQuit = true;
}
}
}
// Actualiza las variables
if (SDL_GetTicks() - mTicks > mTicksSpeed)
{
// Actualiza el contador de ticks
mTicks = SDL_GetTicks();
if (mode == INSTRUCTIONS_MODE_AUTO)
{ // Modo automático
mCounter++;
if (mCounter == INSTRUCTIONS_COUNTER)
{
mSection.name = PROG_SECTION_TITLE;
mSection.subsection = TITLE_SECTION_1;
}
}
else
{ // Modo manual
++mCounter %= 60000;
if (mManualQuit)
{
mSection.name = PROG_SECTION_TITLE;
mSection.subsection = TITLE_SECTION_3;
}
}
}
// Pinta en pantalla
SDL_Rect window = {0, 0, GAME_WIDTH, GAME_HEIGHT};
SDL_Rect srcRect = {0, 0, 16, 16};
const color_t orangeColor = {0xFF, 0x7A, 0x00};
const SDL_Rect destRect1 = {60, 88 + (16 * 0), 16, 16}; // Disquito
const SDL_Rect destRect2 = {60, 88 + (16 * 1), 16, 16}; // Gavineixon
const SDL_Rect destRect3 = {60, 88 + (16 * 2), 16, 16}; // Pacmar
const SDL_Rect destRect4 = {60, 88 + (16 * 3), 16, 16}; // Time Stopper
const SDL_Rect destRect5 = {60, 88 + (16 * 4), 16, 16}; // Coffee
// Pinta en el backbuffer el texto y los sprites
SDL_SetRenderTarget(mRenderer, mBackbuffer);
SDL_SetRenderDrawColor(mRenderer, bgColor.r, bgColor.g, bgColor.b, 255);
SDL_RenderClear(mRenderer);
// Escribe el texto
mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 8, mLang->getText(11), 1, orangeColor, 1, shdwTxtColor);
mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 24, mLang->getText(12), 1, noColor, 1, shdwTxtColor);
mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 34, mLang->getText(13), 1, noColor, 1, shdwTxtColor);
mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 48, mLang->getText(14), 1, noColor, 1, shdwTxtColor);
mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 58, mLang->getText(15), 1, noColor, 1, shdwTxtColor);
mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 75, mLang->getText(16), 1, orangeColor, 1, shdwTxtColor);
mText->writeShadowed(84, 92, mLang->getText(17), shdwTxtColor);
mText->writeShadowed(84, 108, mLang->getText(18), shdwTxtColor);
mText->writeShadowed(84, 124, mLang->getText(19), shdwTxtColor);
mText->writeShadowed(84, 140, mLang->getText(20), shdwTxtColor);
mText->writeShadowed(84, 156, mLang->getText(21), shdwTxtColor);
if ((mode == INSTRUCTIONS_MODE_MANUAL) && (mCounter % 50 > 14))
{
mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, GAME_HEIGHT - 12, mLang->getText(22), 1, orangeColor, 1, shdwTxtColor);
}
// Disquito
mSprite->setPos(destRect1);
srcRect.x = 0;
srcRect.y = 16 * (((mCounter + 12) / 36) % 2);
mSprite->setSpriteClip(srcRect);
mSprite->render();
// Gavineixon
mSprite->setPos(destRect2);
srcRect.x += srcRect.w;
srcRect.y = 16 * (((mCounter + 9) / 36) % 2);
mSprite->setSpriteClip(srcRect);
mSprite->render();
// Pacmar
mSprite->setPos(destRect3);
srcRect.x += srcRect.w;
srcRect.y = 16 * (((mCounter + 6) / 36) % 2);
mSprite->setSpriteClip(srcRect);
mSprite->render();
// Time Stopper
mSprite->setPos(destRect4);
srcRect.x += srcRect.w;
srcRect.y = 16 * (((mCounter + 3) / 36) % 2);
mSprite->setSpriteClip(srcRect);
mSprite->render();
// Coffee
mSprite->setPos(destRect5);
srcRect.x += (srcRect.w * 2); // Se salta el icono del TNT
srcRect.y = 16 * (((mCounter + 0) / 36) % 2);
mSprite->setSpriteClip(srcRect);
mSprite->render();
// Cambia el destino de renderizado
SDL_SetRenderTarget(mRenderer, nullptr);
// Prepara para empezar a dibujar en la textura de juego
mScreen->start();
// Limpia la pantalla
mScreen->clean(bgColor);
// Establece la ventana del backbuffer
if (mode == INSTRUCTIONS_MODE_AUTO)
{
window.y = std::max(8, GAME_HEIGHT - mCounter + 100);
}
else
{
window.y = 0;
}
// Copia el backbuffer al renderizador
SDL_RenderCopy(mRenderer, mBackbuffer, nullptr, &window);
// Vuelca el contenido del renderizador en pantalla
mScreen->blit();
} }
return section;
} }

View File

@@ -12,31 +12,35 @@
#ifndef INSTRUCTIONS_H #ifndef INSTRUCTIONS_H
#define INSTRUCTIONS_H #define INSTRUCTIONS_H
// Contadores enum mode_e
#define INSTRUCTIONS_COUNTER 600 {
m_manual,
// Modo para las instrucciones m_auto
#define INSTRUCTIONS_MODE_MANUAL 0 };
#define INSTRUCTIONS_MODE_AUTO 1
// Clase Instructions // Clase Instructions
class Instructions class Instructions
{ {
private: private:
SDL_Renderer *mRenderer; // El renderizador de la ventana // Objetos
Screen *mScreen; // Objeto encargado de dibujar en pantalla SDL_Renderer *renderer; // El renderizador de la ventana
LTexture *mItemTexture; // Textura con los graficos Screen *screen; // Objeto encargado de dibujar en pantalla
SDL_Event *mEventHandler; // Manejador de eventos std::vector<LTexture *> itemTextures; // Vector con las texturas de los items
SDL_Texture *mBackbuffer; // Textura para usar como backbuffer SDL_Event *eventHandler; // Manejador de eventos
Sprite *mSprite; // Sprite con la textura de las instrucciones SDL_Texture *backbuffer; // Textura para usar como backbuffer
Asset *mAsset; // Objeto que gestiona todos los ficheros de recursos Sprite *sprite; // Sprite con la textura de las instrucciones
Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas Asset *asset; // Objeto que gestiona todos los ficheros de recursos
Text *mText; // Objeto para escribir texto Lang *lang; // Objeto para gestionar los textos en diferentes idiomas
Uint16 mCounter; // Contador Text *text; // Objeto para escribir texto
section_t mSection; // Estado del bucle principal para saber si continua o se sale
Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa // Variables
Uint32 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa Uint16 counter; // Contador
bool mManualQuit; // Indica si se quiere salir del modo manual Uint16 counterEnd; // Valor final para el contador
section_t section; // Estado del bucle principal para saber si continua o se sale
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
bool manualQuit; // Indica si se quiere salir del modo manual
mode_e mode; // Modo en el que se van a ejecutar las instrucciones
// Actualiza las variables // Actualiza las variables
void update(); void update();
@@ -44,8 +48,8 @@ private:
// Pinta en pantalla // Pinta en pantalla
void render(); void render();
// Inicializa las variables // Comprueba los eventos
void init(); void checkEventHandler();
public: public:
// Constructor // Constructor
@@ -55,7 +59,7 @@ public:
~Instructions(); ~Instructions();
// Bucle principal // Bucle principal
void run(Uint8 mode); section_t run(mode_e mode);
}; };
#endif #endif

View File

@@ -101,19 +101,19 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang)
// Un dia qualsevol de l'any 2000 // Un dia qualsevol de l'any 2000
texts.at(0)->setCaption(lang->getText(27)); texts.at(0)->setCaption(lang->getText(27));
texts.at(0)->setSpeed(10); texts.at(0)->setSpeed(8);
// Tot esta tranquil a la UPV // Tot esta tranquil a la UPV
texts.at(1)->setCaption(lang->getText(28)); texts.at(1)->setCaption(lang->getText(28));
texts.at(1)->setSpeed(10); texts.at(1)->setSpeed(8);
// Fins que un desaprensiu... // Fins que un desaprensiu...
texts.at(2)->setCaption(lang->getText(29)); texts.at(2)->setCaption(lang->getText(29));
texts.at(2)->setSpeed(15); texts.at(2)->setSpeed(12);
// HEY! ME ANE A FERME UN CORTAET... // HEY! ME ANE A FERME UN CORTAET...
texts.at(3)->setCaption(lang->getText(30)); texts.at(3)->setCaption(lang->getText(30));
texts.at(3)->setSpeed(10); texts.at(3)->setSpeed(8);
// UAAAAAAAAAAAAA!!! // UAAAAAAAAAAAAA!!!
texts.at(4)->setCaption(lang->getText(31)); texts.at(4)->setCaption(lang->getText(31));
@@ -121,7 +121,7 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang)
// Espera un moment... // Espera un moment...
texts.at(5)->setCaption(lang->getText(32)); texts.at(5)->setCaption(lang->getText(32));
texts.at(5)->setSpeed(20); texts.at(5)->setSpeed(16);
// Si resulta que no tinc solt! // Si resulta que no tinc solt!
texts.at(6)->setCaption(lang->getText(33)); texts.at(6)->setCaption(lang->getText(33));
@@ -133,7 +133,7 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang)
// Blop... blop... blop... // Blop... blop... blop...
texts.at(8)->setCaption(lang->getText(35)); texts.at(8)->setCaption(lang->getText(35));
texts.at(8)->setSpeed(20); texts.at(8)->setSpeed(16);
for (auto text : texts) for (auto text : texts)
{ {
@@ -190,6 +190,37 @@ void Intro::checkEventHandler()
JA_StopMusic(); JA_StopMusic();
section.name = PROG_SECTION_TITLE; section.name = PROG_SECTION_TITLE;
section.subsection = TITLE_SECTION_1; section.subsection = TITLE_SECTION_1;
switch (eventHandler->key.keysym.scancode)
{
case SDL_SCANCODE_F:
screen->switchVideoMode();
texture->reLoad();
break;
case SDL_SCANCODE_F1:
screen->setWindowSize(1);
texture->reLoad();
break;
case SDL_SCANCODE_F2:
screen->setWindowSize(2);
texture->reLoad();
break;
case SDL_SCANCODE_F3:
screen->setWindowSize(3);
texture->reLoad();
break;
case SDL_SCANCODE_F4:
screen->setWindowSize(4);
texture->reLoad();
break;
default:
break;
}
} }
} }
} }

View File

@@ -46,20 +46,20 @@ bool Lang::setLang(Uint8 lang)
if (rfile.is_open() && rfile.good()) if (rfile.is_open() && rfile.good())
{ {
success = true; success = true;
std::string buffer; std::string line;
// lee el resto de datos del fichero // lee el resto de datos del fichero
int index = 0; int index = 0;
int line_read = 0; while (std::getline(rfile, line))
while (std::getline(rfile, buffer))
{ {
// Almacena solo las lineas impares // Almacena solo las lineas que no empiezan por # o no esten vacias
if (line_read % 2 == 1) const bool test1 = line.substr(0,1) != "#";
mTextStrings[index++] = buffer; const bool test2 = !line.empty();
if (test1 && test2)
// Limpia el buffer {
buffer.clear(); mTextStrings[index] = line;
line_read++; index++;
}
}; };
} }

View File

@@ -20,6 +20,7 @@ Menu::Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file)
itemSelected = MENU_NO_OPTION; itemSelected = MENU_NO_OPTION;
x = 0; x = 0;
y = 0; y = 0;
w = 0;
rectBG.rect = {0, 0, 0, 0}; rectBG.rect = {0, 0, 0, 0};
rectBG.color = {0, 0, 0}; rectBG.color = {0, 0, 0};
rectBG.a = 0; rectBG.a = 0;
@@ -57,6 +58,9 @@ Menu::Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file)
{ {
load(file); load(file);
} }
// Deja el cursor en el primer elemento
reset();
} }
Menu::~Menu() Menu::~Menu()
@@ -491,6 +495,13 @@ void Menu::reset()
selector.originH = selector.targetH = item[0].rect.h; selector.originH = selector.targetH = item[0].rect.h;
selector.moving = false; selector.moving = false;
selector.resizing = false; selector.resizing = false;
// Si el primer elemento no es seleccionable, incrementa el selector
if (!item[selector.index].selectable)
{
increaseSelectorIndex();
setSelectorPos(selector.index);
}
} }
// Actualiza el menu para recolocarlo correctamente y establecer el tamaño // Actualiza el menu para recolocarlo correctamente y establecer el tamaño
@@ -554,7 +565,7 @@ bool Menu::decreaseSelectorIndex()
// Calcula cual es el siguiente elemento // Calcula cual es el siguiente elemento
if (selector.index == 0) if (selector.index == 0)
{ {
selector.index = item.size(); selector.index = item.size() - 1;
} }
else else
{ {
@@ -565,7 +576,7 @@ bool Menu::decreaseSelectorIndex()
{ {
if (selector.index == 0) if (selector.index == 0)
{ {
selector.index = item.size(); selector.index = item.size() - 1;
} }
else else
{ {
@@ -608,8 +619,6 @@ void Menu::render()
// Renderiza el rectangulo del selector // Renderiza el rectangulo del selector
const SDL_Rect temp = {selector.rect.x, selector.rect.y - 1, selector.rect.w, selector.rect.h + 1}; const SDL_Rect temp = {selector.rect.x, selector.rect.y - 1, selector.rect.w, selector.rect.h + 1};
// temp.y--;
// temp.h++;
SDL_SetRenderDrawColor(renderer, selector.color.r, selector.color.g, selector.color.b, selector.a); SDL_SetRenderDrawColor(renderer, selector.color.r, selector.color.g, selector.color.b, selector.a);
SDL_RenderFillRect(renderer, &temp); SDL_RenderFillRect(renderer, &temp);
@@ -628,17 +637,18 @@ void Menu::render()
const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b};
text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, color); text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, color);
} }
else if (item[i].selectable) else if (item[i].selectable)
{ {
text->write(item[i].rect.x, item[i].rect.y, item[i].label); text->write(item[i].rect.x, item[i].rect.y, item[i].label);
} }
else if (item[i].greyed) else if (item[i].greyed)
{ {
text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, colorGreyed); text->writeColored(item[i].rect.x, item[i].rect.y, item[i].label, colorGreyed);
} }
else else
// No seleccionable { // No seleccionable
{
if ((item[i].linkedUp) && (i == selector.index + 1)) if ((item[i].linkedUp) && (i == selector.index + 1))
{ {
const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b}; const color_t color = {selector.itemColor.r, selector.itemColor.g, selector.itemColor.b};
@@ -653,13 +663,45 @@ void Menu::render()
} }
// Establece el rectangulo de fondo del menu y el selector // Establece el rectangulo de fondo del menu y el selector
void Menu::setRectSize() void Menu::setRectSize(int w, int h)
{ {
rectBG.rect.w = findWidth() + text->getCharacterSize(); // Establece el ancho
rectBG.rect.h = findHeight() + text->getCharacterSize(); if (w == 0)
{ // Si no se pasa un valor, se busca si hay uno prefijado
if (this->w == 0)
{ // Si no hay prefijado, coge el item mas ancho
rectBG.rect.w = findWidth() + text->getCharacterSize();
}
else
{ // Si hay prefijado, coge ese
rectBG.rect.w = this->w;
}
}
else
{ // Si se pasa un valor, se usa y se prefija
rectBG.rect.w = w;
this->w = w;
}
// Establece el alto
if (h == 0)
{ // Si no se pasa un valor, se busca de manera automatica
rectBG.rect.h = findHeight() + text->getCharacterSize();
}
else
{ // Si se pasa un valor, se aplica
rectBG.rect.h = h;
}
// La posición X es la del menú menos medio caracter // La posición X es la del menú menos medio caracter
rectBG.rect.x = x - (text->getCharacterSize() / 2); if (this->w != 0)
{ // Si el ancho esta prefijado, la x coinccide
rectBG.rect.x = x;
}
else
{ // Si el ancho es automatico, se le da un poco de margen
rectBG.rect.x = x - (text->getCharacterSize() / 2);
}
// La posición Y es la del menu menos la altura de medio caracter // La posición Y es la del menu menos la altura de medio caracter
rectBG.rect.y = y - (text->getCharacterSize() / 2); rectBG.rect.y = y - (text->getCharacterSize() / 2);
@@ -692,10 +734,28 @@ void Menu::setSelectorTextColor(color_t color)
void Menu::centerMenuOnX(int value) void Menu::centerMenuOnX(int value)
{ {
isCenteredOnX = true; isCenteredOnX = true;
centerX = value; if (value != 0)
{
centerX = value;
}
else if (centerX == 0)
{
return;
}
// Establece la nueva posición centrada en funcion del elemento más ancho // Establece la nueva posición centrada en funcion del elemento más ancho o del ancho fijo del menu
x = (value) - (findWidth() / 2); if (w != 0)
{ // Si se ha definido un ancho fijo
x = (centerX) - (w / 2);
}
else
{ // Si se actua en función del elemento más ancho
x = (centerX) - (findWidth() / 2);
}
// Actualiza el rectangulo de fondo y del selector
rectBG.rect.x = x;
selector.rect.x = x;
// Reposiciona los elementos del menu // Reposiciona los elementos del menu
for (auto &i : item) for (auto &i : item)
@@ -705,6 +765,12 @@ void Menu::centerMenuOnX(int value)
// Recalcula el rectangulo de fondo // Recalcula el rectangulo de fondo
setRectSize(); setRectSize();
// Vuelve a centrar los elementos si fuera el caso
if (areElementsCenteredOnX)
{
centerMenuElementsOnX();
}
} }
// Centra el menu respecto un punto en el eje Y // Centra el menu respecto un punto en el eje Y
@@ -738,13 +804,13 @@ void Menu::centerMenuElementsOnX()
void Menu::addItem(std::string text, int hPaddingDown, bool selectable, bool greyed, bool linkedDown) void Menu::addItem(std::string text, int hPaddingDown, bool selectable, bool greyed, bool linkedDown)
{ {
item_t temp; item_t temp;
if (item.empty()) if (item.empty())
{// Si es el primer item coge la posición en el eje Y del propio menu { // Si es el primer item coge la posición en el eje Y del propio menu
temp.rect.y = y; temp.rect.y = y;
} }
else else
{// En caso contrario, coge la posición en el eje Y a partir del último elemento { // En caso contrario, coge la posición en el eje Y a partir del último elemento
temp.rect.y = item.back().rect.y + item.back().rect.h + item.back().hPaddingDown; temp.rect.y = item.back().rect.y + item.back().rect.h + item.back().hPaddingDown;
} }
@@ -755,7 +821,7 @@ void Menu::addItem(std::string text, int hPaddingDown, bool selectable, bool gre
temp.linkedDown = linkedDown; temp.linkedDown = linkedDown;
item.push_back(temp); item.push_back(temp);
setItemCaption(item.size() - 1, text); setItemCaption(item.size() - 1, text);
if (item.size() > 1) if (item.size() > 1)
@@ -777,9 +843,6 @@ void Menu::setItemCaption(int index, std::string text)
item.at(index).rect.w = this->text->lenght(item.at(index).label); item.at(index).rect.w = this->text->lenght(item.at(index).label);
item.at(index).rect.h = this->text->getCharacterSize(); item.at(index).rect.h = this->text->getCharacterSize();
reorganize(); reorganize();
const std::string t = item.at(index).label + ":" + std::to_string(item.at(index).rect.w);
printf("Adding menu item -> %s\n", t.c_str());
} }
// Establece el indice del itemm que se usará por defecto al cancelar el menu // Establece el indice del itemm que se usará por defecto al cancelar el menu

View File

@@ -68,6 +68,13 @@ private:
int a; // Cantidad de transparencia para el rectangulo del selector int a; // Cantidad de transparencia para el rectangulo del selector
}; };
// Objetos
SDL_Renderer *renderer; // Puntero al renderizador de la ventana
Text *text; // Texto para poder escribir los items del menu
Input *input; // Gestor de eventos de entrada de teclado o gamepad
Asset *asset; // Objeto para gestionar los ficheros de recursos
// Variables
std::string name; // Nombre del menu std::string name; // Nombre del menu
int x; // Posición en el eje X de la primera letra del primer elemento int x; // Posición en el eje X de la primera letra del primer elemento
int y; // Posición en el eje Y de la primera letra del primer elemento int y; // Posición en el eje Y de la primera letra del primer elemento
@@ -85,10 +92,6 @@ private:
JA_Sound soundAccept; // Sonido al aceptar o elegir una opción del menu JA_Sound soundAccept; // Sonido al aceptar o elegir una opción del menu
JA_Sound soundCancel; // Sonido al cancelar el menu JA_Sound soundCancel; // Sonido al cancelar el menu
JA_Sound soundMove; // Sonido al mover el selector JA_Sound soundMove; // Sonido al mover el selector
SDL_Renderer *renderer; // Puntero al renderizador de la ventana
Text *text; // Texto para poder escribir los items del menu
Input *input; // Gestor de eventos de entrada de teclado o gamepad
Asset *asset; // Objeto para gestionar los ficheros de recursos
color_t colorGreyed; // Color para los elementos agrisados color_t colorGreyed; // Color para los elementos agrisados
rectangle_t rectBG; // Rectangulo de fondo del menu rectangle_t rectBG; // Rectangulo de fondo del menu
std::vector<item_t> item; // Estructura para cada elemento del menu std::vector<item_t> item; // Estructura para cada elemento del menu
@@ -108,9 +111,6 @@ private:
// Inicializa las variables // Inicializa las variables
void init(); void init();
// Establece el rectangulo de fondo del menu
void setRectSize();
// Actualiza el menu para recolocarlo correctamente y establecer el tamaño // Actualiza el menu para recolocarlo correctamente y establecer el tamaño
void reorganize(); void reorganize();
@@ -143,7 +143,7 @@ private:
public: public:
// Constructor // Constructor
Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file=""); Menu(SDL_Renderer *renderer, Asset *asset, Input *input, std::string file = "");
// Destructor // Destructor
~Menu(); ~Menu();
@@ -179,7 +179,7 @@ public:
void setSelectorTextColor(color_t color); void setSelectorTextColor(color_t color);
// Centra el menu respecto a un punto en el eje X // Centra el menu respecto a un punto en el eje X
void centerMenuOnX(int value); void centerMenuOnX(int value = 0);
// Centra el menu respecto a un punto en el eje Y // Centra el menu respecto a un punto en el eje Y
void centerMenuOnY(int value); void centerMenuOnY(int value);
@@ -219,6 +219,9 @@ public:
// Establece la fuente de texto que se utilizará // Establece la fuente de texto que se utilizará
void setText(std::string font_png, std::string font_txt); void setText(std::string font_png, std::string font_txt);
// Establece el rectangulo de fondo del menu
void setRectSize(int w = 0, int h = 0);
}; };
#endif #endif

View File

@@ -2,7 +2,7 @@
#include "player.h" #include "player.h"
// Constructor // Constructor
Player::Player(float x, int y, SDL_Renderer *renderer, std::vector<LTexture *> texture, std::vector<std::vector<std::string>*> animations) Player::Player(float x, int y, SDL_Renderer *renderer, std::vector<LTexture *> texture, std::vector<std::vector<std::string> *> animations)
{ {
// Copia los punteros // Copia los punteros
this->renderer = renderer; this->renderer = renderer;
@@ -12,6 +12,8 @@ Player::Player(float x, int y, SDL_Renderer *renderer, std::vector<LTexture *> t
bodySprite = new AnimatedSprite(texture.at(1), renderer, "", animations.at(1)); bodySprite = new AnimatedSprite(texture.at(1), renderer, "", animations.at(1));
legsSprite = new AnimatedSprite(texture.at(2), renderer, "", animations.at(2)); legsSprite = new AnimatedSprite(texture.at(2), renderer, "", animations.at(2));
deathSprite = new AnimatedSprite(texture.at(3), renderer, "", animations.at(3)); deathSprite = new AnimatedSprite(texture.at(3), renderer, "", animations.at(3));
fireSprite = new AnimatedSprite(texture.at(4), renderer, "", animations.at(4));
fireSprite->getTexture()->setAlpha(224);
// Establece la posición inicial del jugador // Establece la posición inicial del jugador
posX = x; posX = x;
@@ -27,6 +29,7 @@ Player::~Player()
delete bodySprite; delete bodySprite;
delete legsSprite; delete legsSprite;
delete deathSprite; delete deathSprite;
delete fireSprite;
} }
// Iniciador // Iniciador
@@ -131,7 +134,9 @@ void Player::move()
// Si el jugador abandona el area de juego por los laterales // Si el jugador abandona el area de juego por los laterales
if ((posX < PLAY_AREA_LEFT - 5) || (posX + width > PLAY_AREA_RIGHT + 5)) if ((posX < PLAY_AREA_LEFT - 5) || (posX + width > PLAY_AREA_RIGHT + 5))
posX -= velX; // Restaura su posición { // Restaura su posición
posX -= velX;
}
// Actualiza la posición del sprite // Actualiza la posición del sprite
legsSprite->setPosX(getPosX()); legsSprite->setPosX(getPosX());
@@ -142,6 +147,23 @@ void Player::move()
headSprite->setPosX(getPosX()); headSprite->setPosX(getPosX());
headSprite->setPosY(posY); headSprite->setPosY(posY);
fireSprite->setPosX(getPosX() - 2);
fireSprite->setPosY(posY - 8);
}
else
{
deathSprite->update();
// Si el cadaver abandona el area de juego por los laterales
if ((deathSprite->getPosX() < PLAY_AREA_LEFT) || (deathSprite->getPosX() + width > PLAY_AREA_RIGHT))
{ // Restaura su posición
const float vx = deathSprite->getVelX();
deathSprite->setPosX(deathSprite->getPosX() - vx);
// Rebota
deathSprite->setVelX(-vx);
}
} }
} }
@@ -154,6 +176,10 @@ void Player::render()
{ {
if ((invulnerableCounter % 10) > 4) if ((invulnerableCounter % 10) > 4)
{ {
if (powerUp)
{
fireSprite->render();
}
legsSprite->render(); legsSprite->render();
bodySprite->render(); bodySprite->render();
headSprite->render(); headSprite->render();
@@ -161,11 +187,19 @@ void Player::render()
} }
else else
{ {
if (powerUp)
{
fireSprite->render();
}
legsSprite->render(); legsSprite->render();
bodySprite->render(); bodySprite->render();
headSprite->render(); headSprite->render();
} }
} }
else
{
deathSprite->render();
}
} }
// Establece el estado del jugador cuando camina // Establece el estado del jugador cuando camina
@@ -186,8 +220,6 @@ void Player::setFiringStatus(Uint8 status)
if (statusFiring != status) if (statusFiring != status)
{ {
statusFiring = status; statusFiring = status;
// bodySprite->setCurrentFrame(0);
// headSprite->setCurrentFrame(0);
} }
} }
@@ -215,14 +247,14 @@ void Player::setAnimation()
legsSprite->setFlip(flipWalk); legsSprite->setFlip(flipWalk);
if (statusFiring == PLAYER_STATUS_FIRING_NO) if (statusFiring == PLAYER_STATUS_FIRING_NO)
{ // No esta disparando { // No esta disparando
bodySprite->setCurrentAnimation(aWalking + aBodyCoffees); bodySprite->setCurrentAnimation(aWalking + aBodyCoffees + aPowerUp);
bodySprite->setFlip(flipWalk); bodySprite->setFlip(flipWalk);
headSprite->setCurrentAnimation(aWalking + aHeadCoffees+ aPowerUp); headSprite->setCurrentAnimation(aWalking + aHeadCoffees + aPowerUp);
headSprite->setFlip(flipWalk); headSprite->setFlip(flipWalk);
} }
else else
{ // Está disparando { // Está disparando
bodySprite->setCurrentAnimation(aFiring + aBodyCoffees); bodySprite->setCurrentAnimation(aFiring + aBodyCoffees + aPowerUp);
bodySprite->setFlip(flipFire); bodySprite->setFlip(flipFire);
headSprite->setCurrentAnimation(aFiring + aHeadCoffees + aPowerUp); headSprite->setCurrentAnimation(aFiring + aHeadCoffees + aPowerUp);
headSprite->setFlip(flipFire); headSprite->setFlip(flipFire);
@@ -232,6 +264,9 @@ void Player::setAnimation()
legsSprite->animate(); legsSprite->animate();
bodySprite->animate(); bodySprite->animate();
headSprite->animate(); headSprite->animate();
fireSprite->animate();
fireSprite->setFlip(flipWalk);
} }
// Obtiene el valor de la variable // Obtiene el valor de la variable
@@ -336,6 +371,18 @@ bool Player::isAlive()
void Player::setAlive(bool value) void Player::setAlive(bool value)
{ {
alive = value; alive = value;
if (!value)
{
deathSprite->setPos(headSprite->getRect());
deathSprite->setAccelY(0.2f);
deathSprite->setVelY(-6.6f);
deathSprite->setVelX(3.3f);
if (rand() % 2 == 0)
{
deathSprite->setVelX(-3.3f);
}
}
} }
// Obtiene el valor de la variable // Obtiene el valor de la variable
@@ -533,7 +580,8 @@ void Player::shiftColliders()
// Obtiene el puntero a la textura con los gráficos de la animación de morir // Obtiene el puntero a la textura con los gráficos de la animación de morir
LTexture *Player::getDeadTexture() LTexture *Player::getDeadTexture()
{ {
return deathSprite->getTexture();; return deathSprite->getTexture();
;
} }
// Obtiene el valor de la variable // Obtiene el valor de la variable
@@ -547,21 +595,33 @@ void Player::updatePowerUpHeadOffset()
{ {
if (!powerUp) if (!powerUp)
{ {
//powerUpHeadOffset = 0; // powerUpHeadOffset = 0;
} }
else else
{ {
//powerUpHeadOffset = 96; // powerUpHeadOffset = 96;
if (powerUpCounter < 300) if (powerUpCounter < 300)
{ {
if (powerUpCounter % 10 > 4) if (powerUpCounter % 10 > 4)
{ {
//powerUpHeadOffset = 96; // powerUpHeadOffset = 96;
fireSprite->setEnabled(false);
} }
else else
{ {
//powerUpHeadOffset = 0; // powerUpHeadOffset = 0;
fireSprite->setEnabled(true);
} }
} }
} }
}
// Pone las texturas del jugador
void Player::setPlayerTextures(std::vector<LTexture *> texture)
{
headSprite->setTexture(texture.at(0));
bodySprite->setTexture(texture.at(1));
legsSprite->setTexture(texture.at(2));
deathSprite->setTexture(texture.at(3));
fireSprite->setTexture(texture.at(4));
} }

View File

@@ -23,24 +23,6 @@
#define PLAYER_STATUS_FIRING_RIGHT 2 #define PLAYER_STATUS_FIRING_RIGHT 2
#define PLAYER_STATUS_FIRING_NO 3 #define PLAYER_STATUS_FIRING_NO 3
#define PLAYER_ANIMATION_LEGS_WALKING_LEFT 0
#define PLAYER_ANIMATION_LEGS_WALKING_RIGHT 1
#define PLAYER_ANIMATION_LEGS_WALKING_STOP 2
#define PLAYER_ANIMATION_BODY_WALKING_LEFT 0
#define PLAYER_ANIMATION_BODY_FIRING_LEFT 1
#define PLAYER_ANIMATION_BODY_WALKING_RIGHT 2
#define PLAYER_ANIMATION_BODY_FIRING_RIGHT 3
#define PLAYER_ANIMATION_BODY_WALKING_STOP 4
#define PLAYER_ANIMATION_BODY_FIRING_UP 5
#define PLAYER_ANIMATION_HEAD_WALKING_LEFT 0
#define PLAYER_ANIMATION_HEAD_FIRING_LEFT 1
#define PLAYER_ANIMATION_HEAD_WALKING_RIGHT 2
#define PLAYER_ANIMATION_HEAD_FIRING_RIGHT 3
#define PLAYER_ANIMATION_HEAD_WALKING_STOP 4
#define PLAYER_ANIMATION_HEAD_FIRING_UP 5
// Variables del jugador // Variables del jugador
#define PLAYER_INVULNERABLE_COUNTER 200 #define PLAYER_INVULNERABLE_COUNTER 200
#define PLAYER_POWERUP_COUNTER 1500 #define PLAYER_POWERUP_COUNTER 1500
@@ -55,6 +37,7 @@ private:
AnimatedSprite *bodySprite; // Sprite para dibujar el cuerpo AnimatedSprite *bodySprite; // Sprite para dibujar el cuerpo
AnimatedSprite *legsSprite; // Sprite para dibujar las piernas AnimatedSprite *legsSprite; // Sprite para dibujar las piernas
AnimatedSprite *deathSprite; // Sprite para dibujar el jugador derrotado AnimatedSprite *deathSprite; // Sprite para dibujar el jugador derrotado
AnimatedSprite *fireSprite; // Sprite para dibujar el aura del jugador con el poder a tope
// Variables // Variables
float posX; // Posicion en el eje X float posX; // Posicion en el eje X
@@ -114,6 +97,9 @@ public:
// Pinta el jugador en pantalla // Pinta el jugador en pantalla
void render(); void render();
// Pone las texturas del jugador
void setPlayerTextures(std::vector<LTexture *> texture);
// Actua en consecuencia de la entrada recibida // Actua en consecuencia de la entrada recibida
void setInput(Uint8 input); void setInput(Uint8 input);

View File

@@ -22,7 +22,9 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer, options_t *options, i
// Crea la textura donde se dibujan los graficos del juego // Crea la textura donde se dibujan los graficos del juego
gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight); gameCanvas = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, gameCanvasWidth, gameCanvasHeight);
if (gameCanvas == NULL) if (gameCanvas == NULL)
{
printf("TitleSurface could not be created!\nSDL Error: %s\n", SDL_GetError()); printf("TitleSurface could not be created!\nSDL Error: %s\n", SDL_GetError());
}
// Establece el modo de video // Establece el modo de video
setVideoMode(options->fullScreenMode); setVideoMode(options->fullScreenMode);

View File

@@ -8,7 +8,18 @@ SmartSprite::SmartSprite(LTexture *texture, SDL_Renderer *renderer)
setTexture(texture); setTexture(texture);
setRenderer(renderer); setRenderer(renderer);
// Inicializa variables // Inicializa el objeto
init();
}
// Destructor
SmartSprite::~SmartSprite()
{
}
// Inicializa el objeto
void SmartSprite::init()
{
enabled = false; enabled = false;
enabledCounter = 0; enabledCounter = 0;
onDestination = false; onDestination = false;
@@ -18,11 +29,6 @@ SmartSprite::SmartSprite(LTexture *texture, SDL_Renderer *renderer)
finished = false; finished = false;
} }
// Destructor
SmartSprite::~SmartSprite()
{
}
// Actualiza la posición y comprueba si ha llegado a su destino // Actualiza la posición y comprueba si ha llegado a su destino
void SmartSprite::update() void SmartSprite::update()
{ {

View File

@@ -33,6 +33,9 @@ public:
// Destructor // Destructor
~SmartSprite(); ~SmartSprite();
// Inicializa el objeto
void init();
// Actualiza la posición y comprueba si ha llegado a su destino // Actualiza la posición y comprueba si ha llegado a su destino
void update(); void update();

View File

@@ -11,7 +11,9 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
this->options = options; this->options = options;
this->lang = lang; this->lang = lang;
// Reserva memoria para los punteros propios this->section = section;
// Reserva memoria para los punteros
eventHandler = new SDL_Event(); eventHandler = new SDL_Event();
fade = new Fade(renderer); fade = new Fade(renderer);
@@ -31,6 +33,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
menu.title = new Menu(renderer, asset, input, asset->get("title.men")); menu.title = new Menu(renderer, asset, input, asset->get("title.men"));
menu.options = new Menu(renderer, asset, input, asset->get("options.men")); menu.options = new Menu(renderer, asset, input, asset->get("options.men"));
menu.playerSelect = new Menu(renderer, asset, input, asset->get("player_select.men"));
// Sonidos // Sonidos
crashSound = JA_LoadSound(asset->get("title.wav").c_str()); crashSound = JA_LoadSound(asset->get("title.wav").c_str());
@@ -38,8 +41,52 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
// Musicas // Musicas
titleMusic = JA_LoadMusic(asset->get("title.ogg").c_str()); titleMusic = JA_LoadMusic(asset->get("title.ogg").c_str());
// Inicializa los valores
init();
}
// Destructor
Title::~Title()
{
delete eventHandler;
delete fade;
dustTexture->unload();
delete dustTexture;
coffeeTexture->unload();
delete coffeeTexture;
crisisTexture->unload();
delete crisisTexture;
gradientTexture->unload();
delete gradientTexture;
delete coffeeBitmap;
delete crisisBitmap;
delete dustBitmapL;
delete dustBitmapR;
delete gradient;
delete text1;
delete text2;
delete menu.title;
delete menu.options;
delete menu.playerSelect;
JA_DeleteSound(crashSound);
JA_DeleteMusic(titleMusic);
SDL_DestroyTexture(background);
}
// Inicializa los valores
void Title::init()
{
// Inicializa variables // Inicializa variables
this->section = section; section.subsection = TITLE_SECTION_1;
counter = TITLE_COUNTER; counter = TITLE_COUNTER;
backgroundCounter = 0; backgroundCounter = 0;
backgroundMode = rand() % 2; backgroundMode = rand() % 2;
@@ -50,7 +97,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
ticks = 0; ticks = 0;
ticksSpeed = 15; ticksSpeed = 15;
fade->init(0x17, 0x17, 0x26); fade->init(0x17, 0x17, 0x26);
demo = false; demo = true;
// Pone valores por defecto a las opciones de control // Pone valores por defecto a las opciones de control
options->input.clear(); options->input.clear();
@@ -83,6 +130,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
} }
// Inicializa el bitmap de Coffee // Inicializa el bitmap de Coffee
coffeeBitmap->init();
coffeeBitmap->setPosX(45); coffeeBitmap->setPosX(45);
coffeeBitmap->setPosY(11 - 200); coffeeBitmap->setPosY(11 - 200);
coffeeBitmap->setWidth(167); coffeeBitmap->setWidth(167);
@@ -98,6 +146,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
coffeeBitmap->setDestY(11); coffeeBitmap->setDestY(11);
// Inicializa el bitmap de Crisis // Inicializa el bitmap de Crisis
crisisBitmap->init();
crisisBitmap->setPosX(60); crisisBitmap->setPosX(60);
crisisBitmap->setPosY(57 + 200); crisisBitmap->setPosY(57 + 200);
crisisBitmap->setWidth(137); crisisBitmap->setWidth(137);
@@ -113,6 +162,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
crisisBitmap->setDestY(57); crisisBitmap->setDestY(57);
// Inicializa el bitmap de DustRight // Inicializa el bitmap de DustRight
dustBitmapR->resetAnimation();
dustBitmapR->setPosX(218); dustBitmapR->setPosX(218);
dustBitmapR->setPosY(47); dustBitmapR->setPosY(47);
dustBitmapR->setWidth(16); dustBitmapR->setWidth(16);
@@ -120,6 +170,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
dustBitmapR->setFlip(SDL_FLIP_HORIZONTAL); dustBitmapR->setFlip(SDL_FLIP_HORIZONTAL);
// Inicializa el bitmap de DustLeft // Inicializa el bitmap de DustLeft
dustBitmapL->resetAnimation();
dustBitmapL->setPosX(33); dustBitmapL->setPosX(33);
dustBitmapL->setPosY(47); dustBitmapL->setPosY(47);
dustBitmapL->setWidth(16); dustBitmapL->setWidth(16);
@@ -144,43 +195,7 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset,
} }
// Actualiza los textos de los menus // Actualiza los textos de los menus
// updateMenuLabels(); updateMenuLabels();
}
// Destructor
Title::~Title()
{
delete eventHandler;
delete fade;
dustTexture->unload();
delete dustTexture;
coffeeTexture->unload();
delete coffeeTexture;
crisisTexture->unload();
delete crisisTexture;
gradientTexture->unload();
delete gradientTexture;
delete coffeeBitmap;
delete crisisBitmap;
delete dustBitmapL;
delete dustBitmapR;
delete gradient;
delete text1;
delete text2;
delete menu.title;
delete menu.options;
JA_DeleteSound(crashSound);
JA_DeleteMusic(titleMusic);
SDL_DestroyTexture(background);
} }
// Actualiza las variables del objeto // Actualiza las variables del objeto
@@ -235,7 +250,7 @@ void Title::update()
dustBitmapL->update(); dustBitmapL->update();
step++; step++;
if (step == 33) if (step == 33)
{ {
section.subsection = TITLE_SECTION_3; section.subsection = TITLE_SECTION_3;
@@ -246,181 +261,251 @@ void Title::update()
// Sección 3 - La pantalla de titulo con el menú y la música // Sección 3 - La pantalla de titulo con el menú y la música
case TITLE_SECTION_3: case TITLE_SECTION_3:
{ {
// Reproduce la música if (counter > 0)
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED)) { // Reproduce la música
{ if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
JA_PlayMusic(titleMusic);
}
// Actualiza el contador de ticks
ticks = SDL_GetTicks();
dustBitmapR->update();
dustBitmapL->update();
// Actualiza la lógica del titulo
menu.active->update();
fade->update();
if (fade->hasEnded())
{
switch (postFade)
{ {
case 0: // 1 PLAYER JA_PlayMusic(titleMusic);
section.name = PROG_SECTION_GAME; }
section.subsection = GAME_SECTION_PLAY_1P;
JA_StopMusic();
break;
case 1: // 2 PLAYERS dustBitmapR->update();
section.name = PROG_SECTION_GAME; dustBitmapL->update();
section.subsection = GAME_SECTION_PLAY_2P;
JA_StopMusic();
break;
case 2: // QUIT // Actualiza la lógica del titulo
section.name = PROG_SECTION_QUIT; fade->update();
JA_StopMusic();
break;
case 3: // TIME OUT if (fade->hasEnded())
{
switch (postFade)
{
case 0: // 1 PLAYER
section.name = PROG_SECTION_GAME;
section.subsection = GAME_SECTION_PLAY_1P;
JA_StopMusic();
break;
case 1: // 2 PLAYERS
section.name = PROG_SECTION_GAME;
section.subsection = GAME_SECTION_PLAY_2P;
JA_StopMusic();
break;
case 2: // QUIT
section.name = PROG_SECTION_QUIT;
JA_StopMusic();
break;
case 3: // TIME OUT
counter = TITLE_COUNTER;
menu.active->reset();
if (demo)
{
runDemoGame();
if (section.name != PROG_SECTION_QUIT)
{
runInstructions(m_auto);
}
}
else
section.name = PROG_SECTION_LOGO;
break;
default:
break;
}
}
// Actualiza el tileado de fondo
updateBG();
// Comprueba las entradas para el menu
if (menuVisible == true)
{
menu.active->update();
}
// Comprueba si se ha seleccionado algún item del menú de titulo
if (menu.active->getName() == "TITLE")
{
switch (menu.active->getItemSelected())
{
case 0: // 1 PLAYER -> Cambia al manu de selección de jugador
menu.active = menu.playerSelect;
break;
case 1: // 2 PLAYERS
postFade = 1;
fade->activateFade();
break;
case 2: // OPTIONS
menu.active = menu.options;
optionsPrevious = *options;
break;
case 3: // QUIT
postFade = 2;
fade->activateFade();
break;
default:
break;
}
}
// Comprueba si se ha seleccionado algún item del menú de selección de jugador
if (menu.active->getName() == "PLAYER_SELECT")
{
switch (menu.active->getItemSelected())
{
case 0:
// Este item no se puede seleccionar y actua de titulo
break;
case 1: // BAL1
postFade = 0;
options->playerSelected = 0;
fade->activateFade();
break;
case 2: // AROUNDER
postFade = 0;
options->playerSelected = 1;
fade->activateFade();
break;
case 3: // BACK
menu.active = menu.title;
menu.playerSelect->reset();
break;
default:
break;
}
}
// Comprueba si se ha seleccionado algún item de opciones
if (menu.active->getName() == "OPTIONS")
{
switch (menu.active->getItemSelected())
{
case 0: // Difficulty
if (options->difficulty == DIFFICULTY_EASY)
options->difficulty = DIFFICULTY_NORMAL;
else if (options->difficulty == DIFFICULTY_NORMAL)
options->difficulty = DIFFICULTY_HARD;
else
options->difficulty = DIFFICULTY_EASY;
updateMenuLabels();
break;
case 1: // PLAYER 1 CONTROLS
updatePlayerInputs(0);
updateMenuLabels();
break;
case 3: // PLAYER 2 CONTROLS
updatePlayerInputs(1);
updateMenuLabels();
break;
case 5: // Language
options->language++;
if (options->language == 3)
options->language = 0;
updateMenuLabels();
break;
case 6: // Display mode
switchFullScreenModeVar();
if (options->fullScreenMode != 0)
{
menu.options->setSelectable(8, false);
menu.options->setGreyed(8, true);
}
else
{
menu.options->setSelectable(8, true);
menu.options->setGreyed(8, false);
}
updateMenuLabels();
break;
case 8: // Windows size
options->windowSize++;
if (options->windowSize == 5)
options->windowSize = 1;
updateMenuLabels();
break;
case 9: // FILTER
if (options->filter == FILTER_LINEAL)
options->filter = FILTER_NEAREST;
else
options->filter = FILTER_LINEAL;
updateMenuLabels();
break;
case 10: // VSYNC
if (options->vSync)
options->vSync = false;
else
options->vSync = true;
updateMenuLabels();
break;
case 11: // HOW TO PLAY
runInstructions(m_manual);
break;
case 12: // ACCEPT
applyOptions();
menu.active->reset();
menu.active = menu.title;
break;
case 13: // CANCEL
options = &optionsPrevious;
updateMenuLabels();
menu.active->reset();
menu.active = menu.title;
break;
default:
break;
}
}
if (menu.active->getName() == "TITLE")
{
counter--;
}
}
else if (counter == 0)
{
if (demo)
{
runDemoGame();
if (section.name != PROG_SECTION_QUIT)
{
runInstructions(m_auto);
}
init();
demo = false;
counter = TITLE_COUNTER; counter = TITLE_COUNTER;
menu.active->reset();
if (demo)
{
runDemoGame();
runInstructions(INSTRUCTIONS_MODE_AUTO);
}
else
section.name = PROG_SECTION_LOGO;
break;
default:
break;
} }
} else
// Actualiza el tileado de fondo
updateBG();
// Comprueba las entradas para el menu
if (menuVisible == true)
{
menu.active->checkInput();
}
// Comprueba si se ha seleccionado algún item del menú
if (menu.active->getName() == "TITLE")
{
switch (menu.active->getItemSelected())
{ {
case 0: // 1 PLAYER section.name = PROG_SECTION_LOGO;
postFade = 0;
fade->activateFade();
break;
case 1: // 2 PLAYERS
postFade = 1;
fade->activateFade();
break;
case 2: // OPTIONS
menu.active = menu.options;
optionsPrevious = *options;
break;
case 3: // QUIT
postFade = 2;
fade->activateFade();
break;
default:
break;
} }
} }
// Comprueba si se ha seleccionado algún item de opciones // Sección Instrucciones
if (menu.active->getName() == "OPTIONS") if (section.subsection == TITLE_SECTION_INSTRUCTIONS)
{ {
switch (menu.active->getItemSelected()) runInstructions(m_auto);
{ counter = TITLE_COUNTER;
case 0: // Difficulty demo = true;
if (options->difficulty == DIFFICULTY_EASY)
options->difficulty = DIFFICULTY_NORMAL;
else if (options->difficulty == DIFFICULTY_NORMAL)
options->difficulty = DIFFICULTY_HARD;
else
options->difficulty = DIFFICULTY_EASY;
updateMenuLabels();
break;
case 1: // PLAYER 1 CONTROLS
updatePlayerInputs(0);
updateMenuLabels();
break;
case 3: // PLAYER 2 CONTROLS
updatePlayerInputs(1);
updateMenuLabels();
break;
case 5: // Language
options->language++;
if (options->language == 3)
options->language = 0;
updateMenuLabels();
break;
case 6: // Display mode
switchFullScreenModeVar();
if (options->fullScreenMode != 0)
{
menu.options->setSelectable(8, false);
menu.options->setGreyed(8, true);
}
else
{
menu.options->setSelectable(8, true);
menu.options->setGreyed(8, false);
}
updateMenuLabels();
break;
case 8: // Windows size
options->windowSize++;
if (options->windowSize == 5)
options->windowSize = 1;
updateMenuLabels();
break;
case 9: // FILTER
if (options->filter == FILTER_LINEAL)
options->filter = FILTER_NEAREST;
else
options->filter = FILTER_LINEAL;
updateMenuLabels();
break;
case 10: // VSYNC
if (options->vSync)
options->vSync = false;
else
options->vSync = true;
updateMenuLabels();
break;
case 11: // HOW TO PLAY
runInstructions(INSTRUCTIONS_MODE_MANUAL);
break;
case 12: // ACCEPT
applyOptions();
menu.active->reset();
menu.active = menu.title;
break;
case 13: // CANCEL
options = &optionsPrevious;
updateMenuLabels();
menu.active->reset();
menu.active = menu.title;
break;
default:
break;
}
}
if (menu.active->getName() == "TITLE")
{
counter--;
} }
} }
@@ -569,6 +654,40 @@ void Title::checkEventHandler()
break; break;
} }
else if (eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0)
{
switch (eventHandler->key.keysym.scancode)
{
case SDL_SCANCODE_F:
screen->switchVideoMode();
reloadTextures();
break;
case SDL_SCANCODE_F1:
screen->setWindowSize(1);
reloadTextures();
break;
case SDL_SCANCODE_F2:
screen->setWindowSize(2);
reloadTextures();
break;
case SDL_SCANCODE_F3:
screen->setWindowSize(3);
reloadTextures();
break;
case SDL_SCANCODE_F4:
screen->setWindowSize(4);
reloadTextures();
break;
default:
break;
}
}
if (section.subsection == TITLE_SECTION_3) if (section.subsection == TITLE_SECTION_3)
{ // Si se pulsa alguna tecla durante la tercera sección del titulo { // Si se pulsa alguna tecla durante la tercera sección del titulo
if ((eventHandler->type == SDL_KEYUP) || (eventHandler->type == SDL_JOYBUTTONUP)) if ((eventHandler->type == SDL_KEYUP) || (eventHandler->type == SDL_JOYBUTTONUP))
@@ -792,6 +911,14 @@ void Title::updateMenuLabels()
// Recoloca el menu de titulo // Recoloca el menu de titulo
menu.title->centerMenuOnX(SCREEN_CENTER_X); menu.title->centerMenuOnX(SCREEN_CENTER_X);
menu.title->centerMenuElementsOnX(); menu.title->centerMenuElementsOnX();
// Establece las etiquetas del menu de seleccion de jugador
menu.playerSelect->setItemCaption(0, lang->getText(39)); // SELECT PLAYER
menu.playerSelect->setItemCaption(3, lang->getText(40)); // BACK
// Recoloca el menu de selección de jugador
menu.playerSelect->centerMenuOnX(SCREEN_CENTER_X);
menu.playerSelect->centerMenuElementsOnX();
} }
// Aplica las opciones de menu seleccionadas // Aplica las opciones de menu seleccionadas
@@ -812,32 +939,29 @@ section_t Title::run()
{ {
update(); update();
render(); render();
// Sección 3 - La pantalla de titulo con el menú y la música
// Sección Instrucciones
// if (section.subsection == TITLE_SECTION_INSTRUCTIONS)
//{
// runInstructions(INSTRUCTIONS_MODE_AUTO);
//}
} }
return section; return section;
} }
// Ejecuta la parte donde se muestran las instrucciones // Ejecuta la parte donde se muestran las instrucciones
void Title::runInstructions(Uint8 mode) section_t Title::runInstructions(mode_e mode)
{ {
instructions = new Instructions(renderer, screen, asset, lang); instructions = new Instructions(renderer, screen, asset, lang);
instructions->run(mode); section = instructions->run(mode);
delete instructions; delete instructions;
return section;
} }
// Ejecuta el juego en modo demo // Ejecuta el juego en modo demo
void Title::runDemoGame() section_t Title::runDemoGame()
{ {
demoGame = new Game(1, 0, renderer, screen, asset, lang, input, true, options); demoGame = new Game(1, 0, renderer, screen, asset, lang, input, true, options);
demoGame->run(); section = demoGame->run();
delete demoGame; delete demoGame;
return section;
} }
// Modifica las opciones para los controles de los jugadores // Modifica las opciones para los controles de los jugadores
@@ -960,4 +1084,14 @@ void Title::checkInputDevices()
temp.deviceType = INPUT_USE_KEYBOARD; temp.deviceType = INPUT_USE_KEYBOARD;
availableInputDevices.push_back(temp); availableInputDevices.push_back(temp);
printf("Device %i:\t%s\n\n", (int)availableInputDevices.size(), temp.name.c_str()); printf("Device %i:\t%s\n\n", (int)availableInputDevices.size(), temp.name.c_str());
}
// Recarga las texturas
void Title::reloadTextures()
{
dustTexture->reLoad();
coffeeTexture->reLoad();
crisisTexture->reLoad();
gradientTexture->reLoad();
createTiledBackground();
} }

View File

@@ -21,7 +21,7 @@
#define TITLE_H #define TITLE_H
// Textos // Textos
#define TEXT_COPYRIGHT "@2020,2022 JailDesigner (v2.1)" #define TEXT_COPYRIGHT "@2020,2022 JailDesigner (v2.1a)"
// Contadores // Contadores
#define TITLE_COUNTER 800 #define TITLE_COUNTER 800
@@ -35,10 +35,11 @@ class Title
private: private:
struct menu_t struct menu_t
{ {
Menu *title; // Menu de la pantalla de título Menu *title; // Menu de la pantalla de título
Menu *options; // Menú de la pantalla de opciones Menu *options; // Menú de la pantalla de opciones
Menu *active; // Menu activo (de momento para la pantalla del titulo) Menu *playerSelect; // Menu para elegir jugador
bool keyPressed; // Variable para evitar la repetición de teclas en los menus Menu *active; // Menu activo (de momento para la pantalla del titulo)
bool keyPressed; // Variable para evitar la repetición de teclas en los menus
}; };
// Objetos // Objetos
@@ -91,6 +92,9 @@ private:
std::vector<input_t> availableInputDevices; // Vector con todos los metodos de control disponibles std::vector<input_t> availableInputDevices; // Vector con todos los metodos de control disponibles
std::vector<int> deviceIndex; // Indice para el jugador [i] del vector de dispositivos de entrada disponibles std::vector<int> deviceIndex; // Indice para el jugador [i] del vector de dispositivos de entrada disponibles
// Inicializa los valores
void init();
// Actualiza las variables del objeto // Actualiza las variables del objeto
void update(); void update();
@@ -113,10 +117,10 @@ private:
void applyOptions(); void applyOptions();
// Ejecuta la parte donde se muestran las instrucciones // Ejecuta la parte donde se muestran las instrucciones
void runInstructions(Uint8 mode); section_t runInstructions(mode_e mode);
// Ejecuta el juego en modo demo // Ejecuta el juego en modo demo
void runDemoGame(); section_t runDemoGame();
// Modifica las opciones para los controles de los jugadores // Modifica las opciones para los controles de los jugadores
bool updatePlayerInputs(int numPlayer); bool updatePlayerInputs(int numPlayer);
@@ -127,6 +131,9 @@ private:
// Comprueba cuantos mandos hay conectados para gestionar el menu de opciones // Comprueba cuantos mandos hay conectados para gestionar el menu de opciones
void checkInputDevices(); void checkInputDevices();
// Recarga las texturas
void reloadTextures();
public: public:
// Constructor // Constructor
Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, options_t *options, Lang *lang, section_t section); Title(SDL_Renderer *renderer, Screen *screen, Input *input, Asset *asset, options_t *options, Lang *lang, section_t section);

View File

@@ -87,6 +87,7 @@ struct input_t
struct options_t struct options_t
{ {
Uint8 difficulty; // Dificultad del juego Uint8 difficulty; // Dificultad del juego
Uint8 playerSelected; // Jugador seleccionado para el modo 1P
std::vector<input_t> input; // Modo de control (teclado o mando) std::vector<input_t> input; // Modo de control (teclado o mando)
Uint8 language; // Idioma usado en el juego Uint8 language; // Idioma usado en el juego
Uint32 fullScreenMode; // Contiene el valor del modo de pantalla completa Uint32 fullScreenMode; // Contiene el valor del modo de pantalla completa

View File

@@ -1,23 +0,0 @@
x los items se quedan pegados en el techo (comprobar si sigue pasando, he cambiado la coreción al chocar arriba. Si sigue fallando se quita la comprobación superior)
x la maquina de cafe no toca el suelo
x las bolas verdes nacen naranja al explotarlas
falta el aura de superguerrero al pillar la maquina de cafe
x la powerball deja la mascara al explotarlas
los menus de pausa y game over falta poner bien los textos
x cuando continuas la partida sigues muerto
poder elegir el personaje para jugar
arreglar los smart sprites de muerte y de perder el cafe
arreglar los items de las instrucciones
que cicle la musica en el titulo, demo, instrucciones
que guarde el progreso del juego
que aumente la velocidad de las nubes conforme avanzas
retocar un poco la distancia entre los cambios de color del cielo, se llega al oscuro muy pronto
x las balas deberian llegar a salir de la pantalla
x hacer desaparecer los accesos a disco en el juego. cargar todos los recursos previamente y pasarlos por punteros
x la powerball se para con el reloj y sigue rodando
x acelerar la animacion de disparar recto
x no pone la animacion corecta al no disparar con el powerup
que grite "yiiijaa!" o algo parecido al coger la maquina de cafe
o que diga DIMONIS! en un globo de texto que se evapore
podrian salir comentarios aleatoriamente o con ciertos eventos (falta ver si no estorbará)
que se vea el nivel de dificultad