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)
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 ^^
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.
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-]
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
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]
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"
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á.
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
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.
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]