Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Mensajes recientes

1
Preguntas y respuestas / Re: Problemas intentando cambiar la ruta del fichero.
« Último mensaje por Marth en Mayo 23, 2022, 05:40:57 pm »
Vale, esta es la forma. En castellano se llama desactivar el entorno aislado.
2
Preguntas y respuestas / Re: Problemas intentando cambiar la ruta del fichero.
« Último mensaje por Jeffrey Faper en Mayo 23, 2022, 04:33:37 am »
Creo que no es posible hacer eso ya que Game Maker se ejecuta en un entorno seguro, segun el manual dice que se  puede desactivar
el modo sandbox pero quien sabe
https://manual.yoyogames.com/Additional_Information/The_File_System.htm
3
Preguntas y respuestas / Problemas intentando cambiar la ruta del fichero [Solucionado]
« Último mensaje por Marth en Mayo 22, 2022, 09:58:20 pm »
Cuando guardas o cargas un fichero, los archivos van de forma predeterminada a la carpeta C:\Users\Pcx\AppData\Local\nombre del proyecto.
Estoy interesado en poder modificar la ruta donde se guarda/carga el fichero (ej: La carpeta Documentos o Dibujos) y para ello he creado este proyecto.
Pero veo que si doy la ruta exacta algo falla y no se guarda el fichero, como se puede comprobar en mi proyecto adjunto.
¿Cómo se guardaría/buscaría un fichero que no está en la ruta predeterminada?
4
 El error fue que estaba comprobando mal la colision en el scrMotion
lo estaba haciendo asi: (vspd>=0 && !place_meeting(x,y,zipline)  &&  place_meeting(x,y+sign(vspd),zipline)
cuando la forma correcta era esta: (vspd>=0 && !place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline)
He limpiado un poco el codigo aqui le dejo los scripts corregidos o el projecto.

contra3 ejemplo.gmx: https://drive.google.com/file/d/1WXXyTdO_M8gpTig6J6d9JsXom7KkZa7X/view?usp=sharing

scrMotion:
Spoiler
repeat(ceil(abs(hspd))){
    if(onGround){
        /*************************
       //SOLID_SLOPES_COLLISION//
       /************************/
        var cBlock=place_meeting(x+sign(hspd),y,parSolid);
        if(cBlock){
            //SOLID SLOPE UPWARD
            for(var i=0; i<5; i++;){
                if(!place_meeting(x+sign(hspd),y-i,parSolid)){              
                    y-=i;
                    break;
                }
            }
        }else{
            //SOLID SLOPE DOWNWARD
            for(var i=5; i>0; i--;){
                if(!place_meeting(x+sign(hspd),y+i,parSolid)){
                    if(place_meeting(x+sign(hspd),y+i+1,parSolid)){
                        y+=i;
                        break;
                    }
                }
            }
        }
        /*************************/
        //ONEWAY_SLOPES_COLLISION//
        /*************************/
        var cOneway=place_meeting(x+sign(hspd),y,parOneway) && !place_meeting(x,y+1,parSolid);
        if(place_meeting(x,y+1,otherBlock) && keyUp) || (!place_meeting(x,y+1,otherBlock)){
            if(cOneway){
                //ONEWAY SLOPE UPWARD
                for(var i=0; i<5; i++;){
                    if(!place_meeting(x+sign(hspd),y-i,parOneway)){              
                        y-=i;
                        break;
                    }
                }
            }else{
                //ONEWAY SLOPE DOWNWARD
                for(var i=5; i>0; i--;){
                    if(!place_meeting(x+sign(hspd),y+i,parOneway)){
                        if(place_meeting(x+sign(hspd),y+i+1,parOneway)){
                            y+=i;
                            break;
                        }
                    }
                }
            }
        }
    }
    /********************************/
    //CEILING_SOLID_SLOPES_COLLISION//
    /********************************/
    if(onCeils){
        var cCeils=place_meeting(x+sign(hspd),y,parSolid);
        if(cCeils){
            //CEILING SLOPE UPWARD
            for(var i=0; i<5; i++;){
                if(!place_meeting(x+sign(hspd),y+i,parSolid)){
                    y+=i;
                    break;
                }
            }
        }else{
            //CEILING SLOPE DOWNWARD
            for(var i=5; i>0; i--;){
                if(!place_meeting(x+sign(hspd),y-i,parSolid)){
                    if(place_meeting(x+sign(hspd),y-i-1,parSolid)){
                        y-=i;
                        break;
                    }
                }
            }
        }
    }
    /**************************/
    //ZIPLINE_SLOPES_COLLISION//
    /**************************/
    if(onZipline){
        var cZipline=place_meeting(x+sign(hspd),y,zipline) && !place_meeting(x,y+1,parOneway);
        if(cZipline){
            //ZIPLINE SLOPE UPWARD
            for(var i=0; i<5; i++;){
                if(!place_meeting(x+sign(hspd),y+i,zipline)){
                    y+=i;
                    break;
                }
            }
        }else{
            //ZIPLINE SLOPE DOWNWARD
            for(var i=5; i>0; i--;){
                if(!place_meeting(x+sign(hspd),y-i,zipline)){
                    if(place_meeting(x+sign(hspd),y-i-1,zipline)){
                        y-=i;
                        break;
                    }
                }
            }
        }
    }
    /************************/
    //SIDES_SOLID_COLLISIONS//
    /************************/
    if(!place_meeting(x+sign(hspd),y,parSolid)){
        x+=sign(hspd)
    }else{
        hspd=0;
        break;
    }
}

repeat(ceil(abs(vspd))){
    if(place_meeting(x,y+sign(vspd),parSolid))
    ||(place_meeting(x,y+sign(vspd),otherBlock))
    ||(vspd>=0 && !place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline))
    ||(vspd>=0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+sign(vspd),parOneway)){
        vspd=0;
        break;
    }else{
        y+=sign(vspd);
    }
}

scrGrounded:
Spoiler
var cGround=(place_meeting(x,y+1,parSolid)
|| place_meeting(x,y-1,parSolid)
|| place_meeting(x,y+1,otherBlock)
|| place_meeting(x-1,y,wallBlock) && onWall
|| place_meeting(x+1,y,wallBlock) && onWall
|| !place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline)
|| vspd>=0 && !place_meeting(x,y,parOneway) && place_meeting(x,y+1,parOneway));
return cGround;

EVENTO STEP JUGADOR:
Spoiler
/*
ACTIVAR_ZIPLINE....COMO DIJO SOMNUS COMPROBAMOS SI ESTAMOS EN UN RIEL O ZIPLINE CON UNA BOLEANA YO LA LLAME onZipline
TAMBIEN NOS AYUDARA PARA CONTROLAR LAS ANIMACIONES  DEL PERSONAJE
*/
if(!place_meeting(x,y,zipline) && place_meeting(x,y-1,zipline) && !onZipline){
    onZipline=1;
    }
//COLGADO_EN_UN_ZIPLINE
if(onZipline){
     if(onWall || onCeils || !place_meeting(x,y-1,zipline) || place_meeting(x,y,zipline)){
        onZipline=false;
     }
}

5
Desarrollo de Scripts / option_konami(obj)
« Último mensaje por dixon en Mayo 21, 2022, 02:16:09 pm »
Autor del script: Reyes Dávila
Nombre del script: option_konami(obj);
Breve descripción de su función: mueve uno o X objetos como se mueven los option del video juego “Gradius/ Life force/salamander”.
Versiones usadas: Game maker 4 y game maker html5; teóricamente funciona en casi todas las versiones.
Versión del script: 3 ,  (24-05-2022).

Html5: Aquí podrán ver la versión 3 en funcionamiento, Click en la imagen:


Código: [Seleccionar]




///option_konami(obj);

//Estableciendo distancia de separación
distancia_asd=argument0.sprite_height/2;
for(i=0;i<=instance_number(object_index);i+=1)
{
   id_asd=instance_find(object_index,i);
   if(id_asd=id){distancia_asd=distancia_asd*(i+1)}
}

//Siguiendo a la nave
c1_asd=(point_distance(x,y,argument0.x,argument0.y)>distancia_asd);
while(c1_asd)
{
   direction=point_direction(x,y,argument0.x,argument0.y);
   x+=0.5*cos(direction*pi/180);
   y-=0.5*sin(direction*pi/180);
   c1_asd=(point_distance(x,y,argument0.x,argument0.y)>distancia_asd);
}

//Contrayendo al llegar a los bordes de la pantalla.
if((argument0.y=argument0.yprevious) and (argument0.x=argument0.xprevious))
{
   c1_asd=0;
   c2_asd=0;
   c3_asd=0;
   c4_asd=0;
   if(argument0.y<argument0.sprite_height){c1_asd=keyboard_check(vk_up)}
   if(argument0.y>room_height-argument0.sprite_height){c2_asd=keyboard_check(vk_down)}
   if(argument0.x<argument0.sprite_width){c3_asd=keyboard_check(vk_left)}
   if(argument0.x>room_width-argument0.sprite_width){c4_asd=keyboard_check(vk_right)}
   if(c1_asd or c2_asd or c3_asd or c4_asd)
   {
      if(x>argument0.x+5){x-=5}
      if(y>argument0.y+5){y-=5}
      if(x<argument0.x-5){x+=5}
      if(y<argument0.y-5){y+=5}
   }
}

//Invirtiendo movimiento.
if(argument0.y<argument0.yprevious){y+=abs(argument0.y-argument0.yprevious)}
if(argument0.y>argument0.yprevious){y-=abs(argument0.y-argument0.yprevious)}
if(argument0.x<argument0.xprevious){x+=abs(argument0.x-argument0.xprevious)}
if(argument0.x>argument0.xprevious){x-=abs(argument0.x-argument0.xprevious)}
































Modo de uso
1. Crea un script el cual deberás llamar opcition_konami(obj).
2. Copia el código que te estoy ofreciendo y pégalo en el script.
3. Crea tu objeto option y en su evento step coloca:
Código: [Seleccionar]
option_konami(obj);
4. Deberás reemplazar obj por el objeto que va a seguir el option, es decir en obj se debe colocar el objeto de la nave.

Ejemplo:
Supongamos que mi objeto nave se llama object_gradius y mi objeto opción se llama object_option, entonces en mi object_option debo colocar:
Código: [Seleccionar]
option_konami(object_gradius);

 
Más información
1. El movimiento resultante es bastante genial, pero si lo observamos con detalle notaremos que no es exacto. Se puede alcanzar la exactitud de movimiento más adelante en otra versión.
2. Si la nave se mueve a la velocidad de la luz, los OPTION tambien.
3. Las variables del código no van a chocar con las variables del juego.
4. Para crear más options solo hay que crear más instancias y cada una tomará su posición.
5. Los nombres propuestos para el script son:
option_gradius_movement(obj);
follow_gradius(obj);
move_to_salamander(obj);
option_lifeForce(obj);

Pero como todos son de konami le coloqué: option_konami(obj).


Mejoras realizadas:
1. Distancia de separación: La separación entre la nave y las option es más parecida a las de gradius.
2. Contracción de options: Cuando la nave llega al borde de la pantalla las options se contraen cono en el juego original, pero obliga al programador a usar las teclas direccionales del teclado.
3. Inversión de movimiento: Originalmente en el juego las options siguen el movimiento de la nave, para lograr esto se puede recurrir al sistema de arrays recomendado por Jeffrey Faper, pero como quiero crea un único script fácil de implementar tuve que imitar ese movimiento invirtiendo la dirección de movimiento de las options con respecto a la dirección de la nave y el resultado quedó bueno.


Anécdota
El código lo he creado para mi amigo somnus al cual conozco desde hace años cuando la CGM estaba comenzando. Mi saludos siempre y mi estima para todos.

En mi infancia me dediqué a jugar un juego llamado LifeForce para la nes y lo pasé hasta el final varias veces (es increíble pero algo difícil, bueno, muy difícil):





Quizás me motive a jugar salamander 2 para la playstation el cual nunca he jugado:



Gradius no me simpatizaba mucho porque era más difícil y menos colorido. Claro ahora Gradius en sus nuevas versiones tiene gráficos increíbles.




Bueno, eso es todo por ahora, nos vemos en otro post, saludos a mi amigo somnus, quizás me motive a programar alguna nave para luchar junto a él contra alienígenas malignos robóticos en el espacio sideral, él representaría a gradius y yo a lifeForce.




Edito:


Creo que los principios de este script pueden ser usados para lograr:

La cuerda floja de new mario.



Los huevos de Yoshi



Aquí podrán jugar life force:
https://oldgameshelf.com/life-force-580.html?lang=es


6
Preguntas y respuestas / ¿como implementar anuncios en un juego para móvil?
« Último mensaje por nadie en Mayo 18, 2022, 10:27:20 pm »
quiero hacer un juego para móvil con anuncios pero no consigo tuctoriales, que me recomiendan
7
Preguntas y respuestas / Re: como hacer tirolesas rieles lianas estilo konami?
« Último mensaje por somnus en Mayo 18, 2022, 05:42:55 pm »

puedes checar colision cono mascara de colision del objeto que te vas a colgar y tu sprite, primero hazlo estatico, si estas dentro de la colision y presionas arriba o flecha arriba entonces activas una variable
colgar= true; donde el sprite cambie a estar colgado y obviamente no te vas a poder mover hacia derecha o izq ( tendras que limitar el movimiento ).

ya que te funcione le puedes agregar el movimiento y ya aqui le vas a aplicar la misma logica a una plataforma que se mueve, es decir, el personaje se debera mover a la misma velocidad que se mueve el objeto de donde estas colgado.

eso fue lo que implemente ya en un prototipo que hice hace tiempo para colgarme, puedes verlo en el segundo 0:32
8
Preguntas y respuestas / Re: como hacer que el objeto te siga?
« Último mensaje por somnus en Mayo 18, 2022, 05:34:16 pm »
Seria algo como esto se puede hacer con arrays o ds_list no se cual sea la mejor opcion algunos dicen que ds_list es mas rapido no lo se, me gustaria saberlo...
EVENTOS GRAN LIDER OSEA SU NAVE U OBJ_JUGADOR:
//CREATE EVENT
//ARRAY POSICIONES DE NUESTRO OBJETO LIDER
trailIndex=39; //RANGO MAXIMO DE NUESTRO ARRAY
for(var i=trailIndex-1; i>=0;  i--){
    trailx[i]=x;
    traily[i]=y;
}


interesante, voy a checar mas al respecto, algo asi es lo que busco, muchas gracias.
//EVENTO STEP GRAN LIDER
//almacenar las posiciones de nuestro objeto al array
if(x!=xprevious || y!=yprevious){
    for(var i=trailIndex-1; i>0; i--){
        trailx[i]=trailx[i-1];
        traily[i]=traily[i-1];
        }
    trailx[0]=x;
    traily[0]=y;
    }

EVENTO END STEP DE NUESTRO NPC OPTIONS O COMPAÑERO :
//CREO QUE VA EN UN END STEP EVENT
//ACTUALIZAMOS LA POSICION DE NUESTRA OPTION NPC O COMPAÑERO
x=objGRAN_LIDER.trailx[10];
y=objGRAN_LIDER.traily[10];

Este metodo funciona bien para velocidades estaticas como es el caso del juego Gradius donde solo puedes cambiar de velocidad al coger un poder y upgraderarla para juegos donde el jugador puede cambiar entre diferentes velocidades a su antojo, el npc option o compañero termina alejandose demasiado de el,  jamas pude solucionarlo asi que si alguien tiene alguna solucion favor de compartir le agradeceria mucho
9
Pues como dice el titulo alguien sabe como puedo hacer ese tipo de acciones usadas muy frecuentemente en juegos de konami.
ya tengo rampas de techo con objetos solidos y funcionan bien,  pero la verdad  no se como implementarlo con objetos a los cuales puedo atravesar desde cualquier lado les dejo  un ejemplo para que se de una mejor idea sobre lo que estoy hablando...


10
Preguntas y respuestas / Re: como hacer que el objeto te siga?
« Último mensaje por Jeffrey Faper en Mayo 17, 2022, 10:30:05 pm »
Seria algo como esto se puede hacer con arrays o ds_list no se cual sea la mejor opcion algunos dicen que ds_list es mas rapido no lo se, me gustaria saberlo...
EVENTOS GRAN LIDER OSEA SU NAVE U OBJ_JUGADOR:
//CREATE EVENT
//ARRAY POSICIONES DE NUESTRO OBJETO LIDER
trailIndex=39; //RANGO MAXIMO DE NUESTRO ARRAY
for(var i=trailIndex-1; i>=0;  i--){
    trailx[i]=x;
    traily[i]=y;
}
//EVENTO STEP GRAN LIDER
//almacenar las posiciones de nuestro objeto al array
if(x!=xprevious || y!=yprevious){
    for(var i=trailIndex-1; i>0; i--){
        trailx[i]=trailx[i-1];
        traily[i]=traily[i-1];
        }
    trailx[0]=x;
    traily[0]=y;
    }

EVENTO END STEP DE NUESTRO NPC OPTIONS O COMPAÑERO :
//CREO QUE VA EN UN END STEP EVENT
//ACTUALIZAMOS LA POSICION DE NUESTRA OPTION NPC O COMPAÑERO
x=objGRAN_LIDER.trailx[10];
y=objGRAN_LIDER.traily[10];

Este metodo funciona bien para velocidades estaticas como es el caso del juego Gradius donde solo puedes cambiar de velocidad al coger un poder y upgraderarla para juegos donde el jugador puede cambiar entre diferentes velocidades a su antojo, el npc option o compañero termina alejandose demasiado de el,  jamas pude solucionarlo asi que si alguien tiene alguna solucion favor de compartir le agradeceria mucho