podria poner, el codigo con el que re.escala su juego y que resoluciones usa es muy extraño que pase eso por lo general si usted dibuja algo en el evento dibujo tenga por seguro que se debera dibujar en las cordenadas que usted asigne , independientemente del tamaño de la room la view y tamaño de la ventana es muy raro que las cosas se muevan de lugar otra cosa no estara dibujando por casualidad las cosas en draw_gui
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
32
Preguntas y respuestas / Re: Problema con la resolucion
Abril 09, 2022, 08:09:07 PMCita de: JohnW en Abril 09, 2022, 07:51:40 PM
¿De que manera se hace eso que dices?
Bueno es muy simple
1.Necesita un sprite de sus caracteres PAC-MAN FONT : https://www.spriters-resource.com/game_boy_advance/pacmancollect/sheet/10949/
puede usar la herramienta create from strip para no estar cortando y pegando caracter por caracter
Asi es como se ve el spr-Font-strip41.png de mi sprFont que mide 8x8 con todos los caracteres que voy usar:

2.Una vez tenga su spriteFont listo con todos los caracteres que necesita creamos nuestro mapa de caracteres en el objeto controlador de su juego seria algo asi
[gml]
//EVENTO CREATE
//primero creamos el mapa de caracteres,
//tiene que ser el mismo orden que tienen sus caracteres en su spriteFont
fontChar = " 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!.-©"; //FONT MAP 1
global.font= font_add_sprite_ext(sprFont,fontChar,0,0); //GLOBAL FONT SPRITE
draw_set_font(global.font);
//EVENTO DRAW
//Y AHORA YA PODEMOS DIBUJAR LO QUE QUERAMOS. AL SER UN SPRITE PUEDE SEGUIR LA POSICION DE OBJETOS
//Y EN TEORIA DEBRIA ESCALAR JUNTO CON NUESTRA VIEW O SURFACE
draw_text_transformed_colour(F92.x,F92.y-64,"FUCK YOU #SASEL",2,2,0,c_red,c_red,c_orange,c_yellow,1);
[/gml]
Resolucion minima de mi juego en modo ventana :

creo que seria todo, ya lo probe y al inicio me dio errores, no se por que pero solo dibujaba el ultimo caracter © que me habra
querido decir Game Maker Studio skynet a cobrado vida
33
Preguntas y respuestas / Re: Problema con la resolucion
Abril 09, 2022, 07:49:38 PM
una pregunta esta usando sprites como Fonts, ya probe en mi juego con diferentes resoluciones y el texto se escala perfectamente a la surface y el texto no cambia de lugar, creo que ese error pasa cuando no se usa un sprite como font en ese caso tendra que escalar manualmente todo
34
Preguntas y respuestas / Re: Diferencias entre Windows y Windows(YYC)?
Abril 09, 2022, 07:00:41 PM
oh tiene razon, en modo compilador note cambios de rendimiento favorables para la aplicacion
por ejemplo se eliminan los tirones y bajadas de rendimiento cuando la aplicacion pasa a segundo plano o se arrastra la ventana, sobre todo cuando esta corriendo en pantalla completa y se presiona la tecla de windows, si hace eso en modo interprete hasta el windows comienza a lagearse pero en modo compilador esto no pasa. otro error que pasaba en modo interprete es que la aplicacion desaparecia y no se mostraba en la barra de tareas asi que tenia que abrirlo desde el administrador de tareas ese error tambien se corrige compilando el juego.
entonces solo es recomendable compilar el juego a modo nativo cuando ya se tenga una version estable de su juego
gracias por su tiempo
por ejemplo se eliminan los tirones y bajadas de rendimiento cuando la aplicacion pasa a segundo plano o se arrastra la ventana, sobre todo cuando esta corriendo en pantalla completa y se presiona la tecla de windows, si hace eso en modo interprete hasta el windows comienza a lagearse pero en modo compilador esto no pasa. otro error que pasaba en modo interprete es que la aplicacion desaparecia y no se mostraba en la barra de tareas asi que tenia que abrirlo desde el administrador de tareas ese error tambien se corrige compilando el juego.
entonces solo es recomendable compilar el juego a modo nativo cuando ya se tenga una version estable de su juego
gracias por su tiempo
35
Preguntas y respuestas / Diferencias entre Windows y Windows(YYC)?
Abril 08, 2022, 06:59:55 AM
cuales son las diferencias entre crear una aplicacion con Windows y Windows(YYC)
36
Preguntas y respuestas / Re: Slopes o rampas, ayuda con 1 linea
Abril 08, 2022, 06:47:36 AM
hacer rampas con while complica mucho las cosas al menos a mi parecer, aqui le dejo un ejemplo de como hacer rampas simples con bucles for es muy simple y es mas facil añadir por ejemplo oneway slopes o ceil slopes, ahora si lo que busca es hacer rampas y loops como los de sonic esto no le servira.
la logica es muy simple si el jugador collisiona contra el lado de un solido verificara si hay pixeles libres para moverse, si hay espacio libre el jugador comenzara a subir la rampa, en cambio si no esta collisionando contra el lado de algun solido y hay espacio libre debajo del jugador, entonces el jugador descendera
[gml]
repeat(abs(hspd)){
//comprobamos si estamos chocando contra un bloque solido
var block = place_meeting(x+sign(hspd),y,parSolid);
//Subir rampa solida
if(block){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y-i,parSolid)){
y -= i;
break;
}
}
}else{
//Descender rampa solida
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y+i,parSolid)){
if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
y += i;
break;
}
}
}
}
}
[/gml]
la logica es muy simple si el jugador collisiona contra el lado de un solido verificara si hay pixeles libres para moverse, si hay espacio libre el jugador comenzara a subir la rampa, en cambio si no esta collisionando contra el lado de algun solido y hay espacio libre debajo del jugador, entonces el jugador descendera
[gml]
repeat(abs(hspd)){
//comprobamos si estamos chocando contra un bloque solido
var block = place_meeting(x+sign(hspd),y,parSolid);
//Subir rampa solida
if(block){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y-i,parSolid)){
y -= i;
break;
}
}
}else{
//Descender rampa solida
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y+i,parSolid)){
if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
y += i;
break;
}
}
}
}
}
[/gml]
37
Preguntas y respuestas / Re: Problemas con la view al seguir un objeto.
Abril 01, 2022, 06:44:24 PM
puede usar un objeto como camara aqui le dejo este ejemplo esta sacado de un tutorial de pixelatedPope
tutorial:
[spoiler]
https://youtu.be/_g1LQ6aIJFk
[/spoiler]
codigo:
[gml]
//objCamera
//Evento Create
viewWidth=320; //ancho de su view
viewHeight=256; //largo de su view
windowScale=3; //escalado de su ventana
window_set_size(viewWidth*windowScale,viewHeight*windowScale); //re-escalar ventana
surface_resize(application_surface,viewWidth*windowScale,viewHeight*windowScale); //re-escalar surface de la aplicacion a tamaño de su ventana
//Evento End Step
view_wport[0]=viewWidth*windowScale;
view_hport[0]=viewHeight*windowScale;
if(instance_exists(objPlayer)){
//clampear view al jugador y limites de la room
var xvf=clamp(objPlayer.x-viewWidth/2,0,room_width-viewWidth);
var yvf=clamp(objPlayer.y-viewHeight/2,0,room_height-viewHeight);
//velocidad de la view
var sv=0.1;
//actualizar posicion de nuestra camara
view_xview[0]=lerp(view_xview[0],xvf,sv);
view_yview[0]=lerp(view_yview[0],yvf,sv);
}
[/gml]
tutorial:
[spoiler]
https://youtu.be/_g1LQ6aIJFk
[/spoiler]
codigo:
[gml]
//objCamera
//Evento Create
viewWidth=320; //ancho de su view
viewHeight=256; //largo de su view
windowScale=3; //escalado de su ventana
window_set_size(viewWidth*windowScale,viewHeight*windowScale); //re-escalar ventana
surface_resize(application_surface,viewWidth*windowScale,viewHeight*windowScale); //re-escalar surface de la aplicacion a tamaño de su ventana
//Evento End Step
view_wport[0]=viewWidth*windowScale;
view_hport[0]=viewHeight*windowScale;
if(instance_exists(objPlayer)){
//clampear view al jugador y limites de la room
var xvf=clamp(objPlayer.x-viewWidth/2,0,room_width-viewWidth);
var yvf=clamp(objPlayer.y-viewHeight/2,0,room_height-viewHeight);
//velocidad de la view
var sv=0.1;
//actualizar posicion de nuestra camara
view_xview[0]=lerp(view_xview[0],xvf,sv);
view_yview[0]=lerp(view_yview[0],yvf,sv);
}
[/gml]
38
Preguntas y respuestas / recomiendan el uso de game_restart?
Marzo 26, 2022, 05:07:49 PM
Estaba probando un nivel de mi juego de navecitas y todo marchaba bien hasta que me dio hambre y mejor decidi prepararme el desayuno, asi que deje el juego corriendo en el PC y cuando regrese me di cuenta que el juego habia crasheado por falta de memoria
estas son mis preguntas:
la funcion game_restart no elimina la data de nuestro juego?
si no lo hace entonces para que sirve esta funcion?
si al final hay que hacerlo nosotros mismos en que casos recomiendan el uso de esta funcion?
estas son mis preguntas:
la funcion game_restart no elimina la data de nuestro juego?
si no lo hace entonces para que sirve esta funcion?
si al final hay que hacerlo nosotros mismos en que casos recomiendan el uso de esta funcion?
39
Preguntas y respuestas / Re: como conseguir mejores animaciones?
Marzo 21, 2022, 07:38:40 AM
tiene razon siempre me olvido de los array resulta mas sencillo hacer animaciones asi, tambien encontre un tutorial donde crean animaciones usando python y un archivo de texto pero me quedo con las array aunque no se si es mejor usar un arreglo 2d aqui les dejo el ejemplo
[gml]
///scrEnemyMove
var animArr;
var animLength;
//IMAGE_INDEX DURACION DEL FRAME
animArr[0]=0; animLength[0]=10;
animArr[1]=2; animLength[1]=30;
animArr[2]=3; animLength[2]=60;
animArr[3]=1; animLength[3]=10;
animArr[4]=3; animLength[4]=15;
var getFrame=animArr[index];
var getLength=animLength[index];
frameTimer++;
image_index = getFrame;
sprite_index = sprEnemyMove;
if(frameTimer>=getLength){
frameTimer = 0;
index++;
}
if(index>array_length_1d(animArr)-1){
index = 0;
}
[/gml]
[gml]
///scrEnemyMove
var animArr;
var animLength;
//IMAGE_INDEX DURACION DEL FRAME
animArr[0]=0; animLength[0]=10;
animArr[1]=2; animLength[1]=30;
animArr[2]=3; animLength[2]=60;
animArr[3]=1; animLength[3]=10;
animArr[4]=3; animLength[4]=15;
var getFrame=animArr[index];
var getLength=animLength[index];
frameTimer++;
image_index = getFrame;
sprite_index = sprEnemyMove;
if(frameTimer>=getLength){
frameTimer = 0;
index++;
}
if(index>array_length_1d(animArr)-1){
index = 0;
}
[/gml]
40
Preguntas y respuestas / Re: Las colisiones no funcionan
Marzo 21, 2022, 01:13:46 AM
else if sirve para hacer comprobaciones extras es como un ( or , || ) pero le permitira ejecutar aciones expecificas dependienodo del resultado de las comprobaciones y else sirve para finalizar la ejecucion del codigo osea si no se cumple ninguna condicion anterior entonces se ejecutara else.
como en su codigo solo quiere saber si su personaje se encuentra en el aire o en el suelo no es necesario usar else if
[gml]
if (place_free(x,y+1)) { //el jugador no esta en el suelo
Gravity=0.3
}else{Gravity=0;} //si esta en el suelo se ejecuta el else
[/gml]
como en su codigo solo quiere saber si su personaje se encuentra en el aire o en el suelo no es necesario usar else if
[gml]
if (place_free(x,y+1)) { //el jugador no esta en el suelo
Gravity=0.3
}else{Gravity=0;} //si esta en el suelo se ejecuta el else
[/gml]
41
Preguntas y respuestas / invertir la gravedad como en el Ori
Marzo 11, 2022, 03:25:25 AM
No se si esto va aqui pero bueno. Andaba por youtube viendo tutoriales para distraerme pero al mirar la seccion de comentarios algo me hizo sentir muy triste y eso fue que los chavos de hoy quieren todo en la mano asi que aqui esta, como hacer slopes invertidos como en el ori o invertir la gravedad, en realidad es muy simple solo hay que invertir los + y los - de nuestro codigo base de colision contra blockes y agregar una boleana y he aqui como debe lucir nuestro script de colisiones
recuerda cambiar el image_yscale de tu personaje
[gml]
//evento create creamos la variable grvzero
grvzero = 1; // -1 = gravedad invertida ... 1 = gravedad normal;
//EVENTO STEP aplicar gravedad al jugador usando el scrApproach + la nueva variable grvzero
if(!onGround){
vspd = scrApproach(vspd, vspdMax, grvspd/grvzero);
}
///scrApproach(a,b,amount)
/******************************************
/ Increments a value by a given shift but**
/ never beyond the end value **
******************************************/
if(argument0<argument1){
return min(argument0+argument2,argument1);
}else{
return max(argument0-argument2,argument1);
}
///scrMotion();
/*******************************************************
/* HORIZONTAL COLLISION CHECK **
/******************************************************/
repeat(abs(hspd)){
//GRAVEDAD NORMAL
if(grvzero==1){
var block = place_meeting(x+sign(hspd),y,parSolid);
//SOLID SLOPE UPWARD
if(block){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y-i,parSolid)){
y -= i;
break;
}
}
}else{//SOLID SLOPE UPWARD
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y+i,parSolid)){
if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
y += i;
break;
}
}
}
}
}
//GRAVEDAD INVERTIDA
if(grvzero==-1){
var block = place_meeting(x+sign(hspd),y,parSolid);
//SOLID SLOPE UPWARD
if(block){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y+i,parSolid)){
y += i;
break;
}
}
}else{//SOLID SLOPE UPWARD
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y-i,parSolid)){
if(place_meeting(x+sign(hspd),y-i-1,parSolid)){
y -= i;
break;
}
}
}
}
}
//ONEWAY SLOPE CONDITIONS
if(!place_meeting(x,y+1,parSolid) && !place_meeting(x,y+1,overOneway))
||(!place_meeting(x,y+1,overOneway) && place_meeting(x,y+1,parSolid) && keyUp)
||(!place_meeting(x,y+1,parSolid) && place_meeting(x,y+1,overOneway) && keyUp){
var oneway = place_meeting(x+sign(hspd),y,parOneway);
//ONEWAY SLOPE UPWARD
if(oneway){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y-i,parOneway)){
y -= i;
break;
}
}
}else{//ONEWAY SLOPE DOWNWARD
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y+i,parOneway)){
if(place_meeting(x+sign(hspd),y+i+1,parOneway)){
y += i;
break;
}
}
}
}
}
//LIMIT PLAYER TO CAMERA BORDERS
if(x+sign(hspd)<=view_xview+16) || (x+sign(hspd)>=view_xview+view_wview-16){
hspd = 0;
}
//LEFT-RIGHT SOLID COLISION CHECK
if(!place_meeting(x+sign(hspd),y,parSolid)){
x += sign(hspd);
}else{
hspd = 0;
break;
}
}
/*******************************************************
/* VERTICAL COLLISION CHECK **
/******************************************************/
repeat(abs(vspd)){
if(place_meeting(x,y+sign(vspd),parSolid)){
vspd = 0;
break;
}
if(vspd>0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+sign(vspd),parOneway)){
vspd = 0;
break;
}
if(vspd>0 && !place_meeting(x,y,overOneway)&& place_meeting(x,y+sign(vspd),overOneway)){
vspd = 0;
break;
}else{
y += sign(vspd);
}
}
[/gml]
recuerda cambiar el image_yscale de tu personaje
[gml]
//evento create creamos la variable grvzero
grvzero = 1; // -1 = gravedad invertida ... 1 = gravedad normal;
//EVENTO STEP aplicar gravedad al jugador usando el scrApproach + la nueva variable grvzero
if(!onGround){
vspd = scrApproach(vspd, vspdMax, grvspd/grvzero);
}
///scrApproach(a,b,amount)
/******************************************
/ Increments a value by a given shift but**
/ never beyond the end value **
******************************************/
if(argument0<argument1){
return min(argument0+argument2,argument1);
}else{
return max(argument0-argument2,argument1);
}
///scrMotion();
/*******************************************************
/* HORIZONTAL COLLISION CHECK **
/******************************************************/
repeat(abs(hspd)){
//GRAVEDAD NORMAL
if(grvzero==1){
var block = place_meeting(x+sign(hspd),y,parSolid);
//SOLID SLOPE UPWARD
if(block){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y-i,parSolid)){
y -= i;
break;
}
}
}else{//SOLID SLOPE UPWARD
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y+i,parSolid)){
if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
y += i;
break;
}
}
}
}
}
//GRAVEDAD INVERTIDA
if(grvzero==-1){
var block = place_meeting(x+sign(hspd),y,parSolid);
//SOLID SLOPE UPWARD
if(block){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y+i,parSolid)){
y += i;
break;
}
}
}else{//SOLID SLOPE UPWARD
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y-i,parSolid)){
if(place_meeting(x+sign(hspd),y-i-1,parSolid)){
y -= i;
break;
}
}
}
}
}
//ONEWAY SLOPE CONDITIONS
if(!place_meeting(x,y+1,parSolid) && !place_meeting(x,y+1,overOneway))
||(!place_meeting(x,y+1,overOneway) && place_meeting(x,y+1,parSolid) && keyUp)
||(!place_meeting(x,y+1,parSolid) && place_meeting(x,y+1,overOneway) && keyUp){
var oneway = place_meeting(x+sign(hspd),y,parOneway);
//ONEWAY SLOPE UPWARD
if(oneway){
for(var i=1; i<=maxslp; i++;){
if(!place_meeting(x+sign(hspd),y-i,parOneway)){
y -= i;
break;
}
}
}else{//ONEWAY SLOPE DOWNWARD
for(var i=maxslp; i>=1; i--;){
if(!place_meeting(x+sign(hspd),y+i,parOneway)){
if(place_meeting(x+sign(hspd),y+i+1,parOneway)){
y += i;
break;
}
}
}
}
}
//LIMIT PLAYER TO CAMERA BORDERS
if(x+sign(hspd)<=view_xview+16) || (x+sign(hspd)>=view_xview+view_wview-16){
hspd = 0;
}
//LEFT-RIGHT SOLID COLISION CHECK
if(!place_meeting(x+sign(hspd),y,parSolid)){
x += sign(hspd);
}else{
hspd = 0;
break;
}
}
/*******************************************************
/* VERTICAL COLLISION CHECK **
/******************************************************/
repeat(abs(vspd)){
if(place_meeting(x,y+sign(vspd),parSolid)){
vspd = 0;
break;
}
if(vspd>0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+sign(vspd),parOneway)){
vspd = 0;
break;
}
if(vspd>0 && !place_meeting(x,y,overOneway)&& place_meeting(x,y+sign(vspd),overOneway)){
vspd = 0;
break;
}else{
y += sign(vspd);
}
}
[/gml]

42
Preguntas y respuestas / Re: hacer el sprite blanco
Marzo 09, 2022, 05:46:53 AM
No encontre el manual de Game Maker pero sin shaders creo que era algo asi
EVENTO DRAW:
[gml]
//usando funciones 3d NO SHADER
d3d_set_fog(true,c_white,0,0);
//AQUI DIBUJA SU SPRITE
d3d_set_fog(true,c_white,0,0);
//usando un shader
shader_set(shader0);
//AQUI DIBUJA SU SPRITE
shader_reset();
//CREA UN SHADER Y PEGA ESTO EN LA PESTAÑA FRAGMENT
//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 c = texture2D(gm_BaseTexture, v_vTexcoord);
gl_FragColor = vec4(1.0,1.0,1.0,c.a);
}
[/gml]
EVENTO DRAW:
[gml]
//usando funciones 3d NO SHADER
d3d_set_fog(true,c_white,0,0);
//AQUI DIBUJA SU SPRITE
d3d_set_fog(true,c_white,0,0);
//usando un shader
shader_set(shader0);
//AQUI DIBUJA SU SPRITE
shader_reset();
//CREA UN SHADER Y PEGA ESTO EN LA PESTAÑA FRAGMENT
//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main()
{
vec4 c = texture2D(gm_BaseTexture, v_vTexcoord);
gl_FragColor = vec4(1.0,1.0,1.0,c.a);
}
[/gml]
43
Juegos en desarrollo / Re: prinDX
Marzo 06, 2022, 10:03:57 PM
es que esta demo no esta testeada, en cuanto al problema de que no puede atacar es por que cuando programe al personaje lo hice pensando en las mecanicas de dark souls esquivar o atacar entonces hay estados en los que el jugador no puede realizar ataques ademas que solo puede atacar una vez, esto lo cambiare dependiendo de que tipo de enemigos vaya agregando
44
Juegos en desarrollo / Re: prinDX
Marzo 06, 2022, 01:13:31 AMCita de: Marth en Marzo 06, 2022, 12:54:20 AM
El concepto tiene bastante potencial.
Agradecería un humilde manual de instrucciones (y capturas de pantalla aquí), pero este juego se ve bien trabajado. Me recuerda a Megaman X, pero con una espada en vez de un brazo-cañon.
lo siento olvide poner los controles.
el personaje se mueve con las flechas
salta con la tecla W y ataca con la tecla E
flecha hacia abajo + ataque mientras esta en el aire hace una puñalada reobta si golpea contra enemigos o solidos
el personaje tambien puede disparar pero prefiero pulir primero todo lo que tenga que ver con ataques melees antes de continuar, por cierto si encuentra algun parecido a megaman tal vez sea por que estoy usando sprites de Demons Crest un juego de Capcom
45
Juegos en desarrollo / prinDX
Marzo 06, 2022, 12:02:45 AM
prinDX
![]() Plataformas | ![]() GM: Studio |


DEVLOG + Tutorial Primer Personaje Accion y Plataformas:
[spoiler]
devlog1:
[spoiler]

[/spoiler]
devlog2:
[spoiler]
proyecto base descarga : https://drive.google.com/file/d/1CyKkdFar03yUjLD7PDUlUwJhD2IjOzec/view?usp=sharing

[/spoiler]
devlog3:
[spoiler]
prinSprites: https://www.spriters-resource.com/fullview/22864/

[/spoiler]
devlog4:
[spoiler]

prinScripts : https://drive.google.com/file/d/1Xi0Nuni3DyEiW7E0NJA36re6L74EHLLK/view?usp=sharing
[/spoiler]
[/spoiler]
no he actualizado el ejecutable del juego lo mas probable es que lo haga cuando termine el primer mapa y su respectivo jefe de nivel.
todo esto esta en modo prueba asi que si quiere dar alguna recomendacion o encuentra algun error no dude en comentar

![]() https://drive.google.com/file/d/1VkbsiePA8y7D9epCt2mzCPqksLHGScTB/view?usp=sharing ![]() ![]() ![]() ![]() ![]() |