Diciembre 11, 2018, 11:48:27 PM Ultima modificación: Diciembre 12, 2018, 08:53:44 PM por kostra
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

[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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



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 ^^
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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.



#4 Diciembre 12, 2018, 01:16:25 AM Ultima modificación: Diciembre 12, 2018, 01:18:10 AM por BssString
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

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-]
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Mmmm y si en vez de darle prioridad reinicias el tiro?


ev_colision_up_boost
if (place_meeting(x,y,down_boost)){
          tiro=0;
}



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
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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]
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

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"
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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

#11 Diciembre 12, 2018, 08:00:52 PM Ultima modificación: Diciembre 12, 2018, 08:04:35 PM por kostra
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
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

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.

#13 Diciembre 12, 2018, 08:45:49 PM Ultima modificación: Diciembre 12, 2018, 08:55:17 PM por kostra
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]
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]