Hola a todos. Soy nuevo en la comunidad y bastante novato en lo que a Game Maker se refiere. Antes de nada, aclarar que este post es básicamente una petición de ayuda ante un problema que, a estas alturas, ya me está empezando a volver loco (llevo tres días, y he probado con todo). Gracias de antemano a todos los que se tomen la molestia de leerlo, y doblemente a los que contesten.
Actualmente me encuentro realizando el proyecto de fin de grado de Ingeniería Informática, que estoy realizando con Game Maker Studio (v1.3). La idea del proyecto es un juego de estrategia por turnos, al más puro estilo "advance wars". Esto es, mueves tus "fichas" (tanques, soldados, camiones...) en tu turno, y luego el oponente mueve las suyas. La parte más "académica", que voy a intentar vender, es la IA.
Para el terreno, he usado un sistema de objetos y tiles: En cada "cuadrado" de terreno hay un objeto con las características de ese terreno, que ocupa lo mismo que el tile que representa aunque es independiente de este. Para las unidades, objetos que generan un "menú" (otro objeto) cada vez que se pincha encima de ellas, y cuyas opciones dan lugar a varios eventos. Los movimientos de las fichas se manejan mediante colisiones entre los objetos de unidades y objetos de terreno.
Hace unas semanas tuve que hacer un alto en el proyecto por razones personales. Por aquel entonces, funcionaba perfectamente. Recientemente, sin embargo, ha empezado a fallar vilmente. Desde que lo volví a abrir, ha empezado a hacer cosas raras cuando lo inicio. Me carga los objetos (usando la ventana de "selected instance" del debugger, al seleccionar en donde
deberían estar, efectivamente se muestra que ahí está el objeto), pero lo único que veo es una ventana de color verdoso oscuro (que entiendo es el background por defecto). Al alternar entre las distintas vistas (tengo dos, una para recorrer todo el mapa y otra para mostrar lo que vendría a ser el "minimapa"), el color se hace más claro, pero sigue sin verse nada.
Esto es lo que se debería ver:
(http://fc01.deviantart.net/fs70/f/2014/187/5/5/teria_wars_1_by_kyrawaylaird-d7pglvk.jpg)
Esto es lo que se ve:
(http://fc06.deviantart.net/fs70/f/2014/187/1/3/teria_wars_2_by_kyrawaylaird-d7pgmjg.jpg)
Y al alternar a la vista "minimapa" (que no es otra cosa que escalar el mapa para que se vea entero en la ventana):
(http://fc05.deviantart.net/fs71/f/2014/187/e/0/teria_wars_3_by_kyrawaylaird-d7pgmjl.jpg)
Algo que debería ser mencionado es el hecho de que la room, inicialmente, está vacía. En el juego tengo tres rooms distintas, a saber:
- Load_Stage_Room: En esta room se inicializan todas las variables globales, y se lee uno de los archivos que contienen los diferentes niveles del juego. Por ahora no se toca nada del aspecto del juego. Es una room invisible, básicamente, que he creado para modularizar esta carga y, en un futuro, dar al usuario la posibilidad de elegir entre los distintos niveles del juego. Funciona correctamente, ya que carga los datos debidamente (comprobado con el debugger). Una vez carga todo, define las dimensiones de la siguiente room y pasa a esta.
- Play_Stage_Room: La room principal, en donde se desarrolla el juego. Sus dimensiones se definen en la anterior room, y nada más cargarse genera un código mediante el cual crea todas las instancias necesarias, según los datos que leyó la room anterior. Por último, define las distintas vistas. Como entiendo que el problema probablemente se encuentra aquí, resumo el creation code abajo.
- Save_Stage_Room: Room "fantasma" que he creado para generar los archivos que luego usa la primera room para cargar los datos. Defino gráficamente el nivel (es decir, coloco los objetos y tiles habitualmente) y luego, al ejecutarla, traduce todos esos datos a un archivo que se guarda en el lugar adecuado. En principio esta room nunca se utiliza en el juego, solo la uso yo cuando quiero crear un nuevo nivel.
El código de la Play_Stage_Room es más o menos lo que sigue. No lo copio tal cual para facilitar la lectura, pero no tengo ningún problema en hacer copy/paste literal si alguno cree que es mejor:
//INICIALIZAMOS LA MATRIZ PRINCIPAL
global.matrizChequeado1[0,0] = false;
global.matrizChequeado2[0,0] = false;
(Aquí vendría un bucle para inicializar las matrices del juego, que uso luego como soporte para la IA y algunos eventos)
(Bucle for que recorre todos los tiles que se deben cargar):
{
instance = instance_create(global.loadedTilesX[i], global.loadedTilesY[i], Terreno_OBJ);
instance.type = global.loadedTilesType[i];
switch (instance.type)
{
(Dependiendo del tipo de terreno se le dan unos valores de cobertura predefinidos, que son variables internas de la instance)
}
global.matrizIds[global.loadedTilesX[i]/32,global.loadedTilesY[i]/32] = instance.id;
tile_add(tileset,global.loadedTilesLeft[i],global.loadedTilesTop[i],global.loadedTilesWidth[i],
global.loadedTilesHeight[i],global.loadedTilesX[i],global.loadedTilesY[i],100);
}
for (i = 0; i < array_length_1d(global.loadedUnidadesX); i++)
{
Crear_Unidad(global.loadedUnidadesType[i], global.loadedUnidadesX[i],
global.loadedUnidadesY[i], global.loadedUnidadesBando[i]);
(Esta última línea de código es un script que crea un tipo u otra de unidad según el tipo de esta)
}
//VISTAS
view_xview[0] = 0;
view_yview[0] = 0;
view_wview[0] = room_width;
view_hview[0] = room_height;
if (room_width > 640)
{
view_wview[0] = 640;
}
if (room_height > 640)
{
view_hview[0] = 640;
}
view_xport[0] = 0;
view_yport[0] = 0;
view_wport[0] = view_wview[0];
view_hport[0] = view_hview[0];
view_visible[0] = true;
instance_create(0,0,View0Controller);
view_enabled = true;
window_set_size(view_wport[0],view_hport[0]);
window_set_position(0,0);
view_xview[1] = 0;
view_yview[1] = 0;
view_wview[1] = room_width;
view_hview[1] = room_height;
view_xport[1] = view_xport[0];
view_yport[1] = view_yport[0];
view_wport[1] = view_wport[0];
view_hport[1] = view_hport[0];
view_visible[1] = false;
instance_create(0,0,View1Controller);
Las unidades son objetos que heredan de un objeto "Unidad_OBJ", el cual no tiene Sprite. Cada unidad va con su sprite definido, y tiene la opción "visible" marcada y las otras desmarcadas (no son sólidas, ni persistentes, ni usan físicas). Los terrenos son todos del mismo tipo, invisibles, y ocupan el mismo espacio que los tiles a los que representan (los cuales, por otro lado, tampoco se muestran).
Estoy empezando a pensar que el problema está en el propio Game Maker, y que lo más inteligente sería desinstalarlo y volverlo a instalar. Si a alguno se le ocurren posibles soluciones a este problema, me hacéis un hijo de madera. No tengo ningún problema en subir más partes de código o capturas si alguno cree que servirían para deducir cuál es el problema.
Gracias de nuevo.
En la segunda imagen el color verde que llena la pantalla pertence a algun sprite, tile o background, o esta en algun evento DRAW de algun objeto ??? Se me ocurre que podrias empezar buscando por ahi.
Talves es algun problema de depth de algun background o capa de tiles que los lleva al frente de la pantalla y no deja ver lo demas. Trata de crear un ejecutable del juego y probarlo, pero si dices que de repente empezo a hacer eso y no cambiaste nada seria mejor reinstalar el GMS
3dgeminis: He estado chequeando tanto el código de los objetos como las líneas en las que se añaden los tiles. Las unidades están todas a depth 5, los tiles, a depth 100. En las funciones de dibujo lo único que se modifica, en todo caso, es el "image_bend" de la unidad para colorearla de verde o rojo según el bando. Tengo un background por defecto, colocado desde la propia interfaz del :GMS:, pero entiendo que ese siempre se ve en el fondo porque no tengo ninguna opción para establecer su profundidad.
Es que no sé por donde pillarlo. Si todavía no lo he reinstalado es porque me da un poco de cosica toquetear, más siendo un programa de pago. Siempre tengo el miedo injustificado de que se vaya a rallar y no me vaya a aceptar la clave por segunda vez o presente algún comportamiento extraño. En fin.
Gracias por la respuesta.
Has intentado hacer una prueba simple aparte poniendo solo tiles y algun background, views, etc. para ver si se repite el mismo problema ???
Talves algun problema de los drivers de la tarjeta grafica, algun cambio que se les halla hecho; la verdad no se me ocurre nada mas. De ultima armate de valor y reinstala el GMS (probaste lo de crear un ejecutable del juego y correrlo ???)
Yo intentaría desactivar TODOS los eventos DRAW de TODOS los objetos, y de ahí ir activando uno por uno, empezando por los menos "sospechosos" y dejando para el ultimo los más sospechosos, o al revés, los más sospechosos primero .
3dgeminis: Sí, hice varias pruebas varias, desactivando la creación de objetos, de tiles, eliminando el background que tenía por defecto... Nada, siempre el mismo resultado. Bueno, alguna vez el color era ligeramente diferente, pero igualmente inexplicable. También cree el ejecutable, pero el resultado es el mismo. De la tarjeta gráfica, que yo sepa, no he tocado nada recientemente. Y, tras revisarlo, parece que todo está en orden por ahí.
penumbra: He probado a hacer como tú dices, pero lo único que he conseguido es obligarme a mí mismo a revisar el código de arriba a abajo para acordarme de todas las partes que tenía comentadas y volverlas a meter en la partida (gracias a la mala planificación por mi parte, todo sea dicho). A estas alturas ya estoy bastante seguro de que el problema está con el propio GM, ya sea porque le he removido los intestinos y he chafado algún archivo de configuración o algo similar, o simplemente porque tiene algún bug.
Sea como sea, me va a tocar armarme de valor, y recurrir a la solución más antigua de la informática: darle al botón de reinicio. A ver si reinstalándolo me sonríe la fortuna.
Gracias a los dos.
Hola amigo sabes a mi me paso algo parecido en Android en el que el fondo se veia plomo y no aparecian los sprite (pero si aparecían algunas figuras que dibuje con draw) y llegue a la conclusión de que es un bug lo que hice para solucionarlo es crear un nuevo proyecto y exportar todo del proyecto anterior (lo cual por suerte no era mucho ya que tenia un único objeto que controlaba todo el juego) lo que hice fue hacer click derecho en el objeto y "abrirlo en el explorador" hay hay un archivo .obj si no me equivoco pero la cosa es que tiene el nombre de tu objeto, la idea es que en el nuevo proyecto das click derecho en la carpeta de objetos (en la aplicación hay donde están ordenados todos los resource) bueno la cosa es que tienes que dar en "Importar objeto existente" haci pues exportas el archivo .obj que te dije (o era .object o algo haci pues te daras cuenta solo) la cosa es que vallas exportando todo tu proyecto tal cual al proyecto nuevo asegurándote de no tener ningún código que modifique el tamaño de la ventana o que la afecte en algún sentido, intenta probar el proyecto nuevamente me dises que tal te va