Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Jeffrey Faper en Mayo 18, 2022, 03:48:56 AM

Título: como hacer tirolesas rieles lianas estilo konami? [Solucionado]
Publicado por: Jeffrey Faper en Mayo 18, 2022, 03:48:56 AM
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...

(https://i.gifer.com/77cm.gif)
Título: Re: como hacer tirolesas rieles lianas estilo konami?
Publicado 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
https://www.youtube.com/watch?v=cV3NMx6XFIQ
Título: Re: como hacer tirolesas rieles lianas estilo konami? [Solucionado]
Publicado por: Jeffrey Faper en Mayo 21, 2022, 06:31:45 PM
 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]
[gml]
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);
    }
}
[/gml]
[/spoiler]

scrGrounded:
[spoiler]
[gml]
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;
[/gml]
[/spoiler]

EVENTO STEP JUGADOR:
[spoiler]
[gml]
/*
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;
     }
}
[/gml]
[/spoiler]

(https://i.ibb.co/qBtKFKf/20220518-181353.gif)