Hola vengo con una pregunta um poco importante
Estoy elaborando un Pacman, al comer un punto este se destruye y me suma 10 al puntaje, el problema viene que al morir con un fantasma la room se reinicia y los puntos vuelven a aparecer
Como se nota en el pacman original, los puntos quedan siempre comidos, y es un poco molesto porque vuelven a aparecer y el puntaje antes de morir sigue ahi
Asi que como haria para que la instancia que comi se quede destruida al reiniciar la room
Hola T789
En lugar de reiniciar la room, podrías teletransportar el Pacman y los Fantasmas a su posición original usando:
x = xstart
y = ystart
Sólo deberás reiniciar los estados, variables o sprites que les hayas modificado para que de la sensación de que la room se ha reiniciado.
Saludos
Parece buena sugerencia pero el problema es que tendria que volver a reiniciar los sonidos y los estados de los demas objetos y por como los tengo seria un infierno hacer todo ese progreso
Vamos nada es imposible en GM y tampoco quiero nada que ver con el room_persistemt
edit: disculpa XD flashé que decias los puntos de score.
No, en realidad, si tenes que usar room_persistent para que no vuelvan a aparecer las pastillas, los puntos.
O hacer lo que dice el amigo. Reiniciar las posiciones x e y de los enemigos y de pacman.
De ahí creo que no hay otra forma. O sería una rebuscada, como : escribir el estado actual de las instancias del nivel en un archivo, reiniciar el nivel y cargar, el estado de las instancias desde donde se dejó. Lo cual, de normal, escribir y leer desde un archivo en disco es mas costoso en tiempo que hacer las opciones anteriores.
Disculpa si estoy pidiendo mucho pero mostrarias un ejemplo de como harias para hacer todo eso
por el momento estoy algo frustrado como para volver a tocar el codigo
Lo de guardar en un archivo? hmm ahora no tengo tiempo pero, ya te digo, es trabajoso, y a lo mejor es como programar demasiado para algo sencillo.
Se puede hacer de varias maneras, segun se me ocurre a mi:
1) Una sería usar una matriz [x, y] o una tabla de doble entrada para guardar las coordenadas de cada pastilla.
2) abrir el archivo txt
3) escribir la lista de valores dentro de la matriz
3) cerrar el archivo
Eso para guardar las pastillas que todavia quedan en la room.
Luego para cargarlas el proceso inverso.
1)limpiar la room de todas las pastillas
2)mover al personaje y los enemigos a sus posiciones
3)abrir el archivo
4)obtener cada valor dentro de la matriz y crear la instancia en esa posicion
que aclaremos que si la matriz se llamara pastillas, entonces:
pastillas[0,0] //coordenada x de la primera pastilla
pastillas[0,1] //coordenada x de la primera pastilla
pastillas[1,0] //coordenada x de la segunda pastilla
pastillas[2,1] //coordenada x de la segunda pastilla
etc
5)cerrar el archivo
eso masomenos seria el trabajo que habría que realizar.
bueno ya tengo una idea mas o menos de lo que debo hacer, vere cuanto me tardo en mejorar lo que ya tengo
Tambien puedes usar una ds_map para ello
[gml]//Comprueba que puntos se han comido.
global.points = ds_map_create()[/gml]
Pon esto en el create event del punto:
[gml]//Si este punto se ha comido en una vida anterior, destruyelo.
if (ds_map_find_value(global.points, id) == 1)
instance_destroy();[/gml]
Cuando lo colecciones pon:
[gml]//Añade este punto al ds_map
ds_map_add(global.points, id, 1);[/gml]
Y para reiniciarlo, pon:
[gml]//Reinicia el ds_map
ds_map_clear(global.points);[/gml]
Cita de: T789 en Diciembre 18, 2019, 05:47:56 PM
Parece buena sugerencia pero el problema es que tendria que volver a reiniciar los sonidos y los estados de los demas objetos y por como los tengo seria un infierno hacer todo ese progreso
Vamos nada es imposible en GM y tampoco quiero nada que ver con el room_persistemt
Si quieres evitar usar el room persistent y ahorrarte lo de crear un archivo txt externo, puedes intentar re-ejecutar el create event de algunos objetos clave usando:
with obj_player event_perform(ev_create,0)
with obj_enemy event_perform(ev_create,0)
etc
Eso haría al objeto "obj_player" y al objeto "obj_enemy" volver a ejecutar su "create event" aunque no hayan sido realmente creados de nuevo.
Incluso Game Maker permite crear eventos personalizados para tus objetos.
Puedes crear un evento "Other" (esos del diamante verde) llamado "User Defined" y elijes uno de los 12 eventos disponibles.
En ese evento puedes colocar el código que inicia el status de cada objeto y llamarlo con la función:
event_perform(ev_other,ev_user0)
En ese evento puedes colocar el código que resetearía el estado de cada objeto a su estado inicial y además colocar el x=xstart/y=ystart
Así puedes efectuar un "falso reset" de la room.
Saludos