Documente Academic
Documente Profesional
Documente Cultură
en GameMaker: Studio
ndice
Prlogo
Parte1:Prepararlosrecursos
Instalarlafuente
Importarlosgrficos
Importarelaudio
Parte2:Espaciodejuegoyobjetosbase
Creandolaroom
Creandoelobjetoparabola
Creandoelobjetoparaeljugador
CreandoelobjetoparalaCPU
Aadelosobjetosalaroom
Parte3:MovimientodeljugadorylaCPU
Movimientodeljugador
MovimientodelaCPU
Parte4:Colisionesbsicas
Contralasparedes
ContraeljugadorylaCPU
Parte5:Gestindeladificultad
HacerlaCPUmshumana
Incrementarvelocidad
Parte6:Marcadordepuntos
Aadelafuente
Crearelobjetomarcador
Incrementarelmarcador
Reiniciarlapartida
Parte7:Sonidos
Parte8:Creandounaportadaconmen
Creandoobjetosyroomdeinicio
Aadiendofuncionalidadalosbotones
Parte9:Mejorandoelmen
Rotandoelttulo
Aadiendoopacidadoalosbotones
Melodaenlaportada
Redisearlainterfaz(optativo)
Parte10:ltimosretoquesydistribucin
Evitarqueelcursorsesalgadeventanaduranteeljuego
Desactivarelcursorduranteeljuego
Controladorglobal
Prepararladistribucin
Generarelejecutable
Despedida
Prlogo
Cun divertido puede ser programar siempre servicios? Aprendemos montones de lenguajes de
programacinsloparaacabarhaciendolomismo,msrpido,perolomismoendefinitiva.
Siempre he jugado videojuegos, pero nunca me haba planteado hacerlos yo. Para m este tema
estaba a otro nivel, muy superior. Debe ser porque soy ms de la vieja escuela,delosquenosgusta
poner las manos en la masa. Durante aos tuve en la mente la idea de que hacer un videojuego
estaba directamente relacionado con crear tu propio motor grfico, y yo no tena el conocimiento ni
tiempoparaesascosas.
Pero inevitablemente el mundo avanza, uno lee y oye cosas Videojuegos de todo tipo empiezan a
triunfar, algunos para ordenador, otros para mviles, para la web, descubres que en Steam se ha
empezado a apostar muy fuerte por los indies, campaas de crowdfunding (mecenazgo) para
financiar proyectos tienen muy buenos nmeros y ttulos independientes llenan portadas de webs y
revistasespecializadas.
En serio algo que est al alcance de tan pocos puede mover a tanta gente? Y la respuesta es
simplementeno.
Era la oportunidad perfecta para hincarle el diente y probar de hacer algo, pero lo que me pas fue
sorprendente. Empec haciendo cosas sencillas, luego pas a otras ms complicadas y empec a
notarquemegustaba,medivertahaciendojuegosdepruebayprobandoideasextraas.
Me gustaba tanto que cada vez quera aprender ms y ms. Investigando descubr programas como
Unity, enfocado sobretodo al 3D y Game Maker Studio, al 2D. Como quera empezar por las bases
decidcomenzarconGameMakerStudioydesdeentoncesnohepodidoparar.
Despus de casi un ao en este mundo, creo que los videojuegos son la culminacin entre el arte y
creatividad, como la fusin entre el cuerpo y la mente que da la chispa de la vida. so es lo que los
hace tan especiales, permiten explorar formas distintas de expresar y comunicar.Laprogramacines
laherramientaqueloengranatodoyhacequefuncione,peroellmiteestuimaginacin.
Yesquesitegustajugarvideojuegos,imagnatecomoseracrearlos.
Hctor Costa Gumn
21 de Septiembre del 2015
Parte 1: Preparar los recursos
Instalar la fuente
A continuacinvamosaimportarloscomponentesgrficosdelpack.Crea unnuevoproyectodeGM:S
yarrastralosficherosgrficosdelacarpeta
Recursos\graficos
dentrodelprograma.
Indica Sprite en el cuadro de dilogo para los ficheros pong_ball, pong_player, ttulo,
btn_3_puntos,btn_10_puntosybtn_salir:
Cambiasusnombresdelasiguientedelasiguienteforma:
pong_ballspr_bola
pong_playerspr_jugador
ttulospr_titulo
btn_3_puntosspr_btn_3_puntos
btn_10_puntosspr_btn_10_puntos
btn_salirspr_btn_salir
Entodosestablecesupuntodeorigenalcentro.LuegoconfirmaenOK:
pong_field:
IndicaBackgroundparaelfichero
Cambiasunombredelasiguientedelasiguienteforma:
pong_fieldbg_tablero
ConfirmaenOKsinhacerningunamodificacin.
Importar el audio
De la misma forma que antes vamos a importar el audio. Arrastra los sonidos de la carpeta
Recursos/audio aGM:SyseleccionaSoundenelcuadrodedilogo:
Cambiaelnombredelossonidosdelasiguienteforma:
pong_wallsnd_pared
pong_hitsnd_toque
pong_failsnd_fallo
15_melody_LASTBEATsnd_melodia
PulsaenOKyguardalossonidossinhacerningncambioms.
Hazclicderechoenroomsyaadeunanuevaroom.Enlapestaasettingsestablece:
Name:rm_tablero
Width:640
Height:480
Speed:60
bg_tablero:
Enlapestaabackgroundsseleccionadeimagendefondoel
Unavezlotengastodolistoguardahaciendoclicenelticverdedelaesquinasuperiorizquierda:
x = room_width/2;
y = room_height/2 + choose(-100, 0, 100);
velocidad_base = 5;
speed = velocidad_base;
Hazclicderechoen
obj_jugador
yhazDuplicate,daledenombrealnuevoobjeto
obj_cpu
.
Vamos a aadir un movimiento sencillo al jugador, simplemente haciendo que ste siga la posicin
verticaldenuestroratn.AadimosuneventoStepyunbloquedecdigoal obj_jugador :
Movimiento de la CPU
Para la CPU haremos un clculo que mover en la direccin de la bola la paleta, con una velocidad
constante. Precisamente la dificultad del juego depender de la velocidaddemovimientodelapaleta,
cuantamsvelocidadmsdifcilsereljuego.
/// IA Simple
if instance_exists(obj_bola) {
if(obj_bola.y > y) y+=abs(obj_bola.vspeed*1.5);
else y-=abs(obj_bola.vspeed*1.5);
y = clamp(y, 115, 410);
}
Parte 4: Colisiones bsicas
Contra las paredes
Para simular la colisin contra las paredes, rectificamos la posicin vertical y daremos un ngulo
inversoalabola.
Abreel
obj_bola yaadeuneventoStep.Arrastraunapiezadecdigoconelsiguientecontenido:
if (y < 82) {
y = 82;
colision = true;
}
if (y > 440) {
y = 440;
colision = true;
}
if (colision) {
direction = -direction;
}
Para simular la colisin contra los jugadores utilizaremos un sistema de colisiones dinmicas
dependiendodelaparteconlaquegolpeamoslabola:
Siledamosporlapartesuperiorlamandaremosporarriba
Siledamosporelcentrolamandaremosporelmedio
Siledamosporlaparteinferiorlamandaremosporabajo
La frmula que utilizaremos variar dependiendo si la bola viene por la izquierda o por laderecha,ya
quetenemosqueestablecerelnuevongulo:
Porlaizquierda: direccion=180(raqueta.ybola.y)
Porladerecha: direccion=raqueta.ybola.y
Siguiendo en el evento step de la bola, agrega otra pieza de cdigo (distinta a la anterior) y aadeel
siguientecdigo:
/// IA Simple
if instance_exists(obj_bola) {
if(irandom(4)<3){
if(obj_bola.y > y) y+=abs(obj_bola.vspeed*1.5);
else y-=abs(obj_bola.vspeed*1.5);
}
y = clamp(y, 115, 410);
}
Aadiendoelrandom,hayunaposibilidaddequenosigaelmovimientoysequederezagada.
Incrementar velocidad
Para hacer el juego un poco ms difcil la forma ms fcil es incrementar la velocidad de movimiento
delabolaunpococadavezqueunjugadorlagolpea.
if (colision){
// Incrementamos la velocidad
speed += incremento;
if (speed>25) speed = 25;
}
draw_set_halign(fa_right);
draw_text(288,28, string(global.puntos_cpu) );
draw_set_halign(fa_left);
draw_text(354,28, string(global.puntos_jugador) );
Aadeunainstanciadelobjetoenlaroom
yponeljuegoenmarchaparaverelresultado:
Incrementar el marcador
Para que el marcador se incremente hay que capturar el momento en que la bola sale de la room.
Dependiendo del lado sabremos quin ha ganado el punto. Inmediatamente cuando so suceda
borraremoslainstanciadelabola.
Enelobjetoobj_bola
aadeunapiezadecdigonuevaeneleventostepconelsiguientecdigo:
/// Detectar si hay puntos
if (x<0) {
global.puntos_jugador++;
instance_destroy();
}
if (x>room_width) {
global.puntos_cpu++;
instance_destroy();
}
Reiniciar la partida
Dado que el objeto marcador es persistente podemos reiniciar la partida utilizando el mtodo
room_restart() sin que ste reinicie las puntuaciones en el momento que algn jugador marque un
punto.
Para hacer la transicin ms suave y no de golpe, en lugar de reiniciar inmediatamente despus del
puntosepuedeutilizarunaalarmaenelmarcadorqueseencargardereiniciarlaroom.
Ahora simplemente vuelve al momento en que incrementamos el marcador y llama la alarma del
marcadoralcabode1segundoymedio:
if (x>room_width) {
global.puntos_cpu++;
obj_marcador.alarm[0] = room_speed * 1.5;
instance_destroy();
}
if (colision) {
direction = -direction;
Eneldecolisincontrajugadores:
if (colision){
// Incrementamos la velocidad
speed += incremento;
if (speed>25) speed = 25;
Yeneldedetectarsihaypuntos:
instance_destroy();
}
if (x>room_width) {
global.puntos_cpu++;
obj_marcador.alarm[0] = room_speed * 1.5;
instance_destroy();
}
Elmenquetepropongovaaconstarde3opciones:
Jugara3victorias
Jugara10victorias
Salir
Parapoderaadirelttuloylosbotonestendrsquecrear4objetosyasignarlesestossprites:
obj_titulospr_titulo
obj_btn_3_puntosspr_btn_3_puntos
obj_btn_10_puntosspr_btn_10_puntos
obj_btn_salirspr_btn_salir
Unavezlostengascreaunanuevaroom rm_portada :
Width:640
Height:480
Speed:60
BackgroundsColor:seleccionaelcolornegrodefondo
Ahoraabreel
obj_btn_salir
,creauneventoMouseLeftPressedyaadeunapiezadecdigo:
/// Salir del juego
game_end();
Ahoraabreel
obj_btn_3_puntos
,aadeotroeventoMouseLeftpressedyaadeelcdigo:
Hazlomismoconelobj_btn_10_puntos:
Parte 9: Mejorando la portada
Unaformadehacermsamigabletuinterfazesaadiendomovimientooelementosinteractivos.
Rotando el ttulo
AhoraaadeunEventoStepyunapiezadecdigoparacontrolarelngulodelaimagen:
Poneljuegoenmarchayobservacomoelefectodemovimientoempiezaadarleuntoquedistinto.
Cuandolotengaslistoaadealobj_btn_baseuneventoCreateconelcdigosiguiente:
AcontinuacinaadeuneventoMouseMouseEnter,paradetectarcuandoelcursorestsobreel
objeto.Aadeunapiezadecdigo:
HazlomismoenuneventoMouseMouseLeave,paradetectarcuandoelcursornoestsobreel
objeto:
/// Botn inctivo
activo = false;
Finalmentecontrolaelprocesodedibujoparaaadirlaopacidad,aadiendouneventoDrawconel
siguientecdigo:
/// Dibujar el botn transparente o no
if(!activo) draw_set_alpha(0.7);
draw_sprite(sprite_index,image_index,x,y);
draw_set_alpha(1);
Como los hijos heredarn el cdigo del padre, ya debera funcionar y si pones el juego en marcha
notars las opciones del men un poco transparentesy cuandopasaselratn porencimaseiluminan
unpocoms.
Meloda en la portada
Otroaspectoquedaunbuentoqueanuestrosjuegoseslamsica.Headjuntadounamelodaen
8bitsquepuedequedarbienconelestilodeljuego.
Parareproducirlavealaroom
rm_portada yhazclicenCreationCode:
Aadelasiguientepiezadecdigoparareproducirelsonido:
audio_stop_all();
audio_play_sound(snd_melodia,100,true);
Delamismaformadebesasegurartequealiniciareljuegolamsicapare.Abrelaroom
rm_tablero
y
ensuCreationCodeaadelosiguiente:
audio_stop_all();
Listo,yatieneslamelodafuncionando.
window_set_cursor(cr_handpoint);
sto activar el cursor si est inactivo y le dar el icono de mano haciendo clic de Windows. A
continuacin ve a la room rm_tablero y en su Creation Code aade este otro cdigo al final para
desactivarelcursor:
window_set_cursor(cr_none);
Ahorayadeberaquedarperfecto.
Controlador global
Es un poco incmodo que nuestro juego no tenga una forma de volver atrs. Puedes aadir un
controlador global que capture en todo momento si apretamos por ejemplo la teclaESC paravolvera
laroomanteriorosalirdeljuegosiestamosenlaportada.
Preparar la distribucin
Seguramente ya te has percatado que cuando pones el juego en marcha se muestra por defecto el
nombreGameMaker:Studioysaleuniconoblancoconellogodelprograma:
ParaeditarestosvaloresdebesiralapartadoGlobalGameSettings,pestaaWindows:
En Display Name pon el nombre del juego que quieras, por ejemplo Pong: Remake. Optativamente
tambinpuedeseditarotrainformacin:
Version:Versindelejecutable
Company:Nombredelacompaaodeldesarrollador
Product:Nombredelproducto
Copyright:Informacinacercadeltitulardelosderechos
Descripcin:Breveexplicacindeljuego
En la parte derecha podrs cambiar tambin el Splash Screen, la imagen que sale mientras secarga
eljuego,oelegirsiquieresonomostrarunamarcandoDisplaySplashScreen.
Generar el ejecutable
Yaesttodolistoparadistribuireljuego.
PrimeroestatesegurodetenermarcadoTargetWindowsenelmensuperior:
Acontinuacinvealiconodedistribucinenelmensuperior:
SeleccionaeltipoSingleruntimeexecutableparacrearunejecutableenunficheronico:
Guardaryesperaaquesegenere.Unavezlistodeberasvereliconoenelprograma:
YsiponeseljuegoenmarchatambinaparecereliconoenlabarradeWindowsyenlaventana:
Felicidades!Yatieneseljuegoacabadoypuedescompartirlocontusamigos.
Despedida
AsacabaestemanualpasoapasosobrecmocrearunjuegoretroestiloPong.
Esperoquetehayagustadoyhayasaprendidounpocomssobreestemundo,sinembargostono
esunadespedidadeverdad.Siquieresseguiraprendiendoacrearnuevosvideojuegosconmis
vdeosotienesalgunadudapsatepor
micanaldeYoutube
ovisita
miblogpersonal
.
Hastaentoncestedeseolomejorymedespidoconunademisfrasesfavoritas: