Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: kostra en Diciembre 11, 2018, 11:48:27 PM

Título: [Solucionado] Me quedo entre medio de dos boosts :v
Publicado por: kostra en Diciembre 11, 2018, 11:48:27 PM
Buenas, tengo un creo que big problem, y es que tengo objetos de boosts (propulsores), uso un objeto para cada dirección, ni lo comenten :v

el caso es que mientras testeaba mi juego compartiendo pantalla con darki, me quedé en medio de dos boosts, uno hacia arriba y otro hacia abajo, y claro... uno me subia vspeed y el otro me bajaba el mismo vspeed, entonces, la bola (player) se quedaba quieta pero digamos que no del todo (visualmente totalmente quieta).. pues porque no me dejaba hacer otra tirada...

El juego es un minigolf, lanzo y cuando se frena, me deja lanzar de nuevo, sino frena, no me lanza... este es el código de la bola para el lanzamiento...

create:
[gml]tiro = 0;
dir = 0;
spd = 0;
xlast = xstart;
ylast = ystart;
puedetirar = true;[/gml]

step:
[gml]///apuntar

if puedetirar {
    if mouse_check_button(mb_left) {
        dir = point_direction(mouse_x,mouse_y,x,y);
        spd = point_distance(x,y,mouse_x,mouse_y)/8;
        if tiro == 0 {
            tiro = 1;
            }
        }
    }

///tirar

if mouse_check_button_released(mb_left)
&& tiro == 1 {
    sound_play(sndisparo);
    vida--;
    tiro = 2;
    direction = dir;
    if spd > 30
        spd = 30;
    speed = spd;
    }

///frenar y morir con 0 de vida

if speed > 0
    speed -= 0.2;
else {
    speed = 0;
    xlast = x;
    ylast = y;
    if tiro == 2 {
        tiro = 0;
        if vida <= 0
        && fin == 0 {
            sound_play(snfail);
            room_restart();
            show_debug_message("moriste weiii");
            }
        }
    }[/gml]

Y en los boosts... todos igual solo cambia la dicección -/+ h/v, de ejemplo pongo el UP...

colisión con bola:
[gml]///impulsar

if other.speed < 30
    other.vspeed -= 0.5;
else
    other.speed = 30;[/gml]

Espero alguien pueda ayudarme con alguna solución... que no sea cambiándolo TODO para "no usar h/vspeed o cosas de esas que hagan mi código chino xDD

Gracias de antecodo :B

(https://gyazo.com/00c0eab14bc1bac75d3431341a7b6f73.png)
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: Black_Cat en Diciembre 12, 2018, 12:37:21 AM
Se me ocurre que puede estara pasando porque la pelota toca ambos objetos a la vez. En ese caso en el mismo momento que suma,resta. Entonces no se mueve.
La unica solución me parece que es darle prioridad a alguno de los dos. ???
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: kostra en Diciembre 12, 2018, 12:40:00 AM
Ya sé lo que ocurre, lo dije en el post xdd, y como podría hacer eso que dices?
PD iba a dormir justo, mañana leo graxie ^^
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: Black_Cat en Diciembre 12, 2018, 12:48:49 AM
Mmm dejame ver si me acuerdo algo:

ev_colision_con_upBoost
[gml]
if (place_meeting(x,y,down_boost)){
          y++;
}
[/gml]
Si no me equivoco, si está tocando el up_boost y a la vez el down_boost, le damos prioridad al de down_boost y lo movemos hacia abajo.
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: BssString en Diciembre 12, 2018, 01:16:25 AM
Hola kostra

Se me ocurre que guardes en el objeto bola, el ID del boost que está activando actualmente.
Create Event:
boost = noone //El ID del boost que estoy activando

En el objeto boost, en su evento de colisión con la bola
if other.boost = noone || other.boost = id {
if other.speed < 30
    { other.vspeed -= 0.5; other.boost = id }
else
    { other.speed = 30; other.boost = id }
}

Eso hará que la bola guarde el ID del boost que toca y ya no podrá activar ningún otro, sólo ese. Si toca dos al mismo tiempo, sólo activará el boost que se creó primero en la room (según el orden de creación de instances en las propiedades de la room).
Ahora, para desactivar la condición, tienes que hacer que al dejar de tocar el boost que lo está impulsando, se resetee la variable para que pueda activar otro boost.

En el Step de la bola:
if boost != noone {
if !place_meeting(x,y,boost) { boost = noone } //aquí revisa si ya no está colisionando con el ID guardado en la variable "boost" y reiniciará la variable
}


A la variable le puse de nombre "boost" pero tu le puedes poner el que quieras.

Saludos
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: kostra en Diciembre 12, 2018, 03:01:44 PM
hola, blackcat, tu solución parece muy buena, pero lo que necesito es que cuando esté entre los dos boosts, se quede quieto y sí pueda volver a tirar, ya que hay niveles donde necesitas justamente quedarte entre medio y evitar que te mueva para arriba o abajo (haré lo mismo con izq,der), y si pongo tu código, será imposible pasar ese nivel ya que se irá siempre para abajo y eso = a FAIL. Es por eso que puse todo el código de cómo funcionan los tiros de la bola.

BssString con tú codigo, que también es buenísimo, incluso diria que mejor, ya que pone prioridad al primero que tocas y no al que el programador (yo) decida... me pasaría lo mismo, los niveles donde tienes que pasar entre medio quedarían inservibles y me tocaría rehacerlos T_T me interesa poder pasar entre medio y se quede quieto...

Como extra, antes de que me lo suguiera alguien, he intentado recortar un poco la máscara de colisión de los boosts, dejar el borde libre... pero gracias a mi mala suerte, a la primera de hacer eso, me encontré con un bug que provoca eso mismo, y es que cuando hay un bosst hacia abajo por ejemplo, debajo de este hay un boost izquierda, y a su derecha (del boost abajo) hay pared, pasa que el de la izquierda me empuja a la izquierda, el de abajo no llego a tocarlo y se me queda en la pared trabado para siempre xDD

ejemplo algo más visual, en tiles xD
[pared][down]
[-left-][-left-]
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: Black_Cat en Diciembre 12, 2018, 03:27:32 PM
Mmmm y si en vez de darle prioridad reinicias el tiro?


ev_colision_up_boost
if (place_meeting(x,y,down_boost)){
          tiro=0;
}
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: kostra en Diciembre 12, 2018, 03:50:10 PM
eso lo que haría es que mientras estás siendo conducido por un caminito de boosts, puedas tirar... mientras te mueves, el caso es poder tirar cuando frenas, no mientras te mueves :S
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: Johann en Diciembre 12, 2018, 04:13:30 PM
Y si simplemente verificas que la velocidad sea cero, si un boost tira hacia arriba y el otro hacia abajo con la misma magnitud la velocidad es cero, por todo lo que dices, es esa la condición con la que debes dar al jugador la opción de lanzar, también debería funcionar al colisionar con la pared, lo importante es demostrar que el objeto esta quieto.

[gml]
if speed==0 && vida>0 { //para que no tire un zombie XD
    puedetirar = true;
    tiro = 0;
}
[/gml]
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: kostra en Diciembre 12, 2018, 04:48:22 PM
la variable "puedetirar" está relacionada con otros objetos, y no tienen nada que ver, olvida esa var, está controlada...

la verificación para evitar tiradas zombie se evita mutiendo xdd

y la verificación del speed es justo ocmo lo tengo puesto, véase step "///frenar y morir con 0 de vida"
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: Seirlord_Games en Diciembre 12, 2018, 07:57:47 PM
No he podido leer el post, lo he mirado por encima. No se si pides también que si la bola se queda entre dos boost, pierda. Para eso podrias aprovechar las variables lastx y lasty. Y en el step o una alarma pones:

if (lastx == x && lasty == y) {
    //ESTÁ QUIETA
}


Por otro lado, podrias poner que si la bola detecta que está colisionando con dos boosts, Y ADEMAS, lo juntas que solo pase si la bola está quita. Desactivar uno de los boosts.

No se si te servirá.
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: kostra en Diciembre 12, 2018, 08:00:52 PM
las variables xlats ylast se me colaron en el post, eso sirve para el agua, que te devuelve a la anterior posición, no como los pinchos por ejemplo que te reinician el nivel :V

A ver, si se queda quieto, poder tirar si quedan vidas, sino, pues pierdes (reiniciar nivel) xD igual gracias :B

EDITO: He debuggeado el xlast por si acaso igual me iba a servir... pero cuando se queda quieto entre los dos boosts no cambia como cuando se queda quieto en tierra firme

PD: no entendí lo último que dijiste
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: 3dgeminis en Diciembre 12, 2018, 08:37:24 PM
La solucion para mi es hacer los 3 casos por separado. Quitar el codigo en los boosters y hacer lo siguiente en STEP de la pelota
[gml]
if place_meeting(x,y,booster_arriba) and place_meeting(x,y,booster_abajo) {vspeed=0}
else if place_meeting(x,y,booster_arriba) {vspeed-=0.2}
else if place_meeting(x,y,booster_abajo) {vspeed+=0.2}
[/gml]
asi te aseguras que si esta tocando ambos boosts la pelota no se mueva verticalmente.
Título: Re:Me quedo entre medio de dos boosts :v
Publicado por: kostra en Diciembre 12, 2018, 08:45:49 PM
por el momento, es la mejor solución que veo!... pero aun hay un inconveniente (que si no se resuelve, me quedaré con esta), pero plis... esta tiene el pequeño detalle de que cuando el player no tira exactamente recto, podría estar pasando por esos dos boost con una inclinación de 1 o 2 grados, por ende, realmente no va RECTO, pero sin embargo sigue tocando ambos a la vez, por lo que pasaría sin problemas aun estar haciéndolo mal... no sé si me explico... espero que me puedan ayudar, pero si no se consigue no pasa nada, lo daría por solucionado, solo que el juego será más fácil, pero igual dejo el tema abierto por si a alguien se le ocurre.

Disculpen las molestias, soy un "POCO" perfecionista xDD

EDITO: SOLUCIONADO!!! eso que dije de 1 solo grado de inclinación NO OCURRE!!, va PERRRRFECTO justo como yo quería!!! muchísimas gracias a 3dGeminis y TOD@S!!!!!!!!


codigo final en step de la bola
[gml]///boosts control

if place_meeting(x,y,oboostU)
and place_meeting(x,y,oboostD)
    exit;
if place_meeting(x,y,oboostL)
and place_meeting(x,y,oboostR)
    exit;

if place_meeting(x,y,oboostU) {
    if speed < 30
        vspeed -= 0.5;
    else
        speed = 30;
    }
if place_meeting(x,y,oboostD) {
    if speed < 30
        vspeed += 0.5;
    else
        speed = 30;
    }
if place_meeting(x,y,oboostL) {
    if speed < 30
        hspeed -= 0.5;
    else
        speed = 30;
    }
if place_meeting(x,y,oboostR) {
    if speed < 30
        hspeed += 0.5;
    else
        speed = 30;
    }[/gml]