Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

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!.

Autor Tema: Platformer "ENGINE" source code  (Leído 1458 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cristopher2545

en: Diciembre 21, 2017, 10:57:47 am
Autor original: Shaun spalding
Modificación por: CRISTOPHER2545
Versión de GM utilizada:  :GM8: :GMS:
Descripción: este script es una modificación al código de SHAUN SPALDING que agrega algunas mejoras técnicas a los controles conservando toda la funcionalidad del original.
Código:
"puedes usar este código en un script o en un objeto jugador."
"este código ah sido comprimido para mejor eficiencia y mas rendimiento"
Create event
Código: [Seleccionar]
//movimiento
hsp = 0;
vsp = 0;

//gravedad
grav = 0.5;
m=1
//salto y movimiento
jumpspeed = 11

//friccion maxima
groundAccel = 1 //puedes modificar esto para tener friccion en el piso
groundFric  =1 //puedes modificar esto para tener friccion en el piso
airAccel    = 0.4 //0.4 valores recomendados
airFric     = 0.1// valores recomendados
onGround=false
// velocidad maxima
maxH        = 5
maxV        = 0.1

jumps=0
jumpsmax=2
move_lock = false;
grounded = false;

Alarm 0 event
Código: [Seleccionar]
move_lock = false;
Step event
Código: [Seleccionar]
var tempAccel, tempFric;

//Get the player's input
key_right = keyboard_check(vk_right);
key_left = keyboard_check(vk_left);
key_down = keyboard_check(vk_down);
key_jump = keyboard_check_pressed(vk_space);
key_jump_held = keyboard_check(vk_space)
//React to inputs

if (onGround) {
    tempAccel = groundAccel;
    tempFric  = groundFric;
} else {
    tempAccel = airAccel;
    tempFric  = airFric;
}

if (vsp < 10) vsp += grav;

move_lock = false;
{
// Moving right
if (key_left) && (!key_right)
{
    if (hsp > 0)
        hsp = Approach(hsp, 0, tempFric);   
    hsp = Approach(hsp, -maxH, tempAccel);


if (key_right) && (!key_left)
{
     if (hsp < 0)
        hsp = Approach(hsp, 0, tempFric);   
    hsp = Approach(hsp, maxH, tempAccel);

}


if (!key_left) && (!key_right) && !onGround
    hsp = Approach(hsp, 0, tempFric);
else if (!key_left) && (!key_right)
{
hsp=0
}

//Horizontal Collision
if place_meeting(x+hsp,y,obj_wall)
{
    yplus = 0;
    //subir las cuestas
    while (place_meeting(x+hsp,y-yplus,obj_wall) && yplus <= abs(1*hsp)) yplus += 1;
    if place_meeting(x+hsp,y-yplus,obj_wall)
    {
        while (!place_meeting(x+sign(hsp),y,obj_wall)) x+=sign(hsp);
        hsp = 0;
    }
    else
    {
        y -= yplus
    }
}
x += hsp;
//bajar las cuestas
if !place_meeting(x,y,obj_wall) && vsp >= 0 && place_meeting(x,y+2+abs(hsp),obj_wall)
{while(!place_meeting(x,y+1,obj_wall)) {y += 1;}}

//Vertical Collision
if (place_meeting(x,y+vsp,obj_wall))
{
    while(!place_meeting(x,y+sign(vsp),obj_wall))
    {
        y += sign(vsp);
    }
    vsp= 0;
}
y += vsp;


if (!place_meeting(x,y+1,obj_wall))
{
onGround=false
}
else
{
onGround=true
airAccel    = 0.4
}

if (place_meeting(x,y+1,obj_wall))
{
    jumps = jumpsmax; 
}

if (key_jump) && (jumps > 0)
{
    jumps -= 1;
    vsp = -jumpspeed;
}




if (vsp < 0) && (!key_jump_held)
{
    vsp += grav;//+
}


//wall jump system
if key_jump and place_meeting(x + 1, y, obj_wall) and grounded=false
{
    vsp = -12;
    move_lock = true;
     hsp=-6
     jumps=1
     alarm[0]=5
   
}
else

if place_meeting(x + 1, y, obj_wall) && vsp>0
{
vsp=1
}


if key_jump and place_meeting(x - 1, y, obj_wall) and  grounded=false 
{
    vsp = - 12;
       move_lock = true;
       alarm[0]=5

   hsp=6
   jumps=1
}
else

if place_meeting(x- 1, y, obj_wall) && vsp>0
{
vsp=1
}


"debes de crear un script con el nombre "Approach" para que el código anterior funcione"
"este código sirve para detectar las colisiones con las paredes"
Código: [Seleccionar]

if (argument0 < argument1)
    return min(argument0 + argument2, argument1);
else
    return max(argument0 - argument2, argument1);


"el código funciona perfectamente ya trae el doble salto y el wall jump al igual que los "slopes" si deseas agregar mas cosas puedes ver los vídeos de shaun spalding ya que este código sigue siendo compatible con sus códigos aunque tambien puedes integrar códigos externos para mejorar este codigo"

se recomienda correr el juego a 60 FPS ya que el código esta adaptado para esa velocidad si deseas usar 30 FPS recomiendo cambiar todos los valores en el evento CREATE para que se adapten a la velocidad del juego.

para usar las colisiones es necesario crear un objeto llamado "obj_wall" este puede ser cambiado tomando en cuenta que se debe cambiar el nombre en todo el código, al tener este objeto todas las funciones operaran correctamente incluso el wall jump, la versión del wall jump es antigua y es la misma que utilizaba en mis juegos de prueba.

DATO CURIOSO: a todo esto me costo exactamente 3 semanas en re-crear y testear el código las partes mas difíciles de añadir fue la fricción aérea y en el piso al igual que el wall jump, el código es totalmente amigable y puedes DESACTIVAR todas las habilidades extras que el código ofrece.

cualquier problema con este código puedes mandarme un correo a cagamesco@gmail.com o en la mensajería de este foro y responderé a la brevedad, si encuentras algún bug favor de notificarlo para poder postear un parche en el código
« última modificación: Junio 23, 2018, 09:41:07 pm por cristopher2545 »

Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!
 
Los siguientes usuarios dieron las gracias a este tema: Mental.Gif, SpinJosue


No Tienes Permisos Para Dar Puntos
point 33 Puntos

Usuarios que puntuaron el tema » Clamud (6 Pts) » somnus (8 Pts) » zorge (7 Pts) » Goganpis (5 Pts) » rogerskate (7 Pts) 


Desconectado somnus

Respuesta #1 en: Junio 23, 2018, 04:47:21 pm
hay un error en este script, es el siguiente:


Código: [Seleccionar]
___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of  Step Event0
for object obj_n:

Variable obj_nem.object3(100024, -2147483648) not set before reading it.
[b] at gml_Object_obj_nem_Step_0 (line 136) -                      && !place_meeting(x - 1, y, object3) [/b]
############################################################################################
--------------------------------------------------------------------------------------------

estoy usando GMS2

Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala
 


Desconectado cristopher2545

Respuesta #2 en: Junio 23, 2018, 07:36:53 pm
Hola somnus! gracias por usar el codigo y gracias por comentar el error este error es porque hay objetos que no existen en tu juego, estos objetos pertenecen a los slopes y a la pared extra que tengo en mi codigo y sirven para evitar poder hacer el wall- jump en objetos mensionados puedes modificar los objetos en los cuales quieres que no se ejecute el wall jump y si no esta correccion deberia reparar el error solo es cuestio de quitar esta seccion de codigo y deberia funcionar

ORIGINAL
Código: [Seleccionar]
//wall jump system
if key_jump and place_meeting(x + 1, y, obj_wall) and grounded=false && !place_meeting(x + 1, y, object3) && !place_meeting(x + 1, y, object2) && !place_meeting(x + 1, y, object4)  //este es el problema
{
    vsp = -12;
    move_lock = true;
     hsp=-6
     jumps=1
     alarm[0]=5
   
}
else

if place_meeting(x + 1, y, obj_wall) && vsp>0
{
vsp=1
}


if key_jump and place_meeting(x - 1, y, obj_wall) and  grounded=false  && !place_meeting(x - 1, y, object3) && !place_meeting(x - 1, y, object2) && !place_meeting(x - 1, y, object2) //este es el problema
{
    vsp = - 12;
       move_lock = true;
       alarm[0]=5

   hsp=6
   jumps=1
}
else

if place_meeting(x- 1, y, obj_wall) && vsp>0
{
vsp=1
}




NUEVO
Código: [Seleccionar]
//wall jump system
if key_jump and place_meeting(x + 1, y, obj_wall) and grounded=false
{
    vsp = -12;
    move_lock = true;
     hsp=-6
     jumps=1
     alarm[0]=5
   
}
else

if place_meeting(x + 1, y, obj_wall) && vsp>0
{
vsp=1
}


if key_jump and place_meeting(x - 1, y, obj_wall) and  grounded=false
{
    vsp = - 12;
       move_lock = true;
       alarm[0]=5

   hsp=6
   jumps=1
}
else

if place_meeting(x- 1, y, obj_wall) && vsp>0
{
vsp=1
}




el codigo nuevo borra esos objetos que no son nesesarios para que funcione pero si quieres evitar que el personaje haga el wall-jump en ciertos objetos puedes agregar objetos en el IF de donde se borraron los que no existen y eso deberia funcionar! gracias por usar el codigo :D

Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!
 


Desconectado somnus

Respuesta #3 en: Junio 23, 2018, 08:19:07 pm
ah bueno la solucion es cambiar los object2 y object3 por obj_wall, con eso ya funciona todo el script, si lo puedes corregir nos ayudaria a que alguien mas tuviera ese problema.

Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala
 


Desconectado cristopher2545

Respuesta #4 en: Junio 23, 2018, 09:42:09 pm
Me alegra que te aya funcionado  :) y ya lo eh corregido para que nadie tenga mas el problema solo si quieren agregar exclusiones al codigo deben agregar el and y todos los objetos donde no quieren que pase el wall jump!

saludos!

Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!
 


Desconectado somnus

Respuesta #5 en: Agosto 03, 2018, 03:25:08 am
por cierto podrias comentar que hace cada parte del codigo, como para saber que quitar o poner para cuando quisieramos modificarlo. Te lo agradeceria mucho.  ;)


por otro lado hay un error en el EV STEP que hace que el personaje se atasque en las paredes, esto es porque para checar colisiones en plataformas primero se debe de checar las colisiones en el EJE Y y despues en el eje X, a continuacion expllco el porque.

por lo tanto para solucionar eso en el futuro, deberias de cambiar el bloque de codigo VERTICAL COLLISION antes del bloque de codigo HORIZONTAL COLLISION

en la imagen aparece la colision antes y despues,
ANTES, el bloque azul colisiona con 2 objetos wall, primero con la pared en el eje X
y por ultimo con el bloque de abajo en el eje Y, dice el script que si hay colision con Y+1, entonces ground es igual a true, por tanto el objeto va a creer que esta tocando el piso, entonces cuando se toca el piso la gravedad deja de funcionar y por eso se ve atascado el sprite,

AFTER, asi es como queda despues del step que reacomoda el sprite, sin embargo, como se tiene el boton IZQ o DER presionado, se vuelve a checar de nuevo en la zona X y despues en la zona Y, volviendo al mismo estado atascado del sprite.




« última modificación: Agosto 03, 2018, 04:50:37 am por somnus »

Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala