Sie sind auf Seite 1von 92

Sprites: son los dibujos que usaras para todo lo que tenga alguna accin en el juego, como

pueden ser los personajes, tanto el jugador como los enemigos, tambin alguna pared, o el
suelo. Estars pensando pero si una pared y un suelo no se mueven como podran tener
acciones? La verdad es que aunque directamente no poseen acciones sobre estos se ejercen
acciones de colisin.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Sounds: Aqu podrs subir una lista de sonidos, o msica la cual utilizaras en el juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Backgrounds: Aqu subirs, o crearas las imgenes que sern usados para el fondo de tus
juegos, cuando dije crear lo digo en sentido literal, ya que el game maker posee su propio
editor de imgenes, con el cual podrs crear o editar las imgenes.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Paths: Ac podrs establecer rutas predeterminadas las cuales al colocarlas en algn
personaje este se mover en las coordenadas indicadas en el path, es muy usado para
simular la inteligencia artificial.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Scripts: Esto se usa para lo siguiente, digamos que ya sabes usar el gml, y hay un cdigo el
usaras en varios personaje, para evitar estar copiando y pegando cdigos, lo que haces es
que creas un script digamos scrCode, y lo llamas desde cada personaje scrCode (); como
vez evitas el copiar y pegar.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Fonts: Es usado para cambiar las fuentes de los textos que uses en el juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Time Lines: Esto se usa para tiempos, es decir que podrs hacer que cada cierto tiempo se
ejecute una accin distinta, es comnmente usado para crear enemigos, o para hacer que
algn personaje realice unas series de acciones a cada cierto tiempo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Objects: Aqu se crean los personajes, es decir creas un object, a este object le asignas un
sprite, luego en el objects le das las acciones correspondientes y as quedara listo, el
personaje, para lograr esto hay una serie de eventos, en donde colocaras las acciones, y

varias pestaas para que uses los D&D, o cdigos GML, observa la imagen.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En Name le colocas el nombre a tu personaje, recomiendo que uses como inicial para
cualquier nombre las siglas obj. ejemplo objRobot, esto para mantener organizado mejor
tus recursos.
Como logras ver esta un botn que dice Add Event, en el cual al hacer click se muestra la
pantalla para seleccionar events, y como puedes ver hay varios events, los cuales son:
Create, Destroy, Alarm, Step, Collision, Keyboard, Mouse, Other, Draw, Key press, Key
Release, Cancel. A continuacion te explico cada una.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Crate: Este tiene como funcin ejecutar las acciones de primero, es decir que
ejecuta los cdigos o D&D en este event antes que cualquier otro. Es muy usado para
declarar tus propias variables, o para que se ejecute algn cdigo una sola vez, por que
aunque es ejecutado antes de todo, tan bien se ejecuta al inicio del nivel es decir al
momento en que es cargado la instancia en el room. Por ejemplo si colocara en el event
crate de un auto, move_towards_point (objauto.x, objauto.y, 5) al momento de ser
cargado se dirigira asa el objauto pero no cambiaria su direccin inicial es decir solo
ejecuto el cdigo de perseguir una vez y nada mas
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Destroy: Este event ejecuta las acciones sean de gml o d&d, justo antes de que la
instancia sea destruida. Es comnmente usado para sumar score, y cosas as.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________Event Alarm: Como se puede ver usan
como icono un reloj, eso es por que este event ejecuta las acciones segn el tiempo y
alarm indicadas, a ver explico, este event puedes seleccionar a cada object, 10 alarm, y
claro esta que hay 10 formas de llamar a que se ejecute, primero seleccionamos cuando
deba ejecutarse sea con el d&d alarm en la pestaa Main 2, o en gml escribiendo alarm
[numero de alarm]=tiempo de ejecucin;
Ms adelante se explicara mejor.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Step: Este event resulta que posee 3 fases que son: Begin step, Step, End step.
Begin step: ejecuta las acciones de primero, Step: es la parte media, y End step la parte
final, a ver me explico, los cdigos en cualquiera de los 03 tipos de step se ejecutaran una
y otra vez, pero se pueden realizar comparaciones de las variables desde el Begin step, al
step, y por ultimo el End step, por mi parte en lo particular lo he usado de la siguiente
manera, los cdigos de movimientos (cuando no uso evento de teclas) lo hago en el event

step, y el cambio de sprites en el End step, en el event Begin step, por lo general comparo
vidas, y las acciones que ejecutara cuando no tengan mas, claro hay eventos para esto,
pero esto seria para las vidas que declare para los enemigos.
A ver un ejemplo mas detallado si coloco este cdigo en el event step move_towards_point
(objauto.x, objauto.y, 5) suceder que la instancia que posea ese cdigo perseguir al
objauto a todo momento.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision: Este event solo ejecutara las acciones al momento en que se encuentren
los sprites de 2 instancias. En pocas palabras es un event de choque. Yo lo he usado para
las balas que al colisionar contra el enemigo el enemigo se destruya, lo he usado en
plataformas para que pueda caminar sobre los object de suelo, para juegos donde
destruyes al enemigo al caerle encima, y otros como esos.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Keyboard: este event es de acciones de teclado es decir que al presionar en este
botn de event te dar a seleccionar uno de los botones del teclado, y ejecutara las
acciones que coloque en este, cuando se mantenga presionado ese botn del teclado.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Mouse: Este event es de acciones del mouse, al presionar sobre el botn de
seleccin de este event te dar a escoger entre varias de sus opciones como son, cuando el
mouse esta sobre alguna instancia, cuando el mouse deja de estar sobre alguna instancia,
cuando se presiona click sobre alguna instancia, o en global cuando se presiona alguno de
sus botones sobre la pantalla en general.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Other: La verdad en este event al dar click salen una serie de event que puede usar
en tus juegos, yo no los uso, pero cuando me inicie en esto lo asia siempre, explicare los
mas importantes.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Outside room: Este se ejecutara solo cuando la instancia salga de los bordes del room, yo
lo use cuando cree mi primer juego para que al salir por la derecha apareciera a la
izquierda, y viceversa.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________

Game Start: Este lo usas ms que todo para declarar las vidas de tu personaje o para
declarar variables globales. Ya que este solo ejecuta las acciones al momento en que
inicie el juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Game End: Este ejecuta sus acciones un segundo antes de cerrar el juego, yo la verdad la
use en algunos juegos para mostrar la pgina de descarga del juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Room Start: Solo ejecuta las acciones al momento en que el room inicia.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Room End: ejecuta las acciones justo antes de salir del room, lo sigo usando para salvar el
juego, como un auto save.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

No more lives: Ejecuta las acciones solo cuando usas la variable lives para las vidas o el
d&d que se encuentra en la pestaa escore con icono de un corazn de nombre Set lives, si
usas alguna de estas para las vidas de tu personaje, esto ejecutara las acciones cuando las
vidas sean igual o menor que 1.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Animations end: Ejecuta las acciones cuando el sprite de esa instancia llega a su ultima
sub imagen, comnmente usado para juegos de peleas, o sprites de un personaje cuando
fllese, ente otros
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

End of Path: si usas un path para ese personaje, con este event puedes establecer que
suceder al culminar la ruta del path.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Event Draw: Este es usado para crear acciones de dibujo, es decir para todo lo que sea
dibujado, como texto en pantalla, barras de energas, score, vidas, y otros Es importante
recalcar que cuando usas este evento el object que lo usa no se vera, al menos que uses
este cdigo. draw_sprite_ext (sprite_index, image_index, x, y, image_xscale,
image_yscale, image_angle, image_blend, image_alpha); Si te estas preguntando el Por
qu?, esto se debe a que el game maker por defecto coloca ese cdigo a los objects cuando
son creados y es invisible, pero al usar el event draw ese cdigo es descartado, por lo que
debes indicar que se use de nuevo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Key Press: muy parecido al event keyboards, solo que este solo ejecutara las acciones al
instante en que es presionada la tecla indicada.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Key Release: Igualmente es un event de teclado, pero solo ejecuta las acciones al instante
en que se suelta una tecla. Es usado mucho para detener el movimiento, o para cambios de
sprite.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Ya hemos visto un resumen de la estructura del game maker ahora a lo que nos trajo este
tutorial los D&D y su traduccin y uso en GML.
Iniciare indicando que, al momento en que creas un object justo a la derecha logras per
varias pestaas las cuales son Move, Main 1, Main 2, Control, Score, Draw, hay una ventana
que se muestra solo en la versin paga que es Extra, por que solo es opcional no la
mostrare en este tutorial. Ahora explicare cada una de la siguiente manera, vern una
imagen donde aparecern los D&D, yo les explicare cada D&D de izquierda a derecha e
iniciando desde arriba asa abajo, claro usando el nombre del D&D, el cual pueden ver solo

dejando por un momento el puntero del mouse colocado por encima del D&D, as estarn
claros de que D&D estoy hablando.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

MOVE.

1.- Move Fixed: Es una accin de movimiento, con la cual seleccionas la direccin en la que
deber moverse, y la velocidad, este es comnmente usado para juegos en los event de
teclados, para mover a un personaje.
Sus equivalentes en GML son estos.
Izquierda (left) action_move ("000100000", sp); sp=velocidad por defecto usa 5.
Derecha (Right) action_move("000001000",sp);
Arriba (up) action_move("000000010",sp);
Abajo (Down) action_move("010000000",sp);
Diagonal Arriba izquierda. action_move("000000100",sp);
Diagonal Abajo izquierda. action_move("100000000",sp);
Diagonal Arriba Derecha. action_move("000000001",sp);
Diagonal Abajo Derecha. action_move("001000000",5);
As podrs usarlas sin problemas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

2.- Set direction a speed motions. Es igualmente una accin de direccin, solo que esta la
usas en grados, en Direction colocas la direccin a mover, y en speed la velocidad, su
equivalente en GML, es direction= dir speed= sp; lo que dir seria la direccin, por si no
conoces los grados a continuacin los indico.
Izquierda (left) 180

Derecha (Right) 0
Arriba (up) 90
Abajo (Down) 270
Diagonal Arriba izquierda. 135
Diagonal Abajo izquierda. 225
Diagonal Arriba Derecha. 45
Diagonal Abajo Derecha. 305
As podrs usarlas sin problemas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

3.- move towards point: Este hace que la instancia se mueva a la posicin X,Y que indiques
a la velocidad sp, que indiques, su equivalente en gml es move_towards_point(x,y,sp).
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

4.- speed Horizontal: este solo indica movimiento horizontal, el valor positivo de este seria
asa la derecha, y valor negativo asa la izquierda. Su gml es speed, se usa as hspeed=5;
para la derecha; hspeed=-5; para la izquierda.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

5.- Vertical Speed: Este se usa para movimiento vertical, el valor positivo de este es asa
abajo, y el valor negativo de este es asa arriba, su equivalente en gml es vspeed, y se usa
as vspeed=5; cae, vspeed=-5; sube.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

6.- Set Gravity: Este se usa para establecer gravedad, es mayormente usado en juegos de
plataformas, en direction colocas en grados la direccin en la que ejerce la gravedad, y en
gravity la fuerza de gravedad, su equivalente en gml es gravity= y gravity_direction=, lo
comn es que la gravedad tenga valor de 0.7 y en gravity direction 270, o la que necesites,
recuerda es en grados.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________

7.- Reverse Horizontal: se usa como accin de rebote horizontal, su equivalente en gml es
hspeed*=-1;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

8.- Reverse Vertical: se usa como accin de rebote vertical, su equivalente en gml es
vspeed*=-1;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

9.- friction: se usa para ralentizar la velocidad en una instancia, comnmente usado en el
event crate, o en collisin, su equivalente en gml es friction=0.1;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

10.- Jump to position: La verdad se usa para indicar que la instancia se transporte a una
nueva coordenada X, Y, su equivalente en gml seria X= coordenada, Y=coordenada,
recuerda que X es todo lo horizontal, y Y todo lo vertical.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________

11.- Jump to start: Es usado para que una instancia regrese al punto de partida en ese
room, su equivalente en gml es, X=xstart; Y=ystart;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

12.- Jump to random: Es usado para que una instancia se transporte a alguna posicin
aleatoria del room, su equivalente en gml es move_random (0,0); en 0 colocas el salto.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________

13.- Aling to grip: una grilla son los recuadros en los que divides el room, esto se usa para
alinear instancia entre esos recuadros, el comnmente usado en juegos del tipo Maze, o de
Estrategias. Su equivalente en gml es move_snap(16,16); en 16 lo coloque si fuera mi
instancia de 16x16 de resto cambiaria ese valor.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

14.-Wrap Screen: Se usa mucho en el event other en out side room, ya que este lo que
hace es que sea transportado a otro lado del room, en gml seria move_wrap(1,1,1), aunque
se podra definir tomando en cuenta las distancias del room, seria algo como esto, if x<0
{x=room_width} si sale por la izquierda aparece a la derecha. If x>room_width {x=0;} si
sale por le derecha aparece a la izquierda.
If y<0 {y=room_height} si sale por arriba aparece por debajo.
If y>room_height {y=0} si sale por debajo aparece por arriba. En un plataforma se usa
mucho esta ultima para indicar que te as cado, as if y>room_height {lives-=1;
room_restart()} si cae por debajo del room pierde una vida y se reinicia el nivel.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

15 .- Move to contac: Con esto podrs indicar la direccin en la que se mover al estar en
contacto con ese object, es usado en el event de collision, en el plataformas en el event de
collision con el suelo. Su equivalente en gml es move_contact_solid(dir,-1);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

16.- Bounce Againt objects: Es para rebotes, se usa en event de collision, en gml seria
move_bounce_solid (false); claro tambin podras combinar hspeed*=-1; vspeed*=-1; as se
lograra el mismo efecto.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

17.- set path: se usa para llamar a ser ejecutado un path que crearas, su equivalente en
gml es path_start (path0, sp, 2, false); cambia path0 por el titulo del path que creaste y sp
por la velocidad de movimiento.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________

18.- En path: Se usa para finalizar el uso del path en esa instancia, en gml seria path_end
().
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

19.- Path position: Se usa para determinar posicin del recorrido del path, en gml seria
path_position=0.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

20.- Path Speed: Se usa para determinar la velocidad del path, es usado en el event End
path de others. Para cambios en la velocidad, y el algunos casos en event de colisin, en
gml seria as path_speed=sp.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

21- Step towards: Es parecido a move towards point, en gml seria, mp_linear_step
(x,y,sp,0)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

22.- Step Avoiding: Es parecido al anterior pero esta vez esquivara los objetos en su
camino, en gml seria mp_potential_step(x,y,sp,1)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Ya con esto culminamos con la pestaa move de los D&D, ahora pasaremos la siguiente
pestaa Main 1.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

MAIN1.

Como vez he numerado cada uno de los d&d de esta pestaa, que ahora explico.

1.- Crate instante: Este d&d es usado para crear una instancia en las coordenadas X,Y que
indiques, como se que va siendo hora de explicar lo que es instancia, como ya sabes que es
un object te dir que la instancias son los object una vez colocados dentro del room. As
que las instancias son partes de los objects. Para que se podra usar, uf la verdad es que
siempre se usa al crear disparos, ya que estos solo son la creacin de una instancia del tipo
bala, tambin para enemigos, puertas, llaves, poderes, y muchas cosas mas
En gml seria instante_create(x,y,obj) donde obj es el object del cual se crea la instancia.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

2.- Crate Moving: la verdad aunque nunca le he dado uso, se usa para mover una instancia
que a sido creada. En gml seria ver la id de la instancia creada y luego usar un cdigo de
movimiento para la instancia de esa ID.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

3.- Crate random: Este d&d lo usas para seleccionar 4 distintas instancias a crear y solo se
crea una siendo escogida entre las 4, en gml seria as instance_create(x, y, choose (int1,
int2, int3, int4)) int es el nombre del object de la cual quieres crea instancias.
Esto lo he usado para bonus, para que al destruir algo salga al azar sea un arma, dinero,
comida, etc.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

4.- Change instance: Se usa para cambiar la instancia e un object por otra tipo de instancia
de cualquier otro object, podras usarlos para transformaciones de tus personajes o
enemigos. En gml es as instance_change (obj, 1).

______________________________________________________________________________
______________________________________________________________________________
____________________________________________

5.-Destroy instance: Se usa para destruir una instancia (no al object), en gml seria
instance_destroy();
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

6.- Destroy at position: Se usa bsicamente para lo mismo que destroy instance, solo que
ac destruyes la instancia en la posicin X,Y que indicas. En gml seria, position_destroy
(x,y)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

7.- Change Sprite: se usa para cambiar el sprite a tu personaje, en gml seria
sprite_index=spr en spr colocas el nombre del sprite.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

8.- Transform sprite: se usa para cambiar el tamao del sprite durante el juego, e gml
seria image_xscale, image_yscale. (Solo si tienes la versin paga del programa)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

9.- Color sprite: realiza un teido de color al sprite, en gml es image_blend=c_color;


(versin paga (pro))
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

10.- play sound; se usa para reproducir sonidos durante el juego. En gml es sound_play
(snd); pero para msicas usa sound_loop(snd); en snd colocas el nombre del sonido a usar.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________

11.- Stop Sound: Se usa para detener algn sonido o msica. En gml es asi sound_stop(snd)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

12.- Check sound: Se usa para verificar si existe en la carpeta de sounds el sonido a
reproducir. En gml es as. If sound_exists(snd) {sound_play(snd)} es para evitar errores.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

13.- Previous room: Con esto regresas al room anterior. En gml room_goto_previous()
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

14.-. Next room: Con esto vas al siguiente room. En gml room_goto_next()
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

15.- Restart room: Con este reinicias el actual room. En gml room_restart()
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

16.- Different room: Con esto vas al room que elijas. En gml room_goto(rm) rm seria el
nombre del room al que ira.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

17.- Check previous: se usa para verificar si existe un room antes del actual. En gml seria if
room_exists(previous) {room_goto_previous();}
______________________________________________________________________________
______________________________________________________________________________

____________________________________________

18.- Check next: se usa para verificar si existe un room siguiente al actual. En gml seria if
room_exists(next) {room_goto_next();}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Con esto hemos terminado la ventana Main 1, ahora aprenderemos sobre la ventana Main2.
Por lo pronto aca esta la imagen de guia.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

MAIN2.
1.- Set alarm: Aqu podrs escoger cual de los event alarm activa en cuanto tiempo,
recuerda que para esto el object debe estar en movimiento aunque hay un metodo en gml
para que no sea as, al seleccionar este event selecciona el event de alarm que activara,
coloca el tiempo en number steps, y marca la casilla relative. En gml seria alarm [ea]=tma;
ea=event alarm por activar, tma tiempo. Para que esto sea automtico salo as alarm [0]=
1*room_speed; as se descontara el tiempo aunque el object no se mueva.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

2.- sleep: Esto se usa para paralizar todas las funciones del juego durante el tiempo que
necesites. En gml seria sleep(tm)tm= tiempo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

3.- Set time line: se usa para llamar a una time line que crearas con anterioridad. En gml
seria timeline_index=titulo_de_timeline.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________

4.-time line position: la verdad es mas usado para indicar la posicin en la que debera
iniciar la time line. En gml seria timeline_position=4.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

5.-Display message: Se usa para que aparesca un cuadro de dialogo, con el mensaje escrito
en este. En gml es show_message("mensaje")
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

6.-show info: Es usado para que se muestre la pantalla de informacin. En gml es


show_info(),
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

7.- Restart Game: Se usa para que reinicie el juego, lo podras usar cuando ya no tenga
ms vidas el personaje. En gml es as game_restart();
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

8.-End Game: se usa para finalizar el juego. En gml seria game_end();


______________________________________________________________________________
______________________________________________________________________________
____________________________________________

9.-Save Game: Se usa para guardar la partida. En gml seria game_save(savegame)


______________________________________________________________________________
______________________________________________________________________________
____________________________________________

10.-Load Game: se usa para leer la partida guardada, yo lo uso en el men para la opcin

Continuar. En gml seria game_load(savegame)


______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Con esto terminamos con la pestaa Main2, ahora mostrare la ventana Control, esta es
quizs la mas importante, presta mucha atencin.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

CONTROL.

1.-Check Empty: se usa para verificar si la posicin X,Y indicadas estn libres, es decir si no
hay instancias. En gml seria if place_free(x,y){} por ejemplo para mover un personaje asa
adelante sin fallas, if place_free(x+5,y){x+=5;} esto se usara en event de teclado, en los
plataformas se usa para verificar si hay o no suelo as, if place_free(x,y+1) {acciones}.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
2.-Check Collision: La verdad es el uso invertido de la anterior, ya que en la anterior
verificbamos si estaba libre ejecuta las acciones, en esta si no esta libre ejecuta las
acciones. En gml seria if not place_free(x,y){acciones}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
3.-Check Object: Es parecido a la anterior pero esta verifica si en las coordenadas X,Y
indicadas colisiona con el obj indicado. En gml seria if place_meeting(x,y,obj){}.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
4.-Test instance acount: Se usa para contar y ejecutar las acciones cuando quede en el
room actual la cantidad de instancias indicadas, muy usado en los clasicos juegos de naves
para pasar de nivel al eliminar todas las naves. En gml seria if instance_number(obj)=5{}
______________________________________________________________________________

______________________________________________________________________________
____________________________________________
5.- Test Chage: se usa para que se ejecute una accin en un tiempo aleatorio. En gml seria
if ceil(random(5))=true{acciones}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
6.- Check Question: Se usa para preguntar algo al jugador. En gml seria show_question
("aeiou") {}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
7.-Test Expresin: La verdad esto solo se usa para iniciar una condicin en if. En gml es if
(condicin) {accin} si se cumple la condicin se ejecuta la accin.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
8.- Check Mouse: La verdad este d&d es para usar eventos de mouse. En gml if
mouse_check_button(mb_left){}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
9.- Check Grip: devuelve trae si la instancia esta alineada con la grip indicadas. En gml if
place_snapped(,){}.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
10.- Start Block: se usa para encerrar un bloque de acciones manteniendo organizado tus
cdigos, en gml es solo el smbolo {
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
11.- Else: Esto seria como decir (de lo contrario as esto) en pocas palabras luego de que se
compara una condicin si esta es cierta, se realiza esa accin, pero si no fuera cierta la
condicin, no sucedera nada, aqu es donde entra esto, lo colocas al final de los cdigos, y
luego una segunda accin, lo que quedara as. Si se cumple esta condicin, ejecuta esta
accin Else ejecutas esta otra accin. En gml es simplemente else.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
12.-Exit Event: indica el fin del cdigo o script. En gml exit.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
13.- End Block: se usa para culminar un bloque de acciones manteniendo organizado tus
cdigos, en gml es solo el smbolo}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
14.-Repeat: se usa para que una lnea de cdigo se repita tantas veces como lo hinques. En
gml es asi repeat(3).
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
15.-Call event parent: Cuando creas un object este tiene una casilla para seleccionar un
parent, el parent seria el pare de ese object y ejecutaria los event del object parent
(padre) seleccionado, pero si usas un event igual se anul el del parent y usa el actual, con
esto podrias llamar ese event del parent. En gml es. event_inherited()
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
16.- Execute Code: Bueno as visto, que se puede hacer en gml todo lo que en d&d y mucho
mas pero Dnde colocar los codigos? Este d&d es precisamente esto, al dar click, abre
una hoja de documento donde podrs colocar los cdigos del gml, para que sean
ejecutados.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
17.- Execute Script: hablamos de que si usas un cdigo en varios personajes, lo mejor era
colocar un script y llamarlo. Precisamente para esto se usa, para llamar al script.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
18.- Coment: cuando usas d&d quizs quieras colocar un comentario para saber que ara en
ese event, o lo que planeaste lograr, bueno esto es precisamente para dejar un
comentario. Cuando estas en Execute code. Para escribir comentarios usas // y lo que
escribas en esa lnea despus de // ser tomado como solo texto, comentario.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Con esto culmino la pestaa Control. Ahora vamos a la pestaa Score.

SCORE.
1.-Set Score: Primero debers declarar el score, hazlo en el primer room en el crate de
algn object, escribes 1 y marcas relative. Como ya as comprendido se usa para el score,
para sumar score escribes +1 y marcas relative, y para restart -1, y marcas relative. En gml
seria score=1; para sumar score+=1; para restar score-=1; se usa as en todo lo de la
pestaa score.
En d&d: +1 Marca Relative, -1 Marca Relative. En GML: +=1; suma, -=1; restar.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

2- Test Score: se usa para verificar si el escore esta e cierta cantidad suceda algo, es para
la condicin, en gml es if score=
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
3.-Draw Score: Esto se usa en el event draw, y es para que se muestre en pantalla el score.
En gml es asi draw_text(x,y,Score: +string(score))
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
4.-Hight score: Esto se usa para crear una tabla de hight score, es decir de las mejores
puntuaciones. Yo lo uso en D&D cuando lo uso, pero en gml es as highscore_show(var)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
5.- Clear hight Score: Esto es para borrar la tabla de hight score. En gml es as
highscore_clear()
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
6.- Set lives: Esto es para las vidas, y se usa de forma similar al Set score.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
7.- Test Lives: Se usa para verificar la cantidad de vidas es decir como condicin. En gml es
as if lives=
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
8.-Draw Life: Se usa en el event draw y es para dibujar las cantidad de vidas en pantalla,
en gml seria draw_text(x,y,Lives: +string(lives))
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
9.- Draw life image: se usa en event draw, para mostrar la cantidad de vidas, pero en vez
de letras y numeros, se mostrara una imagen de la seleccionada por cda vida, muy util
para colocar corazones como vidas. En gml se ase asi.
var a; a=0 repeat(lives){ draw_sprite(sprvidas,0,view_xview+a,view_yview); a+=16;}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
10.- Set health: Se usa para la barra de energa, y se usa de manera similar a set lives, y
set score. En gml seria, health=
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
11.-Test Health: Se usa para verificar como condicin si la energa (health) esta a cierto
punto. En gml es if health=
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
12.-Draw Health.- Se usa en el event draw. Y es para mostrar una barra de vidas, del ancho
desde x1 hasta x2, y de alto desde y1 hasta y2. en gml seria.
draw_healthbar(x,y,x2,y2,health,c_color,c_color,c_color,0,true,true);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
13.- Score Caption: Esto es para cuando ejecutas el juego en modo ventana, puedas ver en
el borde, el score vidas y health.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Con esto terminamos la ventana score, ahora por ultimo vamos con la ventana Draw.
DRAW.

Aclaro todos en esta pestaa se usan en el event


draw.
1.- Draw sprite: Se usa para dibujar un sprite en alguna region del room. En gml es
draw_sprite(spr,-1,x,y) spr seria el nombre del sprite.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
2.- Draw Background: Se usa para dubijr una imagen de fondo del room. En gml seria
draw_background(back,x,y)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
3.- Draw text: Se usa para dibuja un texto en la pantalla. En gml seria draw_text(x,y,).
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
4.- Draw Rectagule: Se usa para dibujar un rectngulo, es muy utilizado para los juegos
tactic para que veas un rectngulo al seleccionar los personajes a mover, o para
rectngulos de textos de dilogos, entre otras cosas. En gml es. draw_rectangle
(x,y,x2,y2,1)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
5.- Draw Ellipse: Se usa para dibujar un crculo. Muy usado en los juegos de estrategia para
mostrar el radio de alcance se las armas. En gml seria draw_ellipse(x,y,x2,y2,1)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
6.- Draw Line: Se usa para dibujar una linea. La verdad nunca lo he usado. En gml seria
draw_line(x,y,x2,y2)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
7.- Draw Arroz: Se usa para dibujar una Flecha. La verdad tampoco lo he usado nunca. En
gml seria draw_arrow(x,y,x2,y2,12)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
8.- Set color: Se usa para cambiar el color de las fuentes, originalmente lo uso para
cambiar el color del texto en pantalla. En gml seria draw_get_color(c_color)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
9.- Set font: Se usa para escoger una de las fuentes creadas. En gml seria draw_set_font
(fnt) fnt seria la fuente.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
10.- Set full screen: Se usa para escoger si se debe ejecutar el juego en modo ventana, o
en full pantalla. En gml seria. Para full pantalla window_set_fullscreen(1) para ventana
cambia el 1 por un 0.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Ante todo gracias por leer el tutorial.


Y quiero aclararte lo que se podran ser algunas dudas.
True es igual en valor numrico a 1 y es un valor de activar, positivo.
False es igual en valor numrico a 0 y es un valor de desactivar o negativo.
Es decir estos valores activan o desactivan unas variables, por as decirlo.
Cuando hablo de x,y,x1,y2 es por que debes establecer una coordenada inicial y una final
de ambos valores.
Como ya sabrs X es ancho. Y es alto.
Otra cosa para usar valores multiplos lo haces de esta manera.
En D&D, colocas +1, -1, *1, /1, y marcas la casilla relative.
En gml, colocas +=1, -=1, *=1, /=1.
Tambin al crear un juego hay que saber que creamos.

Cenital. Es un juego visto exactamente desde arriba.


______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Isomtrico. Es un juego visto en diagonal (inclinado) como si lo vieras por la ventana de un


edificio, Como los RPG.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

3D: ms que un tipo de juego, se habla aca de juegos con cierta profundidad queda un

toque de realismo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

RPG: Estos se crean en vista isomtrica, o 3D, la idea de estos es evolvente en su cuento,
donde tendrs que encontrar llaves, mapas, y muchas herramientas para pasar de nivel, as
como tambin derrotar a los enemigos.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Plataformas: Son todos estos juegos donde la base es la habilidad para controlar al
personaje, segn la fsica del movimiento y la gravedad, as como los juegos del famoso
Mario Br y otros de ese estilo, ya sea que disparen, o solo eliminen el enemigo
cayndoles encima, siempre que tengas que saltar demasiado es un plataformas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Shooter: son juegos aunque de pocos movimientos, el juego se basa estrictamente en los
disparos, o disparas o pierdes, no puedes ganar de otra manera, por lo general estos juegos
suelen hacerse en 3D, o en cenital por lo general.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Estrategia: Estos juegos tienen por lo general el mejorar el score, aunque algunos poseen
su cuento y un final, se basan en idear la mejor manera de hacer tu jugada para poder
ganar, o mejorar tu score, en estos encontramos, los tipo, Defender, Puzzle
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Tactis: Estos se crean por lo general en cenital, o en isometricos, y son aquellos donde
seleccionas ejercitos, para enviarlos a atacar, aldeanos para constuir fortalezas, y cosas
como esas, el estilo es idear una tactica de combate, que funcione para derrotar los
enemigos.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Con esto doy por terminado el Primer tutorial gml d&d.

Espero lo disfrutes
Pasemos a la siguiente y continuemos creando videojuegos cada ves mas dificiles de crear
de manera que cuando culminemos podamos crear buenos videojuegos en 2D y 3D.

.- Creando nuestro segundo Videojuego.


Tutorial Fabricante de Juegos
Game Maker.
Pensado para principiantes.

Hola , Quiero mostrar de una manera simple como crear tus juegos. Este tutorial
veras algunas de las acciones D&D. y veras como debes crear tu juego paso a paso,
incluso trabajaremos en un juegos muy sencillo pero divertido, y de ah podrs tener el
conocimiento de cmo crear tus juegos, poco a poco explicaremos paso a paso la
creacion de diversos juegos.
Vistanos en www.tutoek.tk

Lo primero descargarnos el programa entra en www.yoyogames.com clic en la pestaa


Make y click en download Game maker, una ves descargado demos doble click para
instalarlo, marcamos la pestaa i agree to y click en siguiente. Unas ves instaladas demos
doble click en el icono.
abrir una ventana as.
.
.

Demos click tal cual indica la imagen. Es mejor aun si lo registras por que tendrs ms
opciones, pero en este tutorial trabajaremos con la versin Lite (no registrada)
Antes de iniciar a crear video juegos, hablaremos de los tipos de juegos que se pueden
crear, bueno el Game Maker, es una herramienta bastante poderoso por as decirlo,
este posee un lenguaje interno que se conoce como GML (Cdigos, script), y una gran
cantidad de D&D (los cuadritos que se ven al editar un object), este lenguaje esta
creado pensando en que todos los usuarios puedan aprender a usarlo bastante fcil.
Aunque con el GML, se pueden crear los juegos que desees, debes recordar que un
juego se compone de: Programacin (GML), Grficos, Sonidos/Msica. En algunos casos
tambin tienen un buen guin, y diseo. Pero como hacer un juego ups que difcil.
No para nada, solo es cuestin de organizarse, Primero tienes que tener claro el tipo
de juego que deseas hacer, entre estos estn:
Plataformas: donde saltas corres etc.
Los Shooter: juego donde es necesario el disparar o no podran jugarse.
Los Estrategias: estos se basan en crear un ambiente enigmtico, donde el jugador
deber idear la mejor para ganar.
Los RPG: Estos son muy famosos pero a la vez muy complicados, ya que debers tener
altos conocimientos en el GML, para poder crearlos, la idea de estos juegos es contar
una historia, donde el personaje la vive poco a poco, por lo general estos juegos los
mismos niveles son visitados una y otra vez ya que se necesitara una llave para abrir
una puerta que mas adelante se logra encontrar, por eso regresa en fin son juegos que
deben crearse con sumo cuidado, para que tengan xito.

Existen aadiduras a estos gneros para dar un toque de calidad profesional.


Cenital. Este tipo de juegos son los vistos desde arriba y podran ser una mezcla de los
gneros antes mencionados.
Isomtricos: Estos poseen un ngulo de inclinacin especial que da cierta perspectiva
al juego. Por lo general a los RPG se les da ngulo isomtrico.
3D: Estos podran de cualquiera de los gneros antes mencionados solo que dara un
aspecto de realidad virtual bastante aceptable.
Ahora que conocemos un poco mas de los videos juegos comencemos con nuestro primer
tutorial en este aprenders como hacer un Shooter.
Ahora abrir una ventana como esta.
.
.
Te explico pero primero te mostrare mejor la parte ms importante de la ventana.
.
.
Los sprites: son los dibujos que se usaran en tu juego es decir que es el personaje o los
personajes de tu juego, estos puedes crearlos con cualquier herramienta de dibujo
pero recuerda guardarlos en formato Gif o PNG.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Sound: es el sonido de tu juego los sonidos de efecto especiales tales como disparos
explosiones derrumbes. Y hasta la msica del juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Background: son las imgenes que usaras para el fondo de cada una de las pantallas de
tu juego es decir cada uno de los niveles de tu juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Paths: estos te permite crearle a un personaje un movimiento siguiendo una ruta la
cual especificaras segn las coordenadas X, Y.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Scripts: aqu podrs colocar un listado de cdigos el cual uses en varios personajes los
colocas aqu as no tendrs que programarlos constantemente.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Fonts: te permite cambiar el tamao y el tipo de letra aun texto.


______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Time lines: te permiten crear acciones a cierto tiempo ejemplo si el room tiene
velocidad 30 (seria 30 fps) y colocas en una time line 300 y le das la accin de crear un
enemigo. Cada 10 segundos creara un enemigo en las coordenadas X, Y, que
especificaste.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Objects: son la parte ms importante del juego ya que es aqu donde introduces toda
la informacin de lo que suceder en el juego. En pocas palabras aqu elijes un sprite y
a este pasara a ser un object con ese dibujo (sprite) tambin puedes crear object sin
sprites con efecto de controladores es decir que hagan una funcin sin ser vistos.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Room: aqu es donde creas todos los niveles de tu juego tanto como el men de inicio
as como el nivel de presentacin y del juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Game information: aqu escribes toda la informacin de tu juego quien lo creo, como
se llamara, fecha, etc.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Global setting: te permite cambiar opciones como el icono de tu juego la imagen de
carga del juego y otros aspectos.
Ahora veras que son los Event.
.
.

Cuando creas un object abre una ventana como esta


te explico que es.
Add Event: Al presionar click en ese botn se abre la ventana de event es decir la
ventana que ves arriba de ese botn.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
Crate: Este event ejecuta las acciones que coloques en el solo cuando la instancia es
creada en el juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Destroy: Este event ejecuta las acciones justamente cuando esta a punto de ser
destruida una instancia (las instancia son los object cuando se colocan en el room)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Alarm: Este event ejecuta la accin cuando la alarma [] colocada llegue 0 es decir
primero debers haber colocado un D&D de alarm en el event crate y sealar un
nmero de fps y marcar Relative as cuando esa instancia se mueva ese nmero de fps
se ejecutara la accin del event Alarm.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Step. Este event lee constantemente las acciones que coloques en el.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Collision: Este event se ejecuta cuando los dos object encuentran sus sprites en la
misma posicin.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Keyboard: Este event sirve para colocar funcin a una tecla es decir puedes colocas
por ejemplo que la tecla A mueva al personaje a la izquierda o derecha como tu
decidas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Mouse: Este event sirve para colocar funcin a un botn del Mouse es decir puedes
colocas por ejemplo que la tecla A mueva al personaje a la izquierda o derecha como
t decidas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Other: En este botn encontraras varios event de los cuales los 4 ms usados.
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
Outside Room: Este event ejecuta su accin cuanto la instancia sale de lo bordes del
cuarto.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Game Start: Este event ejecuta su accin cuando inicia el juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
No More Lives: Este ejecuta su accin cuando el D&D lives llegue a 0.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
No more Health: Este ejecuta su accin cuando el D&D Health llegue 0

Pero que mejor forma de aprender a crear un juego que crendolo.


A continuacin explicare los D&D que usaremos para crear nuestro juego.
test instace acount.
.lo hemos usado asi.

Ya conocemos los D&D Acciones que se usaran en nuestro juego ahora lo crearemos lo
primero usando alguna herramienta de dibujo creamos 3 sprites el spr_nave, el
spr_bala, y el spr_enemigo.
Recuerda guardarlos en formato PNG o GIF.

Ya tenemos los sprites ahora a agregarlos. Demos click con el botn segundario del
Mouse sobre donde dice Sprites y click en crate sprite, ahora seleccionamos uno de
los sprite y le colocamos su nombre. (Recuerda no usar espacios separar con _)
Ya hemos creado los sprites.

Ahora creemos la msica y el sonido del disparo. Ya el game maker trae una lista de
sonido que puedes usar. De igual forma demos click con el botn segundario del Mouse
sobre Sound y click en crate sound, una vez escogidos el sound_disparo y el
sound_musica.
Ahora creemos un background de igual manera ya el game maker trae unos background
que puedes escoger para este juego escoge el de space (espacio) recuerda es un juego
de naves.

Ahora creemos los object. De igual forma click segundario en object y click en crate
object. Inmediatamente abrir una ventana para que le sean colocados las acciones y
event. Igual a esta.

.
A este object no le agregaremos sprite y le llamaremos obj_control.
Luego otro obj_enemigo, el obj_nave y el obj_bala.
Empezaremos por editar el obj_control. (Para editar cualquiera solo dale click con el
botn segundario del Mouse y click en properties.
Al obj_control primero click en add event y click en step luego agregaremos D&D a este
event en la pestaa control click con el segundario en instante count.
En object seleccionamos el obj_enemigo lo dems lo dejamos tal cual, ahora click en
start block ahora en la pestaa Main2 daremos click segundario sobre display
message y escribiremos Felicitaciones. Ahora daremos click segundario en la pestaa
score daremos click segundario en set lives y en donde dice [new lives] colocaremos +1
y marcaremos el recuadro Relative.
Ahora en la pestaa main1 daremos click con el segundario en
Next room. Y ahora en la pestaa control daremos click en block.
Debe verse el event step as.
.

.- Creando nuestro tecer videojuego.


Como crear un juego al estilo del Arkanoid.

He recibido varios correos de personas solicitando que creara un tutorial para realizar un
Arkanoid, bueno aca esta el tutorial.
He agregado informacion extra como es, el agoritmo que se debe seguir al iniciar la
programacion de un juego, y el utilizar una herramienta del game maker
que se llama el modo debuger. Esta modalidad "debuger" significa "eliminar buscar

errores" recuerden un bug es un error que se nos paso por alto al momento de crear el
juego, en muchos casos un bug podria afectar tanto el juego, que este simplemente no
podria jugarse.
Con este tutorial aprenderan a crear un juego estilo Arkanoid, ademas de aprender a usar
el modo Debuger del game maker.
Yo usare para crear este juego el Game maker 8.0, pero el Gml usado aqui funciona igual
en el game maker desde la version 6. 0 en adelante-.
Lo primero que aremos ser organizar que juego deseamos crear, esta la tenemos fcil
pues queremos crear un juego estilo Arkanoid. Pero Qu deseamos que nuestro juego
tenga? Lo recomendable para esto es que crees un guin tcnico, sea un documento donde
especifiques que suceder en tu juego, con que teclas se jugara, sistema de vidas, sistema
de puntaje, cantidad de niveles, y cantidad de modalidad de jugadores, sea para un solo
jugador, o para un jugador vs Computers, o para un jugador vs otro jugador.
O un juego que contenga todas las anteriores.
Lo que are yo ser un estilo Arkanoid con todas las opciones de jugadores anteriores.
Lo primero que aremos es crear una carpeta con el nombre de nuestro Arkanoid.
En esta carpeta creamos los recursos a usar, creando as, un documento llamado Guin
tcnico o tutorial, que seria algo como este documento, adems crearemos 4 carpetas las
cuales nombraremos as, Sprites, Backgrounds, Sonidos, Msica.
Fig.

Creando Sprites.
Usaremos cualquier programa de dibujos para crear nuestros sprites. Y los guardaremos
dentro de nuestra carpeta sprites, necesitare que creen para este juego los siguientes
sprites, un cuadro de 16x16 lo nombramos Pared, un rectngulo de 16x64 lo nombramos
Barra, un circulo de 16x16 lo nombramos Bola, un rectngulo de 16x32 lo llamamos
ladrillo. Todos de color Amarillo Claro.
Yo are algo especial para mostrarles como usar al cargar sprites llamada Create From
Strip la cual podemos crear todos los sprites en un solo documento o un solo dibujo,
claro separado por recuadros y el mismo Game maker se encargara de recortarlos con esta
funcin.
Como vern en la figura ac estn pero los he colocado todos en un solo cuadro de dibujo,
ahora vern como usando la fusin Create From Strip podrn cortarlos usando el Game
maker, lo hago as por que muchos buscan sprites por Internet, y estos vienen en un solo
cuadro de dibujo como este caso y luego no saben como crtalos, y pierden mucho tiempo
cortando cada cuadro con una herramienta de dibujo, cuando el Game maker lo hace en un
abrir y cerrar de ojos.
Creamos un sprite este sera el sprite pared, para este tomaremos el cuadro de 16x16
recortandolo con la funcion Create From Strip pero como?, primero click derecho en
sprite, y click izq, en create sprite, ahora click en Edit Sprite Click en File y click en
Create From Strip Como muestra la imagen.
Ahora veremos una ventana en donde podremos recortar nuestros sprites.
Ahora como vieron en la imagen, lo nico que hacen es escoger las imgenes a usar y click
en Ok. Este mismo mtodo usare para recortar todos mis sprites.
Puedes usar el mtodo tradicional de crearlos por separado, simplemente quise explicar un
mtodo que se que es importante que aprendan a usar.

Subiendo los sonidos.


Yo siempre recomiendo formato de sonido Midi, pero wave, puede servir aunque a veces,
puede ocasionar error al cargar el sonido y el juego no corra por eso usa siempre tanto

para sonidos y msica el formato .mid como se conoce Midi.


Subir dos sonidos los cuales previamente escog y coloque en mi carpeta de preseleccin y
organizacin del juego que llame Sonidos.
Solo damos click derecho en Sonidos y click en Create Sound luego click al boton load
sound y escogemos el sonido. Yo subir 2 sonidos a los cuales llamare.
sndRebote. El cual usare para rebotes con barra y pared. sndLadrillo. El cual usare para
rebotes contra los ladrillos a destruir.
Subiendo la msica.
Usaremos el mismo metodo de subir sonidos pero esta ves, subiremos la musica que
usaremos de fondo de ambiente para el juego, yo solo usare una la cual nombrare como
sndMusica. Y ya la tengo preseleccionada en mi carpeta musica.
Subiendo el Background o Fondo.Bueno yo la verdad solo cree un background de 64x64 el cual parece un cielo y lo usare
para todo en el juego, por no alargar mucho el tutorial, pero ustedes hagan cuantos
quieran.
Mi background es un cielo asi que le llame bkCielo.
Como vern en esta imagen ya sub mis recursos sea mis sprites, backgrounds, sonidos, y
msica, que usare en el juego.

Creando object.
Simplemente damos click derecho en Objects, click izq en Create objects le colocamos el
nombre luego el sprite que corresponde y damos click en OK.
Crearemos los siguientes objects.
objCreditos Sin sprite
objMenu sin sprite.
objParedV con el esprite cuadrado de 16x16
objParedH con el sprite cuadrado de 16x16.
objBola con el sprite de circular de 16x16.
objLadrillo con el sprite rectangular de 32x16.
objBarraPlayer Con el sprite rectangular de 64x16.
objBarraCpu Con el sprite rectangular de 64x16.
objBarraPlayer2 Con el sprite Rectangular de 64x16.
objPoder con el sprite circular de 16x16.
Ya tenemos los object ahora a darle vida al juego.

Para el objCreditos
Event create
vspeed=-2;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event key press Enter
game_restart();
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Event Draw
draw_text(x,y,Creador. #WWW.TUTOEK.TK #Gracias por seguir el tutorial. ##Press
Enter)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Para el objMenu
Event create
lives=3; //vidas o bolas o turnos para jugar si se le va la bola en modo 1 jugador.
global.cpu=false; //indicara si esta activado el modo vs computer.
global.player2=false; //indica si esta activado el modo vs player2.
menu=0; //para saber la seleccin del menu-.
score=0; //para el score osea puntaje.
sound_play(sndMusica); //suene la musica.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event key press Enter.
switch(menu) //verifica el valor de la variable menu
{
case 0: global.cpu=false; global.player2=false; room_goto_next(); break; //1 player.
case 1: global.cpu=true; global.player2=false; room_goto_next(); break; //vs CPU
case 2: global.cpu=false; global.player2=true; room_goto_next(); break; //vs player2
case 3: show_info(); break; //muestra la informacin del juego.
}
//al presionar Enter segn la seleccin ejecutara esas acciones.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event draw
switch(menu) //verifica el valor de la variable menu
{
case 0: draw_text(x,y,Un Jugador) break; //1 player.
case 1: draw_text(x,y,Vs CPU) break; //vs CPU
case 2: draw_text(x,y,2 Jugadores) break; //vs player2
case 3: draw_text(x,y,Informacion) break; //muestra la informacin del juego.
}
draw_text(x,y+32,Press Left or Right #Enter start)
//para que diga que se presione izquierda o derecha para seleccionar el menu.
//Y Enter para iniciar.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event key press Left
if menu >0
{menu-=1;}
else
{menu=3;}

Event key press Right


if menu < 3
{menu+=1;}
else
{menu=0}
//con esto queda culminado el object menu.

Para el objParedV
Marcamos la casilla Solid. Y listo.

Para el objParedH
Marcamos la Casilla Solid y listo.

Para el objBola
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En su Event Create
Vamos a la pestaa control seleccionamos con un click en Execute code y escribiremos,
es siguiente codigo.
image_speed=0; //para que no haga cambio de subimagenes.
image_blend=c_blue; //aqu escogemos el color de nuestra bola.
direction=(random(360)); //saldra al iniciar en cualquier direccion.
speed=2; //iniciara moviendose a 2 pxl por step, osea la velocidad.
alarm[0]=10*room_speed; //esto ara que cada 10 segundos se active el event alarm 0.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En su Event Alarm 0
alarm[0]=10*room_speed; //para que se repita cada 10 segundos el event alarm 0.
speed+=0.5; //aumentara la velocidad
//Esto ara que a cada 10 segundos la bola aumente la velocidad.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En su Event Collision contra el objLadrillo
if place_meeting(x-4,y-1,objLadrillo) //si le pega por el borde derecho
{direction=40;}
else
if place_meeting(x+4,y-1,objLadrillo) //si le pega por el borde izquierdo
{direction=130;}
else
{vspeed*=-1;} //si rebota por otro lado.
sound_play(sndLadrillo);
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
Event de collision contra el objBarraPlayer
if place_meeting(x-4,y-1, objBarraPlayer) //si le pega por el borde derecho
{direction=45;}
else
if place_meeting(x+4,y-1, objBarraPlayer) //si le pega por el borde izquierdo
{direction=135;}
else
{vspeed*=-1;} //si rebota por otro lado.
sound_play(sndRebote);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event collision contra el objBarraPlayer2
if place_meeting(x-4,y+1, objBarraPlayer2) //si le pega por el borde derecho
{direction=300;}
else
if place_meeting(x+4,y+1, objBarraPlayer2) //si le pega por el borde izquierdo
{direction=220;}
else
{vspeed*=-1;} //si rebota por otro lado
sound_play(sndRebote);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event collision contra el objBarraCpu
if place_meeting(x-4,y+1, objBarraCpu) //si le pega por el borde derecho
{direction=300;}
else
if place_meeting(x+4,y+1, objBarraCpu) //si le pega por el borde izquierdo
{direction=220;}
else
{vspeed*=-1;} //si rebota por otro lado.
sound_play(sndRebote);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision Contra objParedV
hspeed*=-1; //cambia la direccion horizontal invertida. Estos se usan para los lados.
sound_play(sndRebote);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision Contra objParedH
vspeed*=-1; //cambia la direccion vertical.
sound_play(sndRebote);

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event step
if y < 0 //si sale por arriba esto para vs placer y vs cpu.
{
if global.cpu
{show_message("Ganaste #Felicidadez"); highscore_show(score) game_restart();}
else
if global.player2
{show_message("Gana el jugador 1"); highscore_show(score) game_restart();}
else
{y=ystart; vspeed=3;}
}
//si esta activo el CPU y sale por arriba gana el jugador 1 igual pasa
//si esta activo el player2.
if y > room_height //si sale por abajo.
{
if global.cpu
{show_message("Gano la Computadora"); highscore_show(score) game_restart();}
else
if global.player2
{show_message("Gana el jugador 2"); highscore_show(score) game_restart();}
else
if lives > 1
{lives-=1; y=ystart; vspeed=-3;}
else
{highscore_show(score) game_restart();}
}
//esto es casi lo mismo pero en este caso ganarian o la CPU o el player2.

Para el obj_Ladrillo
Primero marco la casilla solid.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event create
image_speed=0; //sin cambio de subimagen
image_blend=choose(c_white,c_aqua,c_silver,c_red,c_blue,c_black,c_green);
//esto es para que el color de los ladrillos sea aleatorio.
crea=0; //esto es para ver si se crea o no el objPoder
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision contra el objBola
crea=round(random(10))
//de manera aleatoria devuelve un numero entre 1 al 10.
if crea=5
{instance_create(x,y,objPoder)}
//solo di fuera 5 el resultado crea el objPoder

score+=1; //suma puntos


instance_destroy();
//se destruye el ladrillo

Ahora el objBarraPlayer
Primero marco la pestaa solid.
Event Create
sound_loop(sndMusica);
//esto es para el modo vs
if global.cpu
{
if instance_exists(objParedH)
{with(objParedH){instance_destroy();}}
if !instance_exists(objBarraCpu)
{instance_create(room_width/2,16,objBarraCpu)}
}
//si esta en modo vs cpu Destruye la pared de arriba
//y se crea la barra de la cpu arriba-.
if global.player2
{
if instance_exists(objParedH)
{with(objParedH){instance_destroy();}}
if !instance_exists(objBarraPlayer2)
{instance_create(room_width/2,16,objBarraPlayer2)}
}
//algo parecido pero la barra que se crea es la del player2.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Left
if x > 16
{x-=5;}
//si esta despegado del borde izquierdo puede moverse a la izq
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Right
if x < room_width- sprite_width
{x+=5;}
//si esta alejado del borde derecho podra moverse asia el.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event collision contra objPoder
if image_xscale <3
{image_xscale+=0.2}
//la barra crece si coges el poder

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event draw.
draw_sprite_ext
(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,imag
e_alpha)
//este codigo es obligado al usar draw o no se vera el sprite de nuestro object.
//ahora el codigo para que se vea las vidas y el score.
if !global.cpu and !global.player2
{
draw_text(16,16,"score: "+string(score))
draw_text(256,16,"Bolas: "+string(lives))
}
//coloque que verificara primero si no esta en modo vs
//ya que en modo vs no es importante el score y no se juega por vidas.
//con esto listo el player.

Ahora vamos con el objPlayer2.


Marca la casilla solid
Bueno el player2 movera con las teclas A, D
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event de tecla A
if x > 16
{x-=5;}
//si esta despegado del borde izquierdo puede moverse a la izq
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event tecla D
if x < room_width- sprite_width
{x+=5;}
//si esta alejado del borde derecho podra moverse asia el.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision contra objPoder
if image_xscale <3
{image_xscale+=0.2}
//la barra crece si coges el poder
//listo la barra player.

Ahora el objBarraCpu

Primero Marca la casilla Solid


Event step.
//primero are que solo vea la bola cuando esta este a la mitad del room
//esto para que no sea imposible ganarle a la cpu.
if instance_exists(objBola) //siempre es bueno verificar si existe evita errores
{
move_towards_point(objBola.x-sprite_width/2,y,5)//solo persique en horizontal la bola.
}
//lista la IA OH!
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event de Collision contra objPoder.
if image_xscale <3
{image_xscale+=0.2}
//la barra crece si coges el poder
//listo la CPU.

Ahora el objPoder.
Event create
image_speed=0; //para que no haga cambio de subimagenes.
direction=random(360); speed=3; //direccion aleatoria velocidad 3.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event end step
image_blend=choose(c_red,c_blue,c_green,c_yellow);
//Con esto la bola cambiara de color intermitente.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event collision objParedV
hspeed*=-1; //cambia la direccion horizontal invertida. Estos se usan para los lados.
sound_play(sndRebote);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision objParedH
vspeed*=-1; //cambia la direccion vertical.
sound_play(sndRebote);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event collision objBarraPlayer y objBarraCpu y objBarraPlayer2 y outsider room.

Osea en estos 4 event de collision colocan


Instante_destroy();

Terminamos con los objects.


Ahora crearemos el primer Room
Click derecho en room y click Create room
En la pestala Settings de la ventana del room
Colocamos el nombre del room yo colocare
rmMenu ya que lo usare para el menu.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En la pestaa Backgrounds seleccionamos el fondo a nuesto room.
Osea el bkCielo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En la pestaa object seleccionamos el objMenu y lo colocamos
De manera que el texto se vea bien, no doy coordenadas por que seria
A apreciacin de cada quien.
Y listo ese room.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora creamos un segundo room el cual llamaremos
rmNPrincipal
en la pestaa object selecciona el objParedV
y colocalo de manera de crear un borde lateral isquierdo y un borde lateral derecho-.
Asi como se ve en la imagen.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora selecciona el objParedH y colocalo solo en el borde de arriba asi
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora selecciona el objBarraPlayer y colocala abajo en el centro pero hasta abajo.
y selecciona el objBola y colocalo en todo el centro del room.
Seleccina los ladrillos y colocalos por el centro como quieras, recuerda colocar pocos
Y aumentar de ladrillos para cada nivel.
Una manera facil es crear el primer room luego dar click derecho sobre ese room y click en
Duplicate, eso hara una copia exacta del room principal asi lo que haces es ir
renombrandolos como rmNivel2, rmNivel3. y claro colocar mas ladrillos en cada nivel para
ir aumentando la dificultad.
Crea un ultimo room llamalo rmCreditos

En ese room lo nico que haces es colocar el objCreditos abajo un poco a la izquierda.
Listo terminado el juego, pero hay que probarlo para eso usaremos el modo Debuger.
Lo unico que debes hacer es presionar F6, o dar click en el triangulo Rojo.
Al correrlo en este modo veras durante la barra de carga que dice Loading y el recurso
que esta cargando, de esa manera si se colgara o hubiera un error sabria cual recurso esta
afectando y lo quitaria.
Una vez ejecutado el juego en modo Debug, vez una ventana la cual te permite ver Tool
luego click en show, las variables globales, y las locales de algun object, como estan
trabajando, y asi sabes cual es la falla en tu juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Una ves debugeado nuestro juego, y ya listo pasamos a click derecho en Game
information y ah escribimos la informacin de nuestro juego osea nombre del juego
como jugarlo etc.
Ahora click derecho en Global Setting Game Des marcamos la casilla Display Cursor
eso evita que se vea la flecha del Mouse.
Ya esta listo ahora solo nos queda dar click en File y en Save As para guardar el editable
y asi mejorarlo mas adelante. Y cuando este perfectamente como queramos que debe
estar, click en File y click en Create Executable para crear el juego y distribuirlo.

.- Creando nuestro 4to videoJuego.


Tutorial Bsico de Plataformas en GML.
Lo primero vamos a abrir el Game Maker 7.0 en este caso.
Recuerden abrirlo en modo avanzado, si no esta en ese modo simplemente denle click en
file y marquen donde dice Avanced mode. Una vez hecho esto empezaremos con la
creacin de nuestras plataformas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Sprites.
Primero crearemos el sprite del jugador. Click derecho en Sprite y click en cr ate Sprite
.
Luego daremos click en el botn Edit Sprite . Y presionamos las teclas ctrl. + E Veras que
abre el editor de sprites de GM, bueno ahora usando las herramientas que se ven,
crearemos un cubo dibjale ojos boca, dale personalidad. Ahora gurdalo pero desmarca la
casilla Presice Collision Cheking . Y guarda el sprite con el nombre spr_jugador . Ahora
crearemos el Sprite del spr_piso simplemente, crea un cubo de 32 x32 y desmarca las
casillas Presice Collision Cheking , y Transparent .

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Background.
Ahora daremos click derecho en Background, y click en Crate Background . Luego click
en el botn Edit Background , ahora crearemos un fondo para el juego. En este fondo
crearemos las distintas plataformas en donde caminara y debe saltar nuestro personaje,
crea el cielo nubes y dems ahora crearemos los object los primordiales para el juego

crearemos el Jugador. Y el piso.


El jugador: el personaje que t controlas.
El piso: es cuadros que se usan para colocar invisibles en el fondo exactamente en los
lugares por donde caminara el jugador.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Object.
Click derecho en object , click en crate object . Ahora le asignamos el sprite del
Piso. Desmarca la casilla Visible y marcamos la casilla Solid y listo.
- Ahora crearemos el object del jugador obj_jugador .
Click derecho en object , click en crate object. Ahora le asignamos el sprite del
jugador. Ahora damos click al botn, Add Event. Y click en el botn Keyboard.
Seleccionamos Left repetimos la accin y seleccionamos Right, click nuevamente en
Add Event . Y click en Step . Click nuevamente en Add Event y seleccionamos Other y en
seleccionamos Outside Room . Click en Add Event . Y click en el botn Key Press . Y
seleccionamos Space . Ahora click en el Botn Add Event y click en el event collision y
seleccionamos la collision contra el obj_piso . Ahora definamos los event.
En el event Keyboard Right , vamos a la pestaa Control. Y damos click en el D&D
Execute Code ( parece una hoja de papel ) . Al hacerlo abrir un documento en blanco
donde podrs escribir todo tipo de cdigos. Para este event Escribe esto.
x+=5 //con esto el personaje se mover a la derecha cuando presiones la tecla Right.
Ahora en el event Keyboard Left de igual manera selecciona Execute Code y escribe.
x-=5
Explicacion: X es la posicion Horizontal por defecto se calcula asia la derecha, asiq ue un
valor positivo es movimiento a la derecha y un valor negativo es movimiento a la
isquierda.
// con esto el personaje se mover asa la izquierda cuando presiones Left.
En el event Step seleccionamos de igual manera Execute Code y escribimos esto.
Esto es para crear la gravedad.
if place_free ( x , y +1) gravity = 0.7 else gravity = 0;
if ( vspeed > 14) vspeed = 14

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Explico el cdigo.
Si esta libre la posicin normal de X y la de Y un pxel mas abajo la gravedad ser
establecida a 0.7 de lo contrario ser igual a 0;
Si la velocidad vertical es mayor a 14 esta ser igual a 14 (para limitar la velocidad
mximo de caida).
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el mismo Event Step. Coloca este codigo.
if y>room_height {show_message("No Cai"); room_restart();}
Explico el codigo.
lo que hace es verificar si la posicion de tu obj_jugador a pasado la parte mas baja del
room saliendo
de este, (implica que te casite de las plataformas). saldra un mensage que dira No Cai, y se

reiniciara el Room.

Ahora en el event Outside Room .


Selecciona en la pestaa Main 2 selecciona el D&D. Restart Game .
Ahora en el Event Keyboard Press Space selecciona Execute Code y escribe este cdigo.
Esto es para que salte.
if ( not place_free ( x , y +1)) vspeed = -16

Explico el cdigo.
Si no esta libre la posicin normal de X y la posicin de Y un pxel mas abajo, se mover
verticalmente asa arriba a 16 pxeles.
(con esto tenemos claro que place_free(x,y) verifica si esta libre las posiciones X,Y, los
pixeles que sumemos o restemos a estos.
como X es comun de derecha Y es comun asia abajo por lo que un valor negativo seria asia
arriba.)
vspeed indica la velocidad vertical se toma en cuenta como si fuera un valor de Y, solo que
este una vez fijado la velocidad no detendra
el movimiento hasta que se le indique lo contrario. en este caso el impulso del movimiento
vspeed es negativo diciendo que debera moverse
asia arriba 16 pixeles por step, que detendra este impulso? lo detendra la gravedad que
establecimos.

Ahora en el event de Collision contra piso.


Seleccionamos Execute Code . Y escribimos.
move_contact_solid ( direction , vspeed ); vspeed =0 ;
Esto es para que pueda caminar sobre el piso.
Como puedes ver detenemos el movimiento vertical.

As se ve el object Jugador .

As se vera el object Piso.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Room
Ahora demos click derecho en Rooms y click en crate room .
En la pestaa Background marca la casilla Stretch . Y Selecciona la imagen de fondo que
as creado. Ahora en la pestaa Object , Escoge el Object pis o y colcalo inicial mente
alrededor del Room enmarcndolo excepto en la parte de abajo donde si cae perder. Una
vez hecho eso coloca el object piso sobre los lugares en los que podr caminar el Jugador,
ahora selecciona el object jugador y colcalo en el room.
Ya con esto el juego estar listo para jugarse. (Solo falta imaginacin para crear enemigos
los cuales podras ayudarte mucho del uso del Path para sus movimientos.
As se vera el room con los objetos agregados.

As se vera el juego cuando sea ejecutado.


______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Pero vamos a ir mas aya, ahora crearemos enemigos y daremos dos mtodos para acabar
con ellos uno cayndoles por arriba y el otro es deparndoles con esto tendrn una idea
mas clara para los tipos de juegos que deseen crear.
Primero dibujemos los enemigos crea los sprites de un tamao de 32x32.
Yo he creado Este
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Me gusta por que me ahorro sprites ya que como mira frontal puedo usar el mismo sprite
para ambas direcciones.
Claro que si tuviera que usar dos sprites uno para la derecha y otro para la izquierda
tendra que usar un cdigo que es el siguiente.
Sprite_index=spriteDerecha; o sprite_index=spriteIsquierda;
No necesariamente se llamaran as... pero es una forma de mostrarles cual es el cdigo.
Ahora crearemos la bala que usara nuestro personaje.
Puede ser un crculo de 16X16.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Aqu esta mi bala.
Bueno ahora creemos los dos nuevos objects.
Creemos el ObjEnemigos, y le asignamos el Sprite que creamos del enemigo.
Creemos el ObjBala, y le asignamos el Sprite que creamos de la bala. En donde dice Depth
Colocamos 5, Explico Depth es la profundidad del dibujo, para ser mas claro el dibujo con
menor profundidad se ve en el juego por ecima de los demas, a la bala le coloque mayor
profundidad, para hacer que se vea detrs de nuestro personaje es decir nuestro personaje
la tapara.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora demos las acciones correspondientes.
Al ObjEnemigo. Dmosle movimiento, para ello crearemos un path.
Clic derecho en path y click en Create Path.
Abra una ventana como esta.
< ">

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Escribo en X 192 y Y lo dejo en 0, le damos al boton Add 2 veces.
Escribo en X 0 y en Y 0, y le damos a Add clic una vez.
Y clic en el indicador verde de OK, para guardar el path.
Por lo general se guardara como path0.
Ahora en el event create del ObjEnemigo colocaremos ese path para que pueda moverse el
enemigo as como muestra la imagen.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Como vez Lo uso en el event create del ObjEnemigo.
Donde dice path se escoge el path a usar. En este caso el Path0 que fue el que creamos.
Speed es la velocidad que usara el object para recorrer el path sea para moverse le puse
3, por que es una bastante adecuada.
At end: indica que sucede al culminar el recorrido del path0, yo he colocado la opcin
continue from Stara, por que asi seguira ejecutando el path0. (Se repetir)
Relative: lo marco relative para que las coordenadas indicadas en el path sean tomadas
desde la posicin del object y no del room.
Ya con esto nuestro objEnemigo se mueve de un lado al otro. Tu puedes definir el
movimiento que desees, no solo puedes escribir las coordenadas y darle a Add para
agregarlas cuando creas el path, puedes tambin clickear y las coordenadas X y Y se
agregan automticamente, para ser francos fue lo que yo hice.
Ahora en el event Collision seleccionamos colisin contra la bala.
Y colocamos Instante_destroy en D&D claro. En code seria instante_destroy();
Esto es todo para el ObjEnemigo.
Ahora el ObjBala.
En el event Create del ObjBala Colocamos el siguiente codigo.
Asi direction= obj_jugador.direction; speed=10;
//este codigo lo que dice es que el objBala se mover en la direccion
Que tenia el obj_jugador al momento en que la creo, para un plataformas el cdigo es
simple pero para iniciar esta bien, usarlo.
Ahora en el event Other seleccionamos Outside Room y en este event
Colocamos el D&D instante_destroy, si lo deseas en cdigo seria instante_destroy(); esto
es para que cuando salga del room el objBala se destruya, por que ya no nos aria falta.
Con esto hemos terminado con el ObjBala. Se vera asi

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ya que hemos terminado con los dos nuevos object ahora definamos como afectan al
obj_jugador.
Dele clic derecho en el obj_jugador y clic en properties, para que entremos al editor del
obj_jugador. Una vez aqu definamos con que tecla queremos que dispare, yo por ejemplo
quiero que dispare con la tecla R. asi que le doy clic en Add Event y escojo el Event Key
Press voy a setter y escojo la R. Como muestra el dibujo.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Una vez en el event Key Press R.
Colocamos el siguiente codigo.
If instante_number(objBala)<1
{instante_create(x,y,objBala)}
//lo que hace es que verifica si hay objBalas Creadas sea menor a 1 osea 0 objBalas,
puedes cambiar el 1 por un numero mayor si deseas que se puedan disparar varias Balas.

Ahora le damos en Add Event y seleccionamos el event


collision contra el objEnemigo.
Aqu colocaremos un code para que verifique si le caes por arriba o no, recuerda si le caes
por arriba podrs eliminar ese enemigo pero de lo contrario tu perders.
Usaremos el siguiente cdigo .
if vspeed>1 and other .sprite_height> obj_jugador
{with ( other )instance_destroy(); }
else
{ show_message( Game Over ); game_restart (); }
//lo que hace es que verifica si esta cayendo y si estas arriba del otro object en este caso
el objEnemigo y de ser as destruye el objEnemigo, de lo contrario tu pierdes.
Aclaro que with() lo que hace es que todo lo que se diga le pasara al object que se indico
yo use with(other) para que le pasara al otro object.
Ya con esto nuestro personaje dispara y puede eliminar a los enemigos cayndole por
arriba, solo te ara falta imaginacin para crear un gran juego.
Espero que el tutorial te ayude mucho, practica bastante y lograras juegos excelentes.
Ahora que hemos creado varios videojuegos tu conocimiento debe ser bastante alto en este
momento, por loq ue creo es necesario aprendas un poco del lenguaje de programacion que
estas usando osea el GML (Game , Maker , Lenguaje)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Como todos ya sabran, el GML o Game Maker Lenguaje, es el lenguaje de programacion del
Game Maker, Lo que se traduce en que cuando programamos un juego con esto, estamos
creando un juego en el lenguaje de programacion GML. De aca una explicacion basica de
como manejarse en este lenguaje de programacion.
lo primero, donde colocar los codigos GML? L respuesta es... En la pestaa control al
editar un obect encontramos un D&D cuyo icono es una hoja de papel, si dejamos el
puntero del mouse sobre ese icono, saldra un cuadro de informacion que nos muestra el
nombre del D&D (icono) el cuale es: Execite Code, al dar click derecho, sobre ese icono
abrira un documento de texto en blanco, ahi procederemos a escribir nuestros codigos en
Gml.
Otra manera es escribirlos en un script, para ellos creamos un escript le damos un nombre
y luego podemos llamar (usar) el script en cualquier event solo colocando el nombre del
script y dos parentesis ejemplo: script(), cuando creamos un script contamos con la ventaja
de que podemos usar ese mismo codigo en varios object y modificar su valor, para cada

object usando argument. Ejemplo de un script con argument.


nombre del script es: gravedad
if place_free(x,y+1)
{gravity=argument0}
else
{gravity=0;}
if vspeed > argument1
{vspeed=argument1}
al usarlo podemos modificarlo para cada object cambiando el valor de sus argumentos.
ejemplo. para el object1 lo usare en su event step asi: gravedad(0.5,16); Osea el valor del
argument0 es 0.5 separo con una coma y asigno al argument1 valor 16.
para el object2 lo usare en su event step asi: gravedad(0.7,18); Osea el valor del
argument0 es 0.7 separo con una coma y asigno el valor de argument1 valor 18.
En el menu ayuda del Game Maker, veras al Final Game Maker Lenguaje (GML) ahi veras
los codigos del lenguaje GML.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
He visto a muchos caer en la situacin de copiar y pegar cdigos directos de ejemplos, o de
algn otro pero el mayor problema no reside aqu
La problemtica se presenta cuando tienen que modificar valor alguno para adaptarlo a su
juego, en vista de que solo copian y pegan, sin poder comprender la lgica de los cdigos
que usa. Aqu crearemos un mtodo de traduccin simplificado para los cdigos, de manera
que podamos entender la lgica creada de los mismos, y la funcion que ejecutan.
Es necesario entender que los computadores no son inteligentes, estos solo estn basados
en una lgica constituida por una extensa cantidad de datos.
De igual forma es la programacin, le damos los cdigos necesarios a un programa para
crear una lgica.
Ejemplo. En decimos, si el vaso de vidrio esta muy cerca del fuego se destruye. Seria as en
cdigos del GML. if distance_to_object(fuego)<5 {instance_destroy()}.
Como puedes notar usamos una lgica comn un vaso muy cerca del fuego se rompera.
A esto nos referimos con traducir el GML. Lo que se habla es de traducir una idea y/o
accin lgica a cdigo de GML, para usarse en un programa.
Entendamos algo no todos los video juegos deben basarse plenamente en la lgica de la
vida real, Recordemos que cada juego posee su propia realidad basada en el cuento de
ficcin creado para el mismo. Por ejemplo, en las pelculas donde ocurren sucesos donde se
enfrentan a personajes extraterrestres y otros la realidad que han planteado durante el
inicio da como realidad la posibilidad de existir dichos sucesos, en palabras simples crean
su propia realidad dentro de un cuento.
Cuando creemos un juego primero una lgica del funcionamiento de x instancias, y
procedamos a traducirlo a GML ejemplo.
Para el objNave.
La nave se mueve al presionar las teclas left = isquierda, Right =derecha, up= Arriba, Down
=Abajo. Pero si presiono la tecla Space deber disparar,
Y si una nave enemiga choca contra la ma se destruyen ambas y se reinicia el nivel
quitndome una vida, y cuando no tenga vidas perder el juego, pero si destruyo todas las
naves enemigas voy al siguiente nivel.
Ahora traduzcamos esto a GML.
En el event step de objNave.
if keyboard_check(vk_left){x-=5} //moverse a la izquierda
if keyboard_check(vk_right){x+=5} //moverse a la derecha.
if keyboard_check(vk_up){y-=5} //moverse arriba.
if keyboard_check(vk_down){y+=5} //moverse abajo.
if keyboard_check(vk_space){instance_create(x,y,objBala} //disparar.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
//cuando no tenga mas vidas muestra un cartel que dice Game Over y reinicia el juego.
if lives<1 {show_message("Game Over"); game_restart()}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
//cuando no queden mas naves enemigas pasa al siguiente nivel.
if instance_number(NaveEnemiga)<1 {room_goto_next()}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el event de collision de objNave contra NaveEnemiga.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
lives-=1; //Resta una vida.
with(NaveEnemiga)instance_destroy();//la NaveEnemiga se destruye.
self.instance_destroy();//objNave se destruye.
room_restart(); //reinicia el nivel.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Como puedes ver se a cumplido todo lo antes mencionado.
Por ello cuando pienses en tu juego crea una lgica en texto normal y luego interprtalo
en GML.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora aremos algo distinto vamos a traducir el GML a palabras comunes de esta manera
comprender mas su lenguaje.
Tenemos el siguiente cdigo Numerado para mayor facilidad de comprender.
En el event step.
1) if place_free(x,y+1){gravity_direction=270 gravity=0.5}else{gravity=0;}
2) if vspeed>14{vspeed=14}
3) if x< obj_player.x
{
if place_free(x+5,y){ x+=4}
if not place_free(x,y+1)and place_free(x+8,y+1)
{vspeed-=14; if place_free(x+5,y){ x+=5}}}

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Explicacion.
Como puedes ve en este cdigo se trabaja mucho con las posiciones X Y, por ello es
necesario comprender que X es la posicin horizontal del room en el que actualmente
estas, X en positivo es asa la derecha y en valor negativo asa la izquierda. As como Y es
la posicin vertical del room en el que actualmente estas, Y positivo es asa abajo, Y
negativo es asa arriba.
1) si esta libre la posicin de Y un pxel mas abajo libre, {se activa la gravedad a 0.5 y
su direccin ser asa abajo.} de lo contrario {la gravedad no poseer velocidad de
movimiento.}
2)

si la velocidad vertical es mayor a 14 {ser igual a 14}

3) si X es menor a la posicin X del obj_player {si la posicin de X 5 pxel adelantes esta


libre pero la de Y normal {se mueve 4 pxel asa la derecha.}
Si no esta libre la posicin de Y un pxel abajo esta ocupada y esta libre 8 pxel adelante
la posicin X pero Y un pxel abajo libre. {Se mover verticalmente asa arriba a14 pxeles
y verificara si esta libre la posicin X 5 pxeles adelante {se mover a 5 pxeles a la
derecha}}}
Este cdigo que han visto a sido usado en unos de mis juegos de plataformas para que el
enemigo me persiga tomando en cuenta que debe saltar cuando no aya suelo y a la vez
perseguir al jugador, claro que aqu solo ven una parte del cdigo en esta solo persigue
asa la derecha nos es necesario colocarlo completo ya que solo deberan usar otro igual
colocando valores - + contrarios, para que siga asa la izquierda.
Con esto me refiero a traducir el GML es tratar de leer no los cdigos si no lo que dicen en
palabras comunes estos
Bueno esto es todo. Espero lo comprendan.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Ahora que sabes un poco de GML, hablaremos de la sentencia


swith y los Arrays.
Arreglos (array)
Un arreglo est formado por un nmero fijo de elementos contguos de un mismo tipo. Al
tipo se le llama tipo base del arreglo. Los datos individuales se llaman elementos del
arreglo.
Para definir un tipo estructurado arreglo, se debe especificar el tipo base y el nmero de
elementos.
Un array se caracterza por :
Almacenar los elementos del array en posiciones de memoria contnua
Tener un nico nombre de variable que representa a todos los elementos, y stos a su vez
se diferencan por un ndice o subndice.
______________________________________________________________________________

______________________________________________________________________________
____________________________________________
Acceso directo o aleatorio a los elementos individuales del array.
Los arrays se clasifican en :
Unidimensionales (vectores o listas) array[0]
Multidimensionales ( tablas o matrices) array[0,1]
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Crearemos un ejemplo usando array unidimensionales.
Abran el Game maker.
Creen 5 sprites distintos de nombres spr1, spr2, spr3, spr4, spr5. En verdad los nombres de
los sprites no importa es solo por seguir un ejemplo.
Este ejemplo mostrara como pudes almacenar todos los sprites de un object en un array.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

ahora creemos un object.


en el event create del object declaramos los arrays necesarios le dare a mis arrays el
nombre de "arrspr"
arrspr[0]=spr1
arrspr[1]=spr2
arrspr[2]=spr3
arrspr[3]=spr4
arrspr[4]=spr5
ahora declaramos una variable que controla el cambio de valos del indice osea esto [0], a
la variable la llamare "c"
c=0;
para hacer rapido el ejemplo, ahora en el...
event de pressed left
c=0;
alarm[0]=0.1*room_speed
event de tecla pressed right
c=1;
alarm[0]=0.1*room_speed
event de tecla pressed up
c=2;
alarm[0]=0.1*room_speed
event de tecla pressed Down
c=3;
alarm[0]=0.1*room_speed
event de tecla pressed space
c=4;
alarm[0]=0.1*room_speed

en el event alarm[0]
sprite_index=arrspr[c]; //como veras el sprite cambiara segun el valor el indice del array
siendo el valor tomado de la variable "c"
ahora crean un room e introduce el object creado y ejecuta el juego, para probarlo
preciona cualquiera de las teclas antes mencionadas y veras como cambia de sprite. Muy
util este ejemplo si tomas en cuenta que podria ser un personaje y cada spr correspondiera
a una direccion de movimiento.
Con esto queda listo la explicasion de Arrays.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Sentencia Switch.
Estructura.
switch(variable)
{
case 0: linea de codigos break;
case 1: otra linea de codigos break;
}
Basicamente es switch lo que hace es comparar el valor de la variable con el de los case, si
esta concuerda se ejecutara la linea de codigos de ese case, tambien podria agregarse al
final de los codigo el "default" que funcionaria como un case, solo que este ejecutaria la
linea d ecodigos cuando el valor de variable no concuerde con la de ninguno de los case.
Vamos a hacer un ejemplo, crearemos un menu con 3 opciones usando el switch.
Crea un object, colocale como nombre objMenu, aunque como dije antes el nombre no es
importante.
en el event create declaramos la variable menu.
Event create.
menu=0;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
ahora si para seleccionar las opciones del menu queremos usar las teclas left y right del
teclado de flechas, hagamos lo siguiente.
En el event key pressed left.
if menu > 1 //si menu es mayor a 1
{menu-=1;} //resta 1 a menu
else //de lo contrario
{menu=3;} //menu es igual a 3.
E_____________________________________________________________________________
______________________________________________________________________________
_____________________________________________
n el event key pressed right.
if menu < 3 //si menu es menor a 3
{menu+=1;} //se suma 1 a menu.
else //de lo contrario
{menu=0;} //menu es igual a 0
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
En el event key pressed Enter. (Aqui usaremos el switch)
switch(menu) //variable a comparar.
{
case 0: room_goto_next(); break; //valor del case es 0, se ser el del menu=0 se dirige al
siguiente room.
case 1: show_info(); break; //valor del case es 1, se ser el del menu=1 Abre la
informacion..
case 2: game_load("savegame"); break; //valor del case es 2, se ser el del menu=2 leera el
archivo guardado.
case 3: game_end(); break; //valor del case es 3, se ser el del menu=3 cierra el juego.
}
Ahora para que nuestro menu se visible.
En el event Draw. (Aqui usaremos el switch)
switch(menu) //variable a comparar.
{
case 0: draw_text(x,y,"Nuevo juego") break; //valor del case es 0, se ser el del menu=0
muestra el texto en pantalla.
case 1: draw_text(x,y,"Informacion") break; //valor del case es 1, se ser el del menu=1
muestra el texto en pantalla..
case 2: draw_text(x,y,"Cargar partida") break; //valor del case es 2, se ser el del menu=2
muestra el texto en pantalla.
case 3: draw_text(x,y,"Salir del juego") break; //valor del case es 3, se ser el del menu=3
muestra el texto en pantalla
}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora coloca el objMenu en un lugar visible donde quieres que se vea el menu, y ejecutalo,
Culminado.
Con esto podemos decir que ya sabes programar en GML o tienes una extensa idea de cmo
hacerlo.
Vamos a usar el GML y crear inteligencia artificial para los personajes controlados por el
CPU.

COMO DAR INTELIGENCIA ARTIFICIAL (IA) A LOS PERSONAJES


DE TUS JUEGOS.
En este tutorial iniciaremos con inteligencia artificial para juegos de estilo cenital,
(shooter), y culminaremos con como crear una Inteligencia artificial para juegos del
tipo PLATAFORMAS,
Donde veras como nuestro personaje sabr cuando debe saltar, cuando deber perseguir a
nuestro personaje, y cuando deber dispararle e incluso esquivar un disparo.
Las inteligencias artificiales (IA) no son ms que un conjunto de cdigos que sustituyen el
presionar los controles. Pongmoslo de otra manera, digamos que para mover el personaje
enemigo tienes los event de teclados left x-5, right x+5, up y-5, down y+5, en estos event
son sus movimientos y tenemos en el event de teclado de la tecla space instante_create
(x,y,objBala) , en pocas palabras el enemigo, tendra movimiento y disparo, la ia debera
sustituir estos eventos de teclados, permitiendo por cdigos que el enemigo realice
selectivamente los movimiento y el crear la bala.

Pero como crear una ia que haga esto, fcil, lo nico que debes hacer es iniciar por una
condicin y dentro de estas las acciones necesarias, me explico.
Creamos la condicin inicial podra ser verificar si existe la instancia, continuamos creado
los script necesarios, y luego los llamamos y esto dar inicio a nuestra ia.
Cabe destacar que deben haber transiciones, es decir inicia con un movimiento, por alguna
razn ese movimiento no puede seguir ejecutndose y cambia al otro, en pocas palabras la
condicin podra decir que si esta a su izquierda se mover a la izquierda, pero si esta a la
derecha ya esa condicin no podra ejecutarse, es donde pasaras al proceso de seleccin
en donde a travs de los cdigos verifica la posicin en la que esta y de all parte al nuevo
movimiento, adems para el disparo se podra establecer que si esta en la misma direccin
en la que el enemigo va (quiere decir que lo esta viendo) entonces le dispare, sea crea la
instancia de la bala.
Para entender mejor vayamos a la prctica.

IA Para Juego Shooter Cenital.


Primero hay que aclarar que se necesita la vercion pro. se podria con la lite pero la
pro permite uso de mejores codigos.
?? ??????Posterior creemos los sprites de bala sprBala. Algo importante que recordar al
momento de crearlos es que como Cenital g
Posterior creemos los sprites de bala sprBala. Algo importante que recordar al momento
de crearlos es que como Cenital significa que es visto desde arriba
El sprite debe dar esa apariencia (ver Fig. 1), todos los sprites deben estar mirando asa la
derecha, ya que el ngulo inicial de toda imagen es 0, y de ah partir
La rotacin de dicha imagen, y otra cosa es que se deben centrar los mismos, (ver Fig. 1).
Ya listos los sprites continuemos creando los objects.
Fig1.

C_____________________________________________________________________________
______________________________________________________________________________
_____________________________________________
reemos dos grupos osea dos sub carpetas de group en script.
GroupPersonaje y GroupEnemigo.
Iniciamos en el GrupPersonaje, Dentro de esta sub carpeta creamos los siguientes script
scrCreatePersonaje
y colocamos los siguientes cdigos.
xx=0;
yy=0;
//estas variables las declaramos para ser usadas como gua para el Mouse.
Lives=10;

//Defino las vidas del Personaje.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Creamos otro Script, de indice scrStepPersonaje.
Y colocamos los siguientes codigos.
xx=mouse_x;
yy=mouse_y;
Image_angle=point_direction(x,y,xx,yy)
//lo que hace es verificar la posicin del mouse en la posicin del objPersonaje y devolver
la distancia en grados.
If instante_exists(objBalaPersonaje) and mouse_left_pressed(mb_left)
{instance_create(x,y,objBalaPersonaje)}
//Crea una bala al presionar el botn izquierdo del mouse.

direction=image_angle;
//indica que se mover a donde este mirando.

If keyboard_check(vk_up)
{speed=5;}
If keyboard_realise(vk_up)
{speed=0;}
//si se presiona la tecla de flechas arriba se mover, si se suelta se detendr.

If lives<1 {show_message(Game Over) game_restart();}


//si no tiene vidas pierdes.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ya con esto el script indica donde y a que velocidad moverse y disparar.
Ahora en el objPersonaje llamamos a los scripts.

En el event create.
scrCreatePersonaje();

En el event step.
scrStepPersonaje();

ya con esto esta listo nuestro personaje.

Ahora vamos a la bala del personaje.


En el event create.
move_toward_point(mouse_x,mouse_y,10);

En el event de colicion contra el objEnemigo


with(objEnemigo){vidas-=1;}
Instance_destroy()

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el event out side room
Instance_destroy();

//lo que ara es al ser creada ir a la direction donde se encontraba el cursor del mouse
//si colisiona contra el objEnemigo se destruye hay que ponerlo ya que el dao seria
infinito si esto no pasa.
//tambien se destruye si sale del room. Con esto listo el objBala.

Ahora vamos con la objBalaEnemigo


En su event create
direction=objEnemigo.image_angle
speed=10;

//se mueve asia donde mire el objEnemigo a la velocidad de 10.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En su event out side room
Instance_destroy();

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En su event colicion contra el objPersonaje
With(objPersonaje){lives-=1}
Instante_destroy();
//resta vida al personaje y se destruye la bala.
Vamos ahora a crear los script de la IA del objEnemigo.
Para esto crearemos varios script.
scrCreateEnemigo, scrAndar, scrAtk, scrEsquivar, scrStepEnemigo.
Ya que el enemigo se mover por su cuenta lo que los script deben hacer es mover el
enemigo como si tu presionares sus controles, con esto lo que digo es que cuando creas una
IA, solo usas los script que sustituirn los movimientos que tu realizaras en esas
situaciones.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el scrCreateEnemigo
Vidas=10;
//declaramos el nmero de vidas que tendr.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el scrAtk

image_angle=point_direction(x,y,objPersonaje.x,objPersonaje.y)
if !instance_exists(objBalaEnemigo)
{instance_create(x,y,objBalaEnemigo);}
//si no existe la bala del enemigo el podr crear una.
//y se mantiene mirando al personaje.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el scrAndar
if distance_to_object(objPersonaje)>128
{mp_potential_step(objPersonaje.x,objPersonaje.y,2,1)}

//se mueve asa el objPersonaje esquiva la mayora de los objects en su camino.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el scrEsquivar

if distance_to_object(objPersonaje)<64
{
if x< objPersonaje.x and x>0
{hspeed=-5;}
if x> objPersonaje.x and x< room_width
{hspeed=5;}
if y< objPersonaje.x and y> 0
{vspeed=-5;}
if y> objPersonaje.x and y< room_height
{vspeed=5;}
}

//compara su ubicacin y si tiene espacio con los bordes del room


//si es as se mueve en direccin contraria al enemigo
//esto es para que no se acerque demasiado

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora en el scrStepEnemigo
if vidas<1
{show_message("You Winner"); game_restart();}
//si no tiene vidas el objPersonaje osea tu ganas.

if instance_exists(objPersonaje)
{
scrAndar();
scrAtk();
scrEsquivar();
}
//solo si existe el objPersonaje el ejecuta los script.
//se compara si existe ya que al destruirlo podra dar algn error.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora en el objEnemigo
En su event create
scrCreateEnemigo();

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En su event Step
scrStepEnemigo();

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora crea una room y coloca tus object Personaje y Enemigo.
Y ten cuidado no dejes que te gane.
IA para juego de Plataformas.
Una de las cosas que hay que tener en cuenta es que los movimientos en un juego de
plataformas son con movimientos laterales izquierda (left) derecha (right), y ademas
esta el efecto de salto, osea los movimiento de Arriba (up), abajo (down), pero estos
de arriba y abajo, son establecidos por una fisica que se aplica para dar ese efecto de
slto, como sabemos un salto es un impulso vertical ascendente que supera la fuerza
que ejerce la gravedad sobre ese cuerpo, para no adentrarnos demaciado en la fisica y
dirigirnos mas a la creacion de nuestra IA comencemos.

Lo primero sera el crear los sprites, crearemos un sprite para el jugador el cual
llamaremos sprJugador, un sprite para el enemigos quien tendra la IA, que sera
sprEnemigo y centramos la posicion X del sprite y la Y en 0, es decir que creando los
sprites 32x32 su X seria 16 su Y 0, y creamos un sprite para las balas que sera un
circulo de 8x8 y centramos el sprite de la bala sprBala, y un sprite cuadrado el cual
llamaremos sprMask, tambien crearemos un sprite cuadrado e cual llamaremos sprPiso
de 32x32.
Es importante dstacar que los sprites debes des marcar las casillas Presice collision
Cheking. (ver fig 1) Una vez creados los sprites ceraremos los objects.

Fig 1 de plataformas.

Creamos el objJugador y le asignamos el sprite de sprJugador, y le asignamos de mask


el sprMask (ver fig 2) ahora creamos un object de nombre objBalaJugador y le
asignamos el sprBala, ahora creamos un object de nombre objEnemigo y le asignamos
el sprite sprEnemigo, por ultimo creamos un object de nombre objBalaEnemigo y le
asignamos el sprite sprBala, y creamos el objPiso con el sprite sprPiso y marcamos la
casillaSolid.
Fig 2

Creamos los Script necesarios.


Primero creamos un group el cual llamamos groupJugador donde usaremos esa sub
carpeta para crear los script del objJugador, iniciamos con la creacion de los scripts.
scrCreateJugador y colocamos los siguientes codigos.
ver=true;
lives=10;
estas variables se usaran para saber en que direccion se mueve, y con cuantas vidas

iniciara.
Creamos el script scrStep, y ecolocamos estos codigos.
if keyboard_check_pressed(vk_right) and place_free(x+3,y)
{x+=3; ver=true;} //mueve a la derecha.

if keyboard_check_pressed(vk_left) and place_free(x-3,y)


{x-=3; ver=false;} //mueve a la izquierda.

if !place_free(x,y+1) and keyboard_check_pressed(vk_space)


{vspeed-=12;} //salta.

if !instance_exists(objBalaJugador) and keyboard_check_pressed(ord("B"))


{instance_create(x,y+16,objBalaJugador);} //crea la bala "dispara".

if place_free(x,y+1)
{gravity=0.5}else{gravity=0;}
//se establece la gravedad.

if place_meeting(x,y,objBalaEnemigo)
{lives-=1; with(objBalaEnemigo){instance_destroy();}}
//si le pega la bala del enemigo pierde una vida.

if lives<1
{show_message("Game Over"); game_restart();}
//si no tiene vidas sale un mensaje de game over, y se reinicia el juego.

if ver
{image_xscale=1;}else{image_xscale=-1;}
//para que mire la imagen al lado correcto.

Ahora creamos el script scrColicionJugador y le ponemos el cdigo


Vspeed=0; //detenemos la velocidad vertical.

Con esto terminamos los script de nuestro jugador, ahora vamos a los script del
Enemigo.
Creamos un group as groupEnemigo y dentro de esa sub carpeta creamos los siguientes
scripts.
scrCreateEnemigo y colocamos los siguientes cdigos,
mirar=false; vidas=10;
Se declara las variables que indican la cantidad de vidas inicial y asa donde esta
mirando el enemigo.

Ahora el scrEndStep y colocamos estos codigos.

if place_meeting(x,y,objBalaJugador)
{vidas-=1; with(objBalaJugador){instance_destroy();}}
//si colicion con la bala pierde una vida.

Ahora el scrColicionEnemigo, y colocamos el codigo


Vspeed=0;

Ahora el scrStepEnemigo aqu va los cdigos mas importantes de nuestra IA.

if place_free(x,y+1)
{gravity=0.5}else{gravity=0;}
//se establece la gravedad.

if place_meeting(x,y,objBalaJugador)
{vidas-=1; with(objBalaJugador){instance_destroy();}}
//si le pega la bala del Jugador pierde una vida.

if vidas<1
{show_message("Player Winner"); game_restart();}
//si no tiene vidas sale un mensage de Player Winner, y se reinicia el juego.

scrIAEnemigo();

//ahora a trabajar en el movimiento y control de la IA del enemigo.


Crearemos el script de scrIAEnemigo y colocamos estos codigos.

//este script es para que te persiguan en juego de plataformas.


//argument0= aqui la instancia a perseguir.
//argument1 aqui la velocidad maxima del impulso del salto.
//argument2 aqui la velocidad a la que se movera cuando este sobre el suelo.
//argument3 aqui la velocidad a la que se movera en el aire.
//argument4 aqui la velocidad de iimpulso inicial de salto (saltar).

argument0= objJugador;
argument1=12;
argument3=4.2;
argument4=12;

if distance_to_object(argument0)>128
{argument2=3}else{argument2=2}

if place_free(x,y+1){gravity_direction=270 gravity=0.5}else{gravity=0;}
if vspeed>argument1{vspeed=argument1}

if distance_to_object(argument0)>16
{
if x< argument0.x
{

if place_free(x+5,y)and !place_free(x,y+1){ x+=argument2}


if not place_free(x,y+1)and place_free(x+8,y+1)
{vspeed-=argument4; }
if place_free(x+5,y+1){ x+=argument3}
mirar=true;
}

if x> argument0.x
{
if place_free(x-5,y)and !place_free(x,y+1){ x-=argument2}
if not place_free(x,y+1)and place_free(x-8,y+1)
{vspeed-=argument4;}
if place_free(x-5,y+1){ x-=argument3}
mirar=false
}
}
if distance_to_object(objJugador)<64 and !instance_exists(objBalaEnemigo)
{instance_create(x,y,objBalaEnemigo);}

if mirar
{image_xscale=1;}else{image_xscale=-1;}
//para que mire la imagen al lado correcto.

Esta IA trabaja de la siguiente manera, primero verifica la posicin actual X del


enemigo luego si esta a la derecha > o a la izquierda < del objJugador, una vez
verificado esto verifica si se encuentra libre X 5 pxeles al lado a mover y si esta sobre
algn object (hace referencia al piso) de ser correcto se mueve en esa direccin,
(place_free(x,y) verifica espacios libres) tambin verifica una cantidad de pxeles un
poco mas delante de los que avanzara para saber si no hay instancia alguna sobre la
que caminar, de ser as entonces salta. Funciona igual de ambos lados solo se cambio
sus coordenadas de negativo a positivo, y segn el movimiento activa o no la variable
mirar.
Si esta a menos de 64 pxeles de distancia crea la bala (dispara)

Ahora asignemos los scripts y codigos a los objects.

Al objJugador.
En su event Create llamemos el script scrCreateJugador simplemente en la pestala
control usemos execute code y escribamos esto scrCreateJugador();
Ahora en su event Step llamemos el script scrStep.
Ahora en su event de colicion contra el objPiso llamemos este script
scrColicionJugador con esto listo el objJugador.

Ahora la objBalaJugador
En su event Create
if objJugador.ver {direction=0 speed=10;}else{if !objJugador.ver {direction=180
speed=10;}}
//indica la direccin que tomara la bala del jugador.
En su event out side room, coloquemos instante_destroy();
Usaremos el mismo code en event de colision contra el objEnemigo.
Con esto listo el objBalaJugador.

Ahora el objEnemigo.
En su event create llamemos el script scrCreateEnemigo.
En su event End Step llamemos el script scrEndStep.
En su event Step llamemos el script scrStepEnemigo.
En su event colicion con el objPiso scrColicionEnemigo.
Con esto listo el objEnemigo.

Ahora el objBalaEnemigo.
En su event create
if objEnemigo.mirar {direction=0 speed=10;}else{if !objEnemigo.mirar {direction=180
speed=10;}}

//indica la direccin que tomara la bala del Enemigo.


En su event out side room, coloquemos instante_destroy();
Usaremos el mismo code en event de colision contra el objJugador.
Con esto listo el objBalaenemigo.

El objPiso no necesita cdigos solo coloca marca la casilla solid.

Ahora diseemos el room coloca algunos objPiso coloca el objJugador arriba del
objPiso, de igual manera el objEnemigo.
Y ahora a probar nuestro ejemplo.
Hemos visto y aprendido bastante del uso de la herramienta que es el Game maker.
Pero hasta ahora todos los juegos que hemos mostrado crear son en 2D, por eso ahora
mostrare como crear videojuegos en 3D con Game maker.

Tutorial 3D
Lo primero al crear un video juego en 3D con el Game maker, es conocer las funciones
bsicas, ya que si no conoces ningn cdigo no podrs crearlos.
Lo primero, los juegos en 3D se hacen en casi su totalidad en GML, aunque podria hacerce
la programacion en 2D, excepto por la parte grafica que es en GML, para ello ya debes
saber bastante al respecto, si no es as recomiendo que pases antes por los otros
tutoriales, y luego vuelvas con este.
Debes saber que para crear en 3D debes tener licencia del Game maker sea tu Game
maker debe estar en versin Pro.
Lo primero que debes saber es que cuando inicias el modo 3D con el Game maker se
producen ciertos cambios que hay que tener en cuenta.
1.- Se agrega un nuevo valor el Z este representa la profundidad (ver imagen de cubo
mas adelante)
2.- Las coordenadas Y es invertida, me explico mejor, en el 2D la coordenada 0 es
arriba a la izquierda de la pantalla, mientras que en 3D, la coordenada Y es abajo a la
izquierda de la pantalla, es decir que en un juego 3D las coordenadas 0,0 son abajo a la
izquierda.
3.- Para que el juego inicie en 3D hay que iniciar el Game maker en esta modalidad Cmo?
Para ello hay un cdigo que cumple esa funcin.
.- d3d_start(); inicia el modo 3D.
.- d3d_end() Culmina el modo 3D.
La programacin 3D a la 2D no se diferencia mucho, solo que en esta trabajas con el valor
adicional Z para aspecto graficos, a partir de este momento nos referiremos recordemos
la coordenada Z Recuerda el 3D lleva mucho cdigo GML, por ello vuelvo a repetir si
aun no sabes usar bien el Game maker regresa al primer tutorial y luego de aprenderlos
vuelve aqu.
4.- Los object durante el juego se vern de diferentes tamaos dependiendo del valor Z de
estos.
5.- la programacion es casi toda igual a la del 2D, solo cambia lo que esta en el event
draw, ademas, en 3D, solo se dibuja (puede ver) aquello que esta inicado en los event
draw, asi que asignar un sprite, o background, no se vera al ejecutar el juego en 3D.

Ahora ya sabes que es el modo 3D del Game maker y como iniciarlo.

Por ahora vamos a crear algo bsico para esto crearemos un cubo.
Iniciaremos activando el modo 3D, pero de igual manera agregaremos ciertos cdigos para
mejorar la calidad visual, podemos colocar esto en el event create de un object el cual
llamaremos objCubo.
Event create de objCubo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
d3d_start (); //inicia el modo 3D
d3d_set_perspective ( true ); /*Esto nos servir para que las instancias se vean en
perspectiva, sea que los que estn mas cerca se vern mas grandes que los que se alejan.
*/
d3d_set_hidden ( true ); /* Como sabrn cuando una instancia esta detrs de otra, la que
esta detrs no debera verse, as que este cdigo hace quita las que no son visibles.*/
d3d_set_culling ( true ); /*Este cdigo lo que hace es evitar dibujar un relleno interno a la
instancia, ya que de todas formas no podrs ver el relleno, no hace falta dibujarlas, as
ahorramos memoria */
texture_set_interpolation ( true ); //lo usaremos para suavizar bordes, ayuda mucho al
aspecto esttico.
d3d_set_lighting ( false ); //Para usar iluminacin, recuerda solo puedes ver objetos si hay
luz.
draw_set_color(c_white); //Al usar el blanco se vera todo iluminado.
//ahora delcararemos 3 variables, mismo Event create.
x1=0; y1=0; z1=0
//En el event de tecla check UP
x1+=0.5; y1+=0.5; z1+=0.5;
//En el event de tecla check down
x1-=0.5; y1-=0.5; z1-=0.5;

//En el event draw


d3d_set_projection (128+x1,96+y1,64+z1, 16+x1,16+y1,32+z1, 0,0,1);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
/* Los primeros tres valores (128+x1,96+y1,64+z1) especifican el punto desde donde mira la
cmara.
Los prximos 3 valores ( 16+x1,16+y1,32+z1 ) indican asa el punto donde enfoca la
cmara.
El primer 0 indica rotacin de cmara asa la izquierda o derecha como si giraras la mano

mientras sostienes la cmara.


El segundo 0 indica la altura del enfoque, es decir si inclinas una cmara o no al filmar.
El ultimo valor 1, posiciona la cmara es decir en valor 1 esta filmando correctamente y
en valor -1 se ve como si filmaras con la cmara de cabeza.
Ahora vamos a subir un background de 32x32, si quieren solo crean un cuadro de 32x32 de
cualquier en fin es solo una practica, denle por nombre al background creado bkCubo .
Event Draw este codigo-.
d3d_draw_block (0,0,0,32,32,32, background_get_texture ( bkCubo ),1,1);
Los primeros (0,0,0) son una esquina del cubo, los otros (32,32,32) son la esquina opuesta,
lo siguiente es crear la textura usando el background bkCubo, los ultimos (1,1) indica que
se dibujen formando el cubo.
Ahora crearemos un room, y colocamos el objCubo en cualquier parte del room.
Ejecutamos y veremos un cubo, y al presionar UP se aleja y al presionar Down se hacerca.
Ya aprendimos a crear un Cubo-.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Tambien podemos cambiando el codigo en el event Draw del objCubo, podrias crear una
esfera en vez de un cubo, llama al object, objEsfera, crear otro background y
llamalo bkEsfera.
ahora en el event draw del objEsfera coloca este codigo.
d3d_draw_ellipsoid (0,0,0,32,32,32, background_get_texture ( bkEsfera ),1,1 ,32 ); Como
vez los valores son casi los mismos solo se aade un ultimo el 32, este valor colocalo en 32.
Ahora coloca en el room el objEsfera, ahora podras ver una esfera.
Hemos visto como dibujar un cubo 3D, y como hacer una esfera 3D, ahora digamos que la
esfera fuera un planeta para la cual creaste un background para usarse como textura de un
planeta recuerda algo las texturas son backgrounds usados para texturas 3D.
A mi textura de 64x64 del planeta tierra le dare por nombre bkTierra. Al verme hablando
de planeta saben quiesas en la direccion que voy. Hemos aprendido a iniciar el modo 3D,
crear un Cubo, y crear una esfera, ahora usaremos el mismo metodo para crear la esfera
solo que en el event draw del objEsfera usaremos este codigo.
Event draw objEsfera.
d3d_transform_add_rotation_z (zr ); //aade una rotacion alrededor del eje Z.
//se dibuja el planeta o esfera.
d3d_draw_ellipsoid (0,0,0,32,32,32, background_get_texture ( bkTierra ),1,1 ,32 );
En el event Create del objEsfera
zr=2; //declaramos la
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
El resto de los codigos son los mismos usados para crear la esfera.
//ahora colocar el objEsfera en el room, y ejecutarlo, veran el planeta en el centro y que
gira.
Ahora han visto como crear figuras como esferas, cubos,
Estoy seguro que indagando entre los codigos del menu ayuda el GML, podran con este
conocimiento tambien dibujar cilindros conos, y claro mezclar las figuras geometricas para
lograr formas mas avanzadas.
He recibido correos varios, preguntando sobre el dibujar pisos y techos que les presenta un
problema, por ello explicare como hacerlo.

usaremos este codigo d3d_draw_floor


(0,0,0,room_width,room_height,0,background_get_texture(texPiso),32,32);
Primero que todo creen un background de 64x64 el cual usaran para la textura del suelo y
otro con las mismas medidas para el cielo o techo.
Yo al crearlos los nombre texPiso, y texCielo. usaremos este codigo claro como todos los
draw en el event draw, explico como funciona.
los primeros tres ceros estos (0,0,0, son los valores X1,Y1,Z1 para un piso lo logico es que
inicie donde inicia el room osea valores 0,0,0, Ahora tenemos los otros 3 valores
,room_width,room_height,0, Estos son: X2,Y2,Z2 como notaras X2 y Y2 son iguales al
tamao del room, ya que deseo que todo tenga un suelo (piso), luego viene la textura la
cual ya ven que use texPiso, y los otros dos son para redibujar ancho y alto, siempre los
coloco en 32,32 y quedan bien el aspecto visual, asi que coloquelo en 32x32. Como abran
notado en ambos valores Z use 0, por que? Es un suelo asi que no necesita profundidad
osea grosor, si tubiera alguno pareceria un escalon y no un suelo, esto se veria mal.
Ahora para dibujar el Cielo y/o Techo, usamos el mismo codigo con las mismas
coordenadas, pero cambiaremos unicamente los valores Z, por que? indicare para ambos
valores Z que sean de 64, de esta manera se dibujara el cielo dejando un espacio entre el
suelo y cielo de 64 pxl. y claro usare la textura para el cielo osea texCielo. quedaria asi el
codigo.
d3d_draw_floor(0,0,64,room_width,room_height,64,background_get_texture
(texCielo),32,32);
Como ven es muy parecido. Seguro al ver esto estaran un poco confusos respecto a las
coordenadas en 3D por ello cree una grafica miren.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Como ves Este es un cubo lo que hice fue centrarlo como si los sprites estuvieran centrados
seria igual que usas las coordenadas...
d3d_draw_block (x-16,y-16,-16,x+16,y+16,16, background_get_texture ( bkCubo ),1,1);
Ahora en esta segunda imagen la vista es cenital osea como si lo vieras desde el aire, como
ves aca Z no posee valor, por que? al verlo desde el aire solo vemos una superficie, no su
grosor, osea no que esta debajo con cuan alto esta del suelo, solo vemos superficie.
Espero ahora entiendas las coordenadas 3D.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Como colocar los hud en un juego 3D?
Los HUD en un videojuego es la informacion de estado del personaje, como son la barra de
energia, la cantidad de vidas, balas, etc...
en 3D para mostrar esta informacion se utiliza un codigo que permite mostrar ese estado
(hud) en 2D mientras el juego es ejecutado en 3D, quisas suene confuso, pero si ves un
videojuego 3D ves que las barras de vida, o letras no poseen profundidad, es decir son 2D,
a estos en 3D se les llama "orthos" y hay un codigo especifico que permite mostrarlos en el
game maker. d3d_set_projection_ortho. Y este codigo se usa en un object en su event
Draw, dicho object colocale el depth=-100, por ejemplo.
Event draw
{
d3d_set_projection_ortho(x,y,width,height,0);
d3d_set_hidden(false);
draw_healthbar(x,y,x2,y2,health,c_black,c_red,c_lime,0,true,true);
draw_text_color(x,y,"score:

"+string(score),c_white,c_silver,c_white,c_dkgray,1)
draw_text_color(x,y,"Vidas:
"+string(lives),c_white,c_silver,c_white,c_dkgray,1)
draw_set_alpha(1);
d3d_set_hidden(true);
}
Bueno... Pero que mejor forma de aprender que creando un videojuego en 3D.

www.tutoek.tk
Presenta.
Tutorial Videojuegos de Naves 3D.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Lo primero, que are ser organizar mi juego, para ello creare una carpeta la cual llamare
Naves 3D, dentro de esta carpeta creare otras carpetas para los recursos a usar, estas
carpetas: Sounds, Backgrounds, Sprites, Editable.
En la carpeta sounds agregare los sonidos que usare y/o la msica del juego, por no hacer
muy largo el Tutorial solo agregare 2 sonidos los cuales sern:
sndExplosion, y sndDisparo.
En la carpeta Backgrounds creare la textura que usare para el fondo del espacio la cual
ser una imagen de 128 x 128 que se vera como el espacio estar en formato .png y la
nombrare texEspacio.
En la carpeta Sprites colocare un sprite que simulara ser la nave espacial pero visto desde
dentro de la nave de 320x240, y lo llamare orthoNave. Igual creare 2 ms con el volante
de giro a la izquierda y giro a la derecha, orthoNaveizq y orthoNavedere. Como esta.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Recuerden transparentar el blanco.
Perdonen pero no soy buen dibujante-. Y agregare otro sprite de 64x64 el cual nombrare
como texMeteoro
Aca dejo la imagen.

En el editable ser donde guarde el editable del juego a cada avance para asi tener un
respaldo y poder seguir mejorando el juego.
Bueno ahora tenemos los recursos disponibles, para iniciar cabe aclarar varios aspectos.
Primero un videojuego en 3D creado con Game maker, se programa en 2D, con la diferencia
de que al ejecutar el juego, solo se dibujara (mostrara) lo que se indique en el evento
draw y con codigos 3D, que por lo general inician en d3d_ .
Para los HUD (estatus del jugador: vidas, energa, balas) utilizamos lo que llamamos
Orthos: Esta es una funcin que permite que durante el juego 3D se puedan dibujar
grficos en 2D.
Ya con esto saben que el juego se programa en 2D, y al iniciarlo en modo 3D solo mostrara
lo que este en el event draw, en pocas palabras aadir un background desde el mismo
room, o usar tilles, sprites, es algo que ya no se ve durante el modo 3D.
Iniciemos programando nuestro juego de naves.

Abrir el game maker, yo usare el GM8, pero los cdigos que en este Tutorial usare sirven
para el game maker 6 en adelante.
Click derecho sobre sprites y click en Create Group veras que se creo una carpeta
nmbrala groupSprites, aqu crearemos los sprites que usaremos al programar el juego en
2D antes de iniciar el modo 3D.
Crea otro Group en sprites de igual manera y nombrala groupTex aca guardaremos las
texturas que usaremos en los objects para que se visualicen cuando inicie en modo 3D.
Ahora click derecho sobre groupSprites y click en create sprite, esto para crear el sprite
dentro de la carpeta, aunque si por error lo creas fuera de la carpeta groupSprites, puedes
arrastrar con el Mouse en sprite hasta el Group.
Todos los sprites al crealos los centraremos, presionando el boton center.
Iniciamos creando un Sprites de 4x4 el cual ser una esfera, lo usare para la sprbala.
Creamos un sprite de 16x16 esfera que llamaremos sprNave.
Creamos un sprite de 16x16 que llamaremos sprAsteroide.
Ahora en el groupTex creamos un sprite el cual llamaremos texAsteroide y subimos la
imagen de 64x64 que tenemos para el asteroide. Y Creamos uno de 4x4 el cual llamamos
texBala que sea cuadrado y amarillo.
Ahora simplemente creamos un sprite el cual llamamos OrthoNave y subimos el sprite de la
nave.
Ahora en la carpeta Sounds, crearemos y subiremos nuestros dos sonidos el sndDisparo y el
sndExplosion.
En Backgrounds crearemos y subiremos la imagen del espacio que tenemos de 128x128 y lo
nombraremos texEspacio.

El resultado final de los recursos ya en el game maker, ser este.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos a crear los objects.
Crea estos objects.
objBala, objNave, objAsteroide, objCreaAsteroides.
Ahora agregaremos los cdigos necesarios a cada objects.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Crear el objBala asignarle el sprite sprBala.
Event create
direction=objNave.direction speed=5;
sound_play(sndDisparo);
Event collision contra objAsteroide
instance_destroy();
Event out side Room
instance_destroy();

Como puede notar la programacin es en 2D, solo cambia el aspecto visual sea se vera
solo lo que dibujemos en el event draw.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw. Mismo objBala.
//aca indicaremos que se vea una esfera pequea que sern las balas.
// primero declaramos una variable para guardar la textura de la bala.
var tex;
tex=sprite_get_texture(texBala,0);
d3d_draw_ellipsoid(x-2,y-2,-2,x+2,y+2,2,tex,1,1,32)
aca solo indico dibuje una esfera de 4x4x4 (x-2,y-2,-2,x+2,y+2,2) usando la textura
cuardada en tex (tex,), que repita la textura horizontal y vertical hasta llenar la esfera
(1,1), y repita 32 veces el dibujado.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos con el objAsteroide asignale el sprite sprAsteroide.
En su event create.
direction=(random(360)) speed=choose(0.5,1,2);
//direccion y velocidad aleatorios.
tt=choose(4,8,12); //para variar el tamao
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event out side room
move_wrap(1,1,1); //salga por el lado contrario.
Event Collision contra la objNave
instance_destroy();
//se destruye el Asteroide al chocar contra la nave.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision contra objBala
instance_destroy();
//se destruye el Asteroide al chocar contra la Bala.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event destroy
score+=1;
sound_play(sndExplosion);
______________________________________________________________________________
______________________________________________________________________________

____________________________________________
Event Draw.
Veran que lo unico que se diferencia en este object la programacion 2D al 3D es este
event.
var t;
t=sprite_get_texture(texAsteroide,0);
d3d_draw_ellipsoid(x-tt,y-tt,-tt,x+tt,y+tt,tt,t,1,1,32);
//use la variable xyz para asi variar el tamao de Asteroide y no sean todos iguales.
//codigo parecido al de la bala para dibujar esferas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos con el object objCreaAsteroides
Bueno este object unicamente creara asteroides de manera que salgan todo tiempo.
Event create.
alarm[0]=5*room_speed;
//activa la alarm 0
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event alarm 0
alarm[0]=5*room_speed; //Reactiva la alarm0
instance_create(choose(0,room_width),choose(0,room_height),objAsteroide);
//indique que creara el asteroide de manera aleatoria en los 4 extremos del room.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos con el objNave asignale el sprite sprNave y la mask sprNave.
Event create.
health=100; //energia vital de la nave.
score=0; //puntaje.
disparar=true; //indica si podra o no disparar.
z=1; //declaro la coordenada Z que usara la camara osea la view.
friction = 0.2; //desaceleracion de la nave.
// iniciar el modo 3D
d3d_start()
d3d_set_culling(false)
d3d_set_fog(false,c_black,1,8192+4096)
d3d_set_lighting(false)
d3d_set_hidden(true)
d3d_set_perspective(true)
d3d_set_shading(true)
draw_set_color(c_white)
texture_set_interpolation(true)
Event step
if keyboard_check(vk_left)
{direction+=5;} //gira a la izquierda
if keyboard_check(vk_right)
{direction-=5;} //gira a la derecha.

if keyboard_check(ord("Z"))
{speed=5;} //acelera.
if keyboard_check(ord("X")) and disparar
{instance_create(x,y,objBala) alarm[0]=1*room_speed; disparar=false; } //Dispara.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
if health<1
{room_goto_next();}
//en ese otro room solo mostrare el score e indicare Game over
//como ves aca lo unico que se diferencia de la programacion 2D es el valor de Z.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event alarm 0
disparar=true; //podra disparar.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event out side room.
move_wrap(1,1,1); //salga por el lado contrario.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event collision contra Asteroide
health-=5; //resta energia.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event outside room
move_wrap(1,1,1); //salga por el lado contrario.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
// camara
d3d_set_projection(x,y,z,x+cos(direction*pi/180),y-sin(direction*pi/180),z, 0,0,1);
// color y transparencia
draw_set_alpha(1);
draw_set_color(c_white);
______________________________________________________________________________

______________________________________________________________________________
____________________________________________
//dibujar el espacio
var text; //declaro variable text.
text=background_get_texture(texEspacio);
d3d_draw_ellipsoid(-2216,-2216,-2216,2216,2216,2216,text,1,1,64)
//dibujo una esfera con el doble del tamao del room para cubrirlo todo asi todo pasa
dentro de la esfera
//que es nuestro espacio osea nuestro universo.
//ahora activare los orthos.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora crearemos 2 nuevos sprites de 2x2 uno de color rojo y el otro de color amarillo
Al rojo le llamaremos sprNaveRadar, y al amarillo sprAsteoridesRadar.
Creamos un object llamado objOrthos
Algo importante aca se dibujara todo lo que es 2D dentro del ambiente 3D, se usara para
la nave, los hud (Estados), para el object que posee los orthos deben colocar una
profundidad negativa muy exagerada como -100 iniciemos
objOrthos.
Even create
depth=-100;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw.
//ahora bienen los HUD (orthos)
{
d3d_set_projection_ortho(0,0,640,480,0); //este permite dibujar en 2D durante el 3D
d3d_set_hidden(false);
//dibujar sprite de la nave
if keyboard_check(vk_left)
{draw_sprite_ext(orthoNaveizq,-1,322,480,2,2,0,c_white,1);}
else
if keyboard_check(vk_right)
{draw_sprite_ext(orthoNavedere,-1,322,480,2,2,0,c_white,1);}
else
{draw_sprite_ext(orthoNave,-1,322,480,2,2,0,c_white,1);}
draw_set_alpha(0.4);
//dibujar barra de energia
draw_healthbar(64,300,256,316,health,c_black,c_red,c_lime,0,true,true);
//dibujar score.
draw_set_font(font0); //crea esta font0 yo la hice de tamao de letra 24.
draw_text_color(64,332,"score: "+string(score),c_white,c_silver,c_white,c_dkgray,1)
draw_set_alpha(1);
d3d_set_hidden(true);

//para el radar

with(objAsteroide)
{
if collision_ellipse(x-400,y-400,x+400,y+400,all,0,0)
{
draw_sprite_ext(sprAsteoridesRadar,0,((x)/9)+486,((y)/9)+
380,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
}
}
//dibuja al jugador
with(objNave)
{
if collision_ellipse(x-400,y-400,x+400,y+400,all,0,0)
{
draw_sprite_ext(sprNaveRadar,0,((x)/9)+486,((y)/9)+
380,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
}
}
}
Ahora crea un room de 640x480, en su pestaa Backgrounds desmarcar la casilla Draw
Background Color y coloca en el los siguientes objects.
objNave, objOrthos, objAsteroide.
Ya podemos probarlo y veremos los resultados, lo unico que nos falta es hacer el room
para cuando pierdes, osea cuando ya no tienes energia, recuerda que coloque que cuando
no tienes health pasa al siguiente room.
Iniciemos creando un object llamemoslo objCreditos
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el event create
d3d_end() //finaliza el modo 3D
background_index[0]=texEspacio; //usare la textura como fondo.
background_visible[0]=true; //indico que se vea el fondo.
//como ya no estara modo 3D podra verse el background.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el event Draw
draw_set_font(font0);
draw_text_color(204,128,"score: "+string(score),c_white,c_silver,c_white,c_dkgray,1) //el
score.
draw_text_color(204,200,"Press Enter ",c_white,c_silver,c_white,c_dkgray,1) //press
enter.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el event Press Enter.
game_restart();
//reinicia el juego.

Ahora crearemos un room con las medidas del anterior room.


Y colocaremos el objCreditos.
En donde dice Global Game Settings click derecho y click en properties, y en la ventana
que abre, desmarcamos la casilla Display the Cursor y Marcamos la casilla, Star in fullScreen mode y listo.

Ahora listo a probar tu juego, recuerda acelera con Z y disparas con X.


Ahora crearemos otro videojuego en 3D de manera que aprendas mas de esto.
www.tutoek.tk
Presenta
Tutorial Maze en 3D.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Hola, en este tutorial mostrare como crear un videojuego de maze en 3D.
Para iniciar vamos primero a organizar nuestro juego. Ante que nada creen una carpeta
con el nombre del juego, en mi caso creare la carpeta con el nombre Tutorial Maze 3D
Dentro de esta carpeta creen otras carpetas, las cuales llamaremos sprites, backgrounds,
sounds, Editable. Ah guardaremos los recursos que usaremos durante la fabricacion del
videojuego.
En la carpeta Editables guardaremos el editable (gmk) de nuestro juego. En la carpeta
sprites crearemos 5 imgenes una la llamaremos texSnowMan la otra texSManCabeza
la otra texpared la otra texFuego, y texRegalo todas de 64x64 y en formato .png.
En la carpeta Backgrounds crearemos una imagen de 128x128 que sea blanca como nieve,
esta la usaremos luego para el suelo del juego y la nombramos texSuelo en .png.
En la carpeta Sounds agregaremos 2 sonidos los llamaremos sndRegalo, y sndWin.
Listo nuestros recursos abran el game maker de version 6 o superior.
Ahora tal cual como hemos organizado nuestro juego iniciemos subiendo los recursos al
game maker.
Creamos 5 sprites los cuales nombraremos texPared y texSnowMan, texSManCabeza,
texFuego, y texRegalo, usando claro los sprites que previamente organizamos.
Creamos un background al cual llamamos texSuelo.
Creamos 2 sonidos los cuales llamamos sndWin y sndRegalo.
Claro cada uno de estos subiendo el recurso respectivo que previamente organizamos.
Ya subimos los recursos previamente seleccionados y organizados.
Ahora vamos a crear algunos sprites.
Creamos un sprite de 25x25 el cual llamamos sprPlayer, (si centrar dejar estndar).
Creamos un sprite de 16x16 el cual llamamos sprRegalos, Reguerda Centrarlo.
Creamos un sprite de 32x32 el cual llamamos sprPared (si centrar dejar estndar)
Creamos un sprite de 30x30 el cual llamamos sprFuego centrarlo.
Se que es posible que se preguntes Qu sera eso de centrar? Bueno al crear un sprite
notaras que hay un boton que dice Center, solo denle click.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora crearemos 6 objects.
objPlayer, con el sprite de sprPlayer.
objFuego, con el sprite de sprFuego.

objRegalo, con el sprite de sprRegalo.


objPared, con el sprite de sprRegalo
objOrthoHud. Sin sprite.
objCamara. Sin sprite.
Debera verse asi
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Iniciamos la programacion. Les recuerdo que el juego se programa en 2D, con el unico
cambio de que lo que se visualiza durante el juego en modo 3D, es solo lo que se indico en
el event draw.
objPlayer.
Event create.
d3d_start()
d3d_set_culling(false)
d3d_set_lighting(false)
d3d_set_hidden(true)
d3d_set_perspective(true)
d3d_set_shading(true)
draw_set_color(c_white)
texture_set_interpolation(true)
//esto es para iniciar el modo 3D del game maker.
//declaro la var z
z=128; //coordenada z de la camara
GameOver=false; //esto es para cuando pierdas el juego.
score=0; //declaro inicie el score.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event alarm0
//reinicia el juego
game_restart();
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event step
if keyboard_check(vk_left) and place_free(x-5,y)
{direction=180; speed=5;}
else
if keyboard_check(vk_right) and place_free(x+5,y)
{direction=0; speed=5;}
else
if keyboard_check(vk_up) and place_free(x,y-5)
{direction=90; speed=5;}
else
if keyboard_check(vk_down) and place_free(x,y+5)
{direction=270; speed=5;}
//Esto para el movimiento.

if speed>0 and z>20


{z-=5;}
else
{z=512;}
//sube y baja la camara.
if !instance_exists(objRegalo)
{sound_play(sndWin) d3d_end(); show_message("Ganaste") game_restart();}
//cuando agarres todos los regalos.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event collision contra el objFuego
GameOver=true; //solo para que salga el texto Game over
//indica que perdio el juego.
alarm[0]=1*room_speed; //esta alarm reiniciara el juego.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision contra objPared
speed=0;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
var b, t;
b=sprite_get_texture(texSnowMan,0); //guardo en var B la textura a usar.
t=sprite_get_texture(texSManCabeza,0);
d3d_draw_ellipsoid(x,y,-10,x+30,y+30,20,b,1,1,32); //dibuja cuerpo de snowman.
d3d_draw_ellipsoid(x,y,16,x+30,y+30,50,t,1,1,32); //dibuja cabeza de snowman.
//este fue para diubujar mueco de nieve.
//dibujar el suelo.
var f;
f=background_get_texture(texSuelo); //guardo en var f la textura a usar.
d3d_draw_floor(0,0,0,room_width,room_height,1,f,1,1);
Con esto terminamos con el objPlayer.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos con el objFuego
Event Create.
direction=choose(0,90,180,270) speed=3;
//direccion aleatoria en cuatro direcciones segun los puntos cardinales.
______________________________________________________________________________

______________________________________________________________________________
____________________________________________
Event Collision contra objPared
speed=0;
direction=choose(0,90,180,270) speed=3;
//direccion aleatoria en cuatro direcciones segun los puntos cardinales.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
var d;
d=sprite_get_texture(texFuego,0);
d3d_draw_cone(x-7,y-7,0,x+8,y+8,45,d,1,1,1,32);
//dibuja un cono que es el fuego.
Con esto listo el objFuego-.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos con el objRegalo
Event Destroy
sound_play(sndRegalo);
//sonido de cuando coje el regalo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision contra el objPlayer
score+=1;
instance_destroy();
//cuando la toque el player suma score y se destruye.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
var c;
c=sprite_get_texture(texRegalo,0);
d3d_draw_block(x-8,y-8,0,x+8,y+8,16,c,1,1);
//dibuja los Regalos
Teminamos con el objRegalo
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos con el objPared, primero marcar la casilla solid, o escribes en el event create
solid=true;
Event Draw
var c;
c=sprite_get_texture(texRegalo,0);

d3d_draw_block(x-8,y-8,0,x+8,y+8,16,c,1,1);
//dibuja los ladrillos de la pared.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
.- Ahora vamos al objOrthoHud
Event Create.
depth=-100;
//recuerda que las camaras orthos deben tener el depth negativo en -100
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
d3d_set_projection_ortho(0,0,640,480,0);
d3d_set_hidden(false);
draw_text_color(160,0,"score: "+string(score),c_white,c_silver,c_white,c_dkgray,1)
if objPlayer.GameOver
{draw_text_color(160,96,"GAME OVER",c_white,c_silver,c_white,c_dkgray,1)}
draw_set_alpha(1);
d3d_set_hidden(true);
//esto es para dibujar el score osea el puntaje.
//y cuando pierda saldra Game over, se paraliza el juego un momento y se reinicia.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora el objCamara.
Event Create
depth=100; //el object que lleva la camara (projection) debe estar el depth positivo en
100.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event draw
//ahora agregaremos la camara.
move_towards_point(objPlayer.x,objPlayer.y+256,point_distance(x,0,objPlayer.x,0))
d3d_set_projection_ext(x,y,objPlayer.z,objPlayer.x,objPlayer.y,16,0,0,1,60,1.33,1,1024)
con esto culminamos con el objCamara.
Ahora crea un room de 514x514, y agrega los object usando el objPared para los bordes y
dejando un camino transitable para el player y coloca los regalos por el camino, mejor
mira la imagen, de cmo queda el room.
Recuerda en la pestaa background cambiar el color de fondo por el color negro o uno de
su gusto.
Con esto listo el juego.
Como as visto en este manual as aprendido a crear videojuegos en 2D y 3D con el game

maker, suerte con tus proyectos


Manual de www.tutoek.tk

TUTORIAL JUEGOS MULTIJUGADOR ONLINE.


Introduccion.
GameMaker tiene un soporte multijugador. Este tutorial explica como usarlo. Ten cuidado
con esta idea. Crear efectivos juegos multijugador no es nada fcil. Necesita que seas un
usuario con experiencia en GameMaker. Necesitas entender el uso de algo de cdigo (GML).
Entonces no hagas esto en el primer juego que desarrollas. Tambin, para esta funcion
necesitas tener el GameMaker registrado.
Trataremos los siguientes aspectos:
1-Establecer una conexin hacia distintas computadoras.
2-Crear o unirse a sesiones de juegos.
3-Conservar los juegos sincronizados
La ltima parte es el aspecto ms difcil para todos los juegos multijugador. El problema
es asegurarse que los dos jugadores vean exactamente los mismo en el juego. Por ejemplo,
en el juego de Pong, ambos jugadores deben estar viendo la pelota en el mismo lugar al
mismo tiempo. Gamemaker proporcionara herramientas para hacerlo pero tu mismo
tendrs que disear la comunicacin para cada juego que hagas.

ESTABLECIENDO LA CONEXION
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
La manera normal en la cual funciona un juego multijugador se explica enseguida. Cada
jugador corre una copia del juego, aunque cada uno lo puede hacer de forma distinta. Un
jugador los corre en el modo de servidor. Los otros lo hacen en el modo de cliente. El
jugador en modo servidor debe comenzar el juego primero y crea las sesiones del juego.
Los otros luego pueden asociarse para unirse al juego. Los jugadores tienen que decidir
sobre el mecanismo usado para la comunicacin entre las computadoras. En una red local,
lo ms fcil es usar una conexin IPX (ver debajo para ms detalles). Si todos los jugadores
estn conectados al Internet, TPC/IP es normalmente usado. En este protocolo los clientes
tienen que saber la direccin IP del servidor. Entonces el jugador corriendo el juego en el
modo de servidor debe dar su direccin IP a los otros jugadores (por ejemplo, para darles
un correo electrnico). Puedes encontrar tu direccin IP usando Simbolo de sistema, o
dando click en Ejecutar, escibes cmd sin las comillas, y una ves ah, escribes ipconfig
eso te mostrara tu ip. Tambin puedes usar la funcin del GameMaker mplay_ipaddress()
para esto.
Entonces para comunicar dos computadoras se necesita algn protocolo de conexin. Como
la mayora de los juegos, Gamemaker ofrece cuatro tipos distintos de conexiones: IPX,
TCP/IP, MODEM y Serial, de los cuales en pruebas realizadas la mas funcional es TPC/IP, y
sera la que explique en este tutorial.
La conexin TPC/IP es el protocolo de Internet. Este puede ser usado para jugar contra
otros jugadores en algn sitio en Internet suponiendo que sabes su direccin IP. Recuerda
uno crea el server y el/los otros son clientes, por lo que quien creo el server debe darte su
ip. En una red local tu puedes usarlo sin proporcional direcciones. Finalmente, cuando se
usa una lnea serial (una conexin directa entre computadoras) t necesitas proporcionar

un nmero para la configuracin del puerto. Hay cuatro funciones de GML que pueden ser
utilizadas para establecer estas conexiones.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
mplay_init_tcpip(addr) Inicia una conexin TCP/IP. addr es un string que contiene la
direccin de la Web o su direccin IP. Por ejemplo: miserver.no.ip.info, 123.123.12,
Solo cuando se participa en una sesin (ver debajo) necesitas proporcionar una direccin.
La persona que crea el server (seccion) necesita dar una direccin (porque la direccin de
su computadora es la nica que se usa). En una red de conexin local no se necesita una
direccin ip pero de todas formas es necesario crear la comunicacin.

Tu juego debe llamar una de esta funcion exactamente. Todas las funciones devuelven si se
ha logrado con xito. No se logra si l protocolo particular no esta instalado o no es
soportado por tu maquina, (Verifica el firewall no bloquee la conexin).
Entonces el primer room en nuestro juego debe mostrar la posibilidad y permitir que el
jugador cree un server o se una a uno creado, (o solo permitir los protocolos que t quiera)
Iniciamos creando un object llamesmolo objCreaConex colocale un sprite de boton que
diga Conectar.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el event create agrega esto.
//declaramos la variable guarip que contendr la miip que escribiremos
//la cual es nuestra propia ip.
miip = mplay_ipaddress();
alarm[0]=0.2*room_speed;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Alarm[0]
//Esto abrira una ventana para que escribas la ip de tu pc.
miip=get_string("Coloca la ip de la secion,miip)
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora en el Event left pressed
//verifica si hay conexin y de haber pasa al otro room, de lo contrario dice que:
Conexin fallida
if (mplay_init_tcpip(miip)) room_goto_next();
else
show_message('Conexion fallida');

Ya hay una conexcion, ahora hay que ver si hay algun server (secion) creado, para unirte, o
crear tu una secion (server).
Cuando el juego termine, cuando el juego no necesite ms usar la facultad multijugador,
necesitas seguir la siguiente rutina para terminarlo:
mplay_end() termina la conexin actual. Devuelve si lo ha hecho con xito. Recuerda que
antes de cerrar el juego termine con la conexin.
Tambin necesitas usar esta rutina para iniciar una conexin distinta.

SESIONES DE JUEGO
Cuando te conectas a una red, pueden estar mltiples juegos corriendo en la misma red.
Nosotros llamamos a estas sesiones (server). Estas sesiones distintas pueden pertenecer
a distintos juegos o al mismo. Un juego tiene que identificarse nicamente a l mismo en
la red. Afortunadamente, GameMaker hace esto por ti. La nica cosa que debes saber es
que cuando tu cambias el id del juego en las configuraciones globales del juego (Global
Game Setting) esta identificacin cambia. De esta manera puedes evitar que las personas
con versiones antiguas de tu juego compitan contra las personas que tengan las versiones
nuevas.
Ahora para continuar creamos un room el cual llamamos rmSecion
Para este room crearemos los siguientes objects.
objCrear A este le asignamos un sprite de boton que diga Crear secion (server)
en el event Create.
//estos guardaran datos al momento de crear el server.
textserver=0; //le daras nombre a la secion;
textPjs=0; //le das nombre a tu personaje.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Mouse left pressed
//al hacer click pregunta por el timpo de server a crear.
textserver=get_string("Nombre para el Server","server"); //pregunta nombre a la secion;
textPjs=get_string("Nombre para el Jugador","Jugador"); //pregunta nombre a tu
personaje.

// nos dirigimo a la room donde crearemos la partida


//se crea y comprueba la sesion al mismo tiempo con una sentencia if
//la sesion se creara tomando los datos de las variables "texto" de los objetos que hemos
visto
//si la conexin no se realiza correctamente, mostraremos un error
if (mplay_session_create(textserver,10,textPjs))
{
//declaramos esta variable con el valor 0, porque el es el primer jugador, el host.
global.player = 0;
room_goto(test_room);
}
else show_message('Fallo al intentar crear sesion');
//donde coloque 10 es el numero maximo de jugadoires permitidos, podrias llevarlo a 50 si
posees una poc potente-.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora Creamos un object que llamaremos objDesconect Con un sprite de boton que diga
Desconectar.
En el event mouse left pressed colocamos
mplay_end(); //cierra la seccion (conexcion) es bueno colocar este code, en el event de
tecla pressed Esc, asi cuando alguien sale es desconectado por defecto.
room_goto_previous(); //regresa al room anterior donde aun no nos conectabamos.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Creamos un object el cual llamaremos objUnir Este lo usaremos para ingresar a un
server (secion) existente.
Event Create
//seleccionamos la primera subimagen del sprite
image_single = 0;
//guardamos el numero de sesiones activas
server= mplay_session_find();
//declaramos la variable severnum con una cadena vacia, esta variable guardara el nombre
de las sesiones
servernum = '';
/*declaramos la variable posicion con el valor 0
esta variable guardara la posicion, pero no la posocion Y solo la posicion X, la posicion Y la
utilizaremos para identificar el numero correcto de la sesion
no es lo mismo que selecciones una sesin, o que selecciones esa misma sesin cuando ya
has movido la lista, ya que estaran en distintas posiciones, por eso es necesario el uso de
esta variabe.
ejemplo, si una sesion esta en la primera posicion (0), y movieramos la lista hacia arriba,
esa sesin estaria una posicin mas arriba que antes
*/
posicion = 0;
//creare una alarm que actualizara la lista de seciones existentes.
alarm[0]=3*room_speed;
//en este caso esta variable sera la posicion Y del rectangulo que dibujaremos para saber
que seleccion hemos realizado
yy = 48;
//declaramos la seleccin con un valor nulo
//esta variable contendra el numero de la sesion seleccionada
seleccion = noone;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Alarm 0

//se actualizara y volvera a reiniciar la alarm manteniendo asi un ciclo de actualizar la


lista cda 3 segundos.
server= mplay_session_find();
alarm[0]=3*room_speed;

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el event mouse left pressed
pedimos al usuario su nombre de juego y la guardamos en una variable
name = get_string('Tu nombre','');
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
En el siguiente linea d ecodigos, se une y comprueba la sesin, y al mismo tiempo con una
sentencia if se unir a la sesin tomando como parametros, el nmero de la sesin
(objConectar.miip) y el nombre pedido anteriormente con "name" si la conexin no se
realiza correctamente, mostraremos un error
declaramos una variable global con un valor que indicara el numero de jugador para que
podamos identificarlo en otros casos fcilmente si crearamos una sesion, el valor le
pondramos 0, pero en caso de unir el valor sera la cantidad de jugadores en partida
restado por 1 (ten en cuenta de que tu ya estas dentro))
Ejemplo; si hay tres jugadores en juego (tu y otros dos) sera global.player = 3-1, que es 2.
El host (server) seria 0, el proximo 1, y tu el 2.
if (mplay_session_join(seleccion,name))
{
global.player = mplay_player_find()-1;
room_goto(rmjuego); //donde rmjuego se supone es el nombre del primer room del juego.
}
else
show_message('Fallo al intentar entrar'); //mensaje de que fallo al entrar.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Global mouse pressed
//si pulsamos en cualquier lado de la pantalla, y el mouse esta entre las coordenadas
indicadas...
//la seleccion dependera de la variable posicion
//no es lo mismo que selecciones una sesin, o que selecciones esa misma sesin cuando ya
has movido la lista, ya que estaran en distintas posiciones, por eso es necesario el uso de
esta variabe.
//ejemplo, si una sesion esta en la primera posicion (0), y movieramos la lista hacia
arriba, esa sesin estaria una posicin mas arriba que antes (-1), por eso debemos sumar la
variable posicion (teniendo en cuenta de que el valor puede ser negativo o positivo), que
es la variable que hemos modificado cada vez que hemos movido la lista arriba o abajo
if (mouse_y >= 48 && mouse_y < 192 && mouse_x > 32)
{
seleccion = yy/16 - 3 + posicion;
}

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
//dibujamos el sprite del boton
draw_sprite(sprite_index,image_index,x,y)

//nos basamos en un bucle for para mostrar la lista de sesiones


//i es 0, si i es menor que la cantidad de sesiones activas, i se sumara con 1
//de esta manera i pasara a tener todos los valores hasta la cantidad de sesiones
for(i=0;i<server;i+=1)
{
//guardamos el nombre de la sesion con el numero que tenga i en este momento
servernum= mplay_session_name(i);
//dibujamos el numero de la sesion seguido del nombre
draw_text(48,i*16+yy,string(i+1) + ' - ' + string(servernum));
}
//dibujamos el entorno, lineas etc.
draw_line_color(16,32,room_width/2,32,c_gray,c_white);
draw_line_color(room_width/2,32,room_width-16,32,c_white,c_gray);
draw_line_color(16,room_height-32,room_width/2,room_height-32,c_gray,c_white);
draw_line_color(room_width/2,room_height-32,room_width-16,room_height32,c_white,c_gray);
//dibujamos el string "Sesiones" seguido del numero de sesiones entre parentesis
draw_text(16,8,'Sesiones (' + string(server) + ')');
//dibujaremos el nombre de la sesion seleccionada abajo a la izquierda
//la variable seleccion es la que contendr la sesion seleccionada
draw_text(16,216,string(mplay_session_name(seleccion)));
//si el raton esta dentro de esas coordenadas
if (mouse_y >= 48 && mouse_y < 192 && mouse_x > 32)
{
if (mouse_y < 64) yy = 48;
else if (mouse_y < 80) yy = 64;
else if (mouse_y < 96) yy = 80;
else if (mouse_y < 112) yy = 96;
else if (mouse_y < 128) yy = 112;
else if (mouse_y < 144) yy = 128;
else if (mouse_y < 160) yy = 144;
else if (mouse_y < 176) yy = 160;
else if (mouse_y < 192) yy = 176;
//dibujaremos el rectangulo dependiendo de la posicion del mouse
draw_rectangle_color(40,yy,room_width,yy+16,c_white,c_white,c_white,c_white,false);
}
/*Te explico un poco mas... Lo que pasa es que al clickear en el lado izquierdo de la
pantalla estarias
sobre alguna de las posiciones YY eso da como resultado la apariencia de que clickeaste

sobre alguna seccion.*/

Ahora ya sabemos como unirse al server (secion) ya existente, Para que otros se unan a tu
secion (recuerda si tu eres el server los otros Al conectarse deben colocar tu IP).

GAME PLAY / DATOS COMPARTIDOS


Ya tenemos un server online, y un cliente por asi decirlo que esta conectado al server,
pero al conectarse Qu pasara? Aca es donde quiero llegar, debe existir un game play,
para que asi alguien pueda jugar, la verdad el game play es muy similar a cualquier cosa
antes vista, solo que debemos establecer mediante un object el que muestre nuestros
personajes. Y ademas en ambas Computadoras, muestre la misma informacion.
Inicialmente creamos un room para el Game_play donde colocamos todos los aspectos del
juego, y claro los personajes a usar en tu juego el objPlayerServer y el objPlayerCliente,
tambien un object que crearemos que se llamara obj_client, Empecemos por crear el
objClient, ya que sera el que envie y reciba los datos de los jugadores en secion.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Para iniciar crearemos un object que llamaremos obj_client.
//este objeto sera el que reciva y controle todos los mensajes (evio y recibo de datos) y
sus valores
//mediante un bucle for crearemos la cantidad de arrays que queramos para guardar las
ids de las instancias que representaran a los otros jugadores (obj_player_other)
//y les asignamos un valor normalmente invlido para una id, por ejemplo -1 (un valor
negativo)
for(i=0; i < 10; i+=1)
{
players[i] = -1;
}
//la siguiente funcin la llamo solamente porque es necesario usarlo antes de
que esta mas abajo, para que funcione.
mplay_player_name()
player_tot = mplay_player_find();
//cuando se ejecuta el evento create de este objeto quiere decir que un jugador nuevo
entra en partida
//entonces enviamos un mensaje a todos con la id 5 (vease mas abajo) y con el valor del
numero del jugador
mplay_message_send(0,5,global.player);
//asignamos a la variable de nuestra instancia nuestro nombre para que se muestre
objPlayerServer.name = mplay_player_name(0);
/*
para enviar mensajes utilizaremos distintas ids de mensajes, y lo haremos asi,
las id:

0 - la utilizaremos para enviar informacion sobre la coordenada X de los jugadores


1 - la utilizaremos para enviar informacion sobre la coordenada Y de los jugadores
2 - para el sprite actual del jugador
3 - para la velocidad del sprite
4 - para la excala X del sprite, image_xscale para poder girar el sprite
5 - para notificar de una entrada de un jugador
6 - para la salida de un jugador
7 - para enviar identificar a quien hay que asignar los valores anteriores, por eso hay que
enviar este mensaje antes que otro
Asi con esto se mantiene actualizada la informacion entre las seciones.
*/
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Step.
//mientras reciva mensajes de cualquier jugador...
while (mplay_message_receive(0))
{
//asignamos la id del mensaje actual
messid = mplay_message_id();
//asignamos el valor que contiene el mensaje actual
value = mplay_message_value();
//ahora dependeremos de la id del mensaje
switch(messid) {
//se recomienda comenzar a leer por el case 5, ya que hasta mas adelante no se
explica sobre la variable "player"
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 0:
//actualizamos la posicin X del objeto ("player")
player.x = value;
break;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 1:
//actualizamos la posicin Y del objeto ("player")
player.y = value;
break;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 2:
//actualizamos el sprite del objeto ("player")
player.sprite_index = value;
break;

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 3:
//actualizamos la velocidad del sprite del objeto ("player")
player.image_speed = value;
break;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 4:
//actualizamos la escala X del objeto dado ("player")
player.image_xscale = value;
break;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 5: //cuando un nuevo jugador entra en la sesin...
//esta variable contendra el valor que nos envian de global.player, lo utilizaremos
como id del usuario, ojo!!no la id de la instancia
userid = value;
//guardamos la id de la instancia creada del objeto que representa a los otros
jugadores
user = instance_create(objPlayerServer.xstart,objPlayerServer.ystart32,objPlayerClientes);
//asignamos al array dependiente de la id del usuario la id de la instancia creada
players[userid] = user;
break;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 6: //cuando un jugador abandona
//haremos lo mismo que cuando un jugador entra, pero el valor del array vuelve a
ser -1, y la instancia se elimina
playerid = value;
with(players[playerid]) instance_destroy();
players[playerid] = -1;
break;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
case 7: //recivimos la id del usuario que nos lo envia...
//lo guardamos en esta variable
other_id = value;
//guardamos en esta variable la id de la instancia dependiendo de la id del usuario
obtenido
//de esta manera arriba lo utilizaremos como si fuera un objeto, ejemplo:
player.x
player = players[other_id];
break;
}

}
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Game_End
mplay_message_send(0,6,global.player);
//envia la info de que se desconecto asi lo borra de pantalla.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora vamos con el objPlayerServer, Este sera tu personaje principal es decir con quien
jugaras, asi que colocale todo los codigos necesarios para usarlo, pero agregale estos a
continuacion que son necesarios para la conexcion.
Event create.
//activamos la alarma en un step
alarm[0]=1*room_speed;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Alarm0
//envia los mensajes con cada uno su id y valor correspondiente
//se envia primero el mensaje de la id 7 porque es el que hemos elegido para identificar el
jugador al que aplicaremos los valores de los prximos mensajes
mplay_message_send(0,7,global.player);
mplay_message_send(0,0,x);
mplay_message_send(0,1,y);
mplay_message_send(0,2,sprite_index);
mplay_message_send(0,3,image_speed);
mplay_message_send(0,4,image_xscale);
//volvemos a activar la alarma a un step
alarm[0]=1*room_speed;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
//Dibujar el jugador
draw_sprite_ext(sprite_index,image_index,round(x),round
(y),image_xscale,image_yscale,image_angle,image_blend,image_alpha);
//Dibuja el nombre
draw_text(round(x)-string_width(name)/2,round(y)-30-(sin(current_time/200)*1),string
(name));
______________________________________________________________________________
______________________________________________________________________________
____________________________________________

Por ultimo creamos el objPlayerClientes


Este no lleva ningun tipo de codigo necesarios para el juego, ya que solo sera un object
figurado, es decir como referencia.
Puedo decir que esta instancia representara a todo y cada uno de los jugadores de la sala,
menos tu mismo
//Esto es para que se vea arriba el nombre que le as dado.
draw_sprite_ext(sprite_index,image_index,round(x),round
(y),image_xscale,image_yscale,image_angle,image_blend,image_alpha);
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Para el resto de los objects como suelos enemigos, y todos los necesarios para tu juego no
hace falta que especifiques ningun codigo de transferencia de datos.
Bueno Espero te sea de utilidad y crees muchos juegos MMORPG.
Listo ya tienes un juego multijugador online.
Para probarlo, no lo hagas desde el editable, crea dos Executables y prueba uno en tu
computadora, y el otro en otra computadora, crea un server y pidele se una a tu secion.

Nota: Al iniciar el juego el Firewall te pregunta si deseas desbloquearlo, y claro debes


decir que si.
Algunos antivirus bloquean estas conexciones, por lo que colocalo en exclusiones.
Sin mas nada que decir suerte, en tus proyectos

Tutora plataformas en 3D
Lo primero que debemos hacer es abrir el game maker, lgicamente, tambin debemos
tener registrado nuestro game maker, osea la versin pro.
Comento que solo mostrare los bsico, es decir la programacin 3D y 2D solo se diferencian
pos la coordenada Z (profundidad visual), el uso de una proyeccin en vez de view y los
event draw.
Ahora que tenemos abierto nuestro game maker iniciemos.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
.- Creando sprites.
Crea 1 sprite circular el cual ser nuestro jugador.
Crea 1 sprite Cuadrado de 32x32 el cual ser nuestro piso.
Para un juego de plataformas es necesario que cuando crees sprites des marques la casilla
Presise Collision ya que te evitara problemas con las colisiones, aunque recomiendo usar
mask cuadradas, aqu no explicare eso, ya que me enfocare en ensear como hacerlo 3D.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
.- Ahora crearemos un Brackground el cual usaremos de textura lo llamare texPiso y sera
un cuadro de 32x32 del color que quieras tener el piso de tu juego.
.- Ahora creemos nuestros objects.
.- objJugador y le asignamos el sprite circular.

objPiso y le asignamos el sprite del piso y marcamos la casilla Solid.


.- objCamara //sin sprite solo llevara los codigos 3D de la proyeccin (como la view en 2D)
Siempre es bueno tener organizado lo que deseas hacer y crear todos los sprites y objects
de una vez as podrs a la hora de colocar cdigos en los objects usar los event de
colisiones si problemas.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Ahora editemos el objJugador (Properties) y agreguemos las acciones correspondientes.
Event step.
//agrego la gravedad.
if place_free(x,y+1) then {gravity=0.5} else {gravity=0;}
//este codigo verifica si esta en el aire y suma gravedad o si esta sobre algo no cae.
if vspeed > 16 then {vspeed=16}
//limitar maxima velocidad de caida.
/*Como ves es un codigo normal que se usa en 2D*/
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Collision Contra el objPiso.
//detiene la caida si cae sobre el suelo.
move_contact_solid(direction, vspeed) vspeed=0;
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event teclado keyboard Left
if place_free(x-3,y) then {x-=3;}
//si presionas Left y hay espacio se mover hacia la izquierda.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event teclado keyboard right
if place_free(x+3,y) then {x+=3;}
//si presionas right y hay espacio se mover hacia la derecha.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event de teclado key press Space (barra de espacio)
if not place_free(x,y+1) then {vspeed-=12}
//si esta sobre el suelo y presionas la barra de espacio Salta.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event room start.

d3d_start(); //inicia el modo 3D


/*Como ves este es hasta ahora el nico cdigo 3D usado.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
.- Ahora el objPiso
Event Draw
d3d_draw_block(x,y,32,x+32,y+32,-32,texPiso,1,1)
//Este codigo simplemente dibujara un cubo en 3D el cual sera nuestro piso.

______________________________________________________________________________
______________________________________________________________________________
____________________________________________
.- Ahora el objCamara.
Event create
depth=100; //la profundidad de la camara siempre es 100.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
Event Draw
d3d_set_projection(objJugador.x,objJugador.y-6.9,200, objJugador.x, objJugador.y7,190,0,0,1)
draw_set_alpha(1) //transpariencia.
draw_set_color(c_white) //para iluminar todo.
______________________________________________________________________________
______________________________________________________________________________
____________________________________________
.- Ahora creamos un room ah colocamos tantos objPiso como queramos y claro uno del
objJugador y uno del objCamara.
Tutorial creado por Elvis Enrique Kelley
Para todas las comunidades makeras.

Das könnte Ihnen auch gefallen