Mayo 18, 2022, 03:48:56 AM Ultima modificación: Mayo 21, 2022, 06:21:53 PM por Jeffrey Faper
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...




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

#2 Mayo 21, 2022, 06:31:45 PM Ultima modificación: Mayo 21, 2022, 06:34:52 PM por Jeffrey Faper
 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]