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