Hola, buenas. Tengo un problema que no consigo solucionar. Quiero que mi personaje pueda sacar 4 unidades de piedra cuando "pique" una roca y que despues esta se destruya. No estoy muy seguro de como hacerlo, consigo que pueda extraer 4 unidades de una roca pero después se destruyen todas las instancias de roca y no solo la que esta picando.
Lo he puesto en un evento colisión de mi protagonista hacia el objeto roca.
if distance_to_object(ob_piedra) < 4 and mouse_check_button_pressed(mb_left)
and position_meeting(mouse_x,mouse_y,ob_piedra) {
if scr_obtener_slot_libre() != -1 and global.primera_piedra == true {
global.inventario[scr_obtener_slot_libre()] = "Piedra"
global.primera_piedra = false;
}
global.cantidad_piedra++
global.vida_piedra--
}
if global.vida_piedra <= 0 {with other instance_destroy()}
if global.cantidad_piedra == 0 {
global.primera_piedra = true;
}
Me imagino que es una tontería de primero de programación. Un saludo!
Ahora lo he intentado en el evento Create del prota i con instance nearest y tampoco
piedra_cercana = instance_nearest(x,y,ob_piedra)
if distance_to_object(ob_piedra) < 4 and mouse_check_button_pressed(mb_left)
and position_meeting(mouse_x,mouse_y,ob_piedra) {
if scr_obtener_slot_libre() != -1 and global.primera_piedra == true {
global.inventario[scr_obtener_slot_libre()] = "Piedra"
global.primera_piedra = false;
}
global.cantidad_piedra++
global.vida_piedra--
}
if global.vida_piedra <= 0 {
if piedra_cercana != noone{
instance_destroy(piedra_cercana)}
}
if global.cantidad_piedra == 0 {
global.primera_piedra = true;
}
El principal problema es que estas usando una variable global para controlar la vida de las rocas global.vida_piedra, y esta afecta a todas las instancias de ese objeto.
Lo que debes hacer es crear la variable local vida=4
Si vas a poner el codigo en el evento de colision, hay codigo que esta sobrando:
[gml]
if mouse_check_button_pressed(mb_left) ///si cuando se colisiona con la roca se presiona el raton
{
with(other) ///hace referencia a la roca con la que esta colisionando
{
vida-=1 ///resta 1 a la variable vida de la roca
global.cantidad_piedra+=1 ///agrega 1 a la variable global piedra
if vida<=0 {instance_destroy()} ///si la vida de la roca llega a 0 se destruye
}
}
[/gml]
Hola, buenas tardes. Pues llevo un buen lio, me falta mucha base y me atasco con los problemas mas pequeños. Mi intención es que el personaje pueda picar roca al estar cerca de una de ellas. No me acaba de convencer que tenga que picarla exactamente con la colisión, me hace cosas raras (como que tengo que estar pulsando en dirección a la roca para que cuando pulse el mouse se sume una "piedra", me imagino que tiene que ver con la simpleza de la colisión en el evento o algo así, pero no estoy seguro), por eso había pensado en distance_to_object a unos 4 pixeles, ya no tendría que estar tan pegado a la roca y seria mas fácil. Lo que me pasa ahora es que haciendo algunos retoques en el código y colocandolo en la colisión con la roca pues funciona, puedo recoger 4 de piedra de una roca y después se destruye. El problema ahora es que una vez se destruye la primera roca cambia el comportamiento y vuelve a destruir cada roca solo con tocarla y deja de sumar piedra al contador (se destruye la instancia solo con colisionar). Supongo que el problema esta en que se deja de cumplir alguna condición o se empieza a cumplir otra o no se, pero no veo que hago mal. Realmente se que estoy haciendo un estropicio en cuanto al código, en cuanto aprenda un poco mas borraré el proyecto y empezaré uno nuevo heheh.
en el evento Colisión de mi protagonista hacia el ob_piedra
if mouse_check_button_pressed(mb_left)
and position_meeting(mouse_x,mouse_y,ob_piedra) {
if scr_obtener_slot_libre() != -1 and global.primera_piedra == true {
global.inventario[scr_obtener_slot_libre()] = "Piedra"
global.primera_piedra = false;
}
global.cantidad_piedra++
ob_piedra.vida_piedra--
}
if ob_piedra.vida_piedra <= 0 {with other instance_destroy()}
if global.cantidad_piedra == 0 {
global.primera_piedra = true;
}
Al final puse la variable vida_piedra en el mismo ob.piedra, no se porque era la única manera de que me funcionara
Por cierto, como haces para que el codigo que me pones se vea así con un fondo negro, coments en verde, etc? Queda y se entiende mejor que así como lo pongo yo
Tienes que poner el codigo de esta forma:
(https://i.imgur.com/21ne5Ov.png)
Cita de: 3dgeminis en Mayo 14, 2019, 04:42:47 PM
Tienes que poner el codigo de esta forma:
(https://i.imgur.com/21ne5Ov.png)
Que quieres decir, que si pongo ++ no es lo mismo que +=1?
Disculpa por eso, es que uso GM8 y en en el no se puede poner ++ o --, o muchas otras mas cosas que en GMS y GMS2 si se pueden.
"Realmente se que estoy haciendo un estropicio en cuanto al código, en cuanto aprenda un poco mas borraré el proyecto y empezaré uno nuevo heheh."
Esa es una buena idea, vas a ver que te hara mas facil y rapido escribir codigo. Intenta varias soluciones a un problema, puedes llegar a reducir bastante el codigo que escribes.
No te preocupes, na mas faltaría! ;D