19/12/24 - Imágenes y cambios en el código
Estado del juego
¡Hola! Esta semana el reporte semanal llega un poco más tarde. En realidad, el reporte pasará a ser "cuando haya novedades" en vez de semanalmente, porque a veces tardo más de una semana en completar una tarea y no tiene sentido informar de un trabajo a medias. Vamos con los avances de esta semana:
Imágenes
Por un lado, tenemos las imágenes. Mi talón de Aquiles. Mis cualidades artísticas, en una valoración del 1 al 10, son de -5 así que he estado toda la semana pensando qué podría hacer con las imágenes. Esto es una aventura conversacional, ni tiene por qué llevar imágenes. Sin embargo, a mi me gusta que tengan algo mínimo. Una imagen que no dé información, pero que sí dé ambientación. Además, no debo olvidar que la aventura está orientada a gente que no haya jugado nunca antes a una aventura conversacional, por lo que debe aprovechar las "modernidades" de las herramientas de hoy en día y olvidar las limitacines de los 8 bits.
He valorado varias opciones:
- Imágenes por IA: es lo más cómodo y, tengo que decir, quedan francamente bien. A nivel profesional. Pero no he logrado conseguir sacar 3 ó 4 imágenes que tengan consistencia, entre ellas: ambientación, tamaño, nivel de detalle, etc. Además del dilema moral de usar IA de una forma generativa. Descartado.
- Edición de imágenes con IA: esta es una opción válida. Se trata de que yo hago un dibujo con Aseprite con el nivel de detalle y los elementos que quiero y le digo a una IA: coloréalo y ponlo bonito. Al final, es como un filtro de un programa de edición de imágenes. No uso una IA generativa, sino que se aplican unos filtros a mi propia imagen. Es el plan B para cuando no sea capaz de hacer yo mismo las imágenes y que me queden bien.
- Hace yo mismo las imágenes: en esta opción estoy haciendo unas imágenes básicas que luego paso al Gimp y empiezo a aplicar filtros a cascoporro. He tardado bastante en encontrar la combinación de filtros que combinen con los colores y la ambientación del juego, pero creo que finalmente lo encontré. He tenido que documentar todos los pasos para que los filtros sean siempre los mismos en todas las imágenes.
Por cierto, en este punto quiero agradecer la ayuda de la gente del CAAD que me ha dado consejos sobre las imágenes. Si os gustan las aventuras os aconsejo que visitéis su web, foro, wiki y Discord.
Código
He tocado mucho código esta semana, sobre todo los dos últimos días. Voy a intentar a explicarlo de una forma que se entienda. He trabajado sobre todo en el listado de objetos. ¿Cuándo hay listado de objetos? En dos casos: al explorar la habitación "también veo..." y en el inventario.
Inventario
Antiguamente, el nodo donde se mostraban los objetos del inventario era un label. Había un bucle que recorría la variable array que almacena los objetos del inventario y añadía cada elemento del array como texto al label del inventario. Algo así:
func _inventario_refresh(): inventario.text = "" inventario.text = "\n" var obj var obj2 for item in Globals.inventario: obj = item.get_basename() obj = str(item) obj2 = Globals.get(obj) inventario.push_color(Color.CYAN) inventario.append_text(obj2.nombre + "\n")
El inventario está siempre visible. Lo que hace esta función es vaciar el texto del label que muestra los objetos, recorre el array donde están guardados (Globals.inventario) y para cada objeto encontrado añade su nombre al texto del label (inventario.append_text)
Esto funcionaba bien, pero tenía muchas limitaciones. La primera de ellas es que quería que el jugador pueda pasar el ratón por los nombres y se muestre información. Como he dicho, debe ser un juego cómodo para los jugadores novatos. Esto no podía hacerlo si todos los objetos formaban parte del mismo nodo, ya que no eran más que palabras en un label.
Lo que he hecho ahora es que, por cada objeto, se genera un label hijo con el nombre del objeto. Así, cada objeto pasa a ser un nodo diferente. Después he añadido también un tooltip con la descripción del objeto. Ahora, al pasar el ratón por encima del objeto, se muestra el texto del comando "examinar objeto". Sería algo así:
func _inventario_refresh(): for child in vbox.get_children(): vbox.remove_child(child) child.queue_free() for item in Globals.inventario: var label_item = Label.new() var tooltiptext: String var objeto = item.get_basename() objeto = Globals.get(objeto) tooltiptext = objeto.descripcion label_item.text = item.capitalize() vbox.add_child(label_item) label_item.mouse_filter = Control.MOUSE_FILTER_PASS label_item.mouse_entered.connect(_on_label_mouse_entered) label_item.mouse_exited.connect(_on_label_mouse_exited) label_item.ready.connect(_on_label_mouse_entered) label_item.tooltip_text = tooltiptext
Además, esto me permite meter los objetos como hijos de un vboxcontainer, lo que ordena los objetos automáticamente en cuanto a espacio entre ellos, sangrías, etc. También he modificado todas las acciones relacionadas con objetos e inventario ("coger", "dejar", etc.) para que ejecuten esta función, ya que antes, agárrate, esta función se ejecutaba cada frame lo cual era una locura en cuanto a recursos. Eso lo hice para no tener que preocuparme de que la función se ejecute cuando hay un cambio en el inventario. Ahora me tengo que preocupar :D, pero a cambio liberamos recursos.
Objetos de la habitación
Los objetos de la habitación son los que se listan cuando se termine la descripción de la sala y se muestra el mensaje de "También veo..." El sistema anterior era exactamente el mismo que el inventario: un nodo tipo label al que se le va añadiendo el texto que encuentra en una variable tipo array que almacena los objetos de la habitación. El problema que tenía era el mismo que en el inventario, así que la solución también fue la misma.
Aunque no exactamente, porque ahora, cuando el jugador hace clic en uno de los objetos, aparece un menú contextual con ciertas opciones: "coger", "examinar", etc. Cuando se ejecuta una de estas opciones del menú, la orden se escribe en la línea del parser y se ejecuta directamente. Esto tiene varias ventajas:
- Por un lado, le estamos diciendo al jugador: ¿ves? las instrucciones se escriben en este input y de esta forma. Estamos ayudando al jugador a conocer como se usa un parser.
- Por otro lado, le facilitamos un poco la vida al jugador. Los jugadores nuevos son más perezosos para escribir que los veteranos. De esta forma, les estamos dando un respiro.
- He podido solucionar el problema del formateado en la presentación de los objetos. Antiguamente se mostraban "objeto1, objeto2, objeto3," y se añadía la coma incluso al final del último objeto. Esto era porque la programación no podía diferenciar cuando era el último objeto. Al realizar el listado por nodos label independientes, he podido gestionarlo y ha quedado perfecto. Ahora no solo se muestran bien las "comas" si no que he incluído un "y" antes del último objeto (y esto traducido a todos los idiomas)
Música
¡Ya tengo elegida la música! No os podéis ni imaginar lo tedioso que fue. Tengo un banco de audios y me he pasado DÍAS escuchando cientos de audios hasta dar con lo más acertado. Tengo ya todos los audios de la interfaz, así como la música ambiente. Como hasta ahora no había sonidos en el juego, tampoco había controles para mutear y regular el volumen, así que lo he tenido que programar todo también.
Planes futuros
Pues la demo ya está casi lista. No creo que toque nada más de código así que ahora mismo lo único que me queda es terminar las localizaciones (traducciones) de algunos textos y ya podré sacar la demo. Consistirá en la primera habitación y la demo terminará al lograr salir de ella. Habrá varias formas de hacerlo y, cuando lo hagamos, el juego nos dirá si nos han quedado cosas por hacer.
Ahora mismo no puedo dar una fecha exacta de la salida de la demo porque antes quiero pasársela a uno o dos testeadores. La demo no debe ser un early access y debe ser totalmente funcional, ya que es la presentación del juego y la primera impresión para muchos. No quiero que nadie se lleve la idea de que es un juego chapuza.
¡Gracias por leerme y nos vemos en el siguiente post! ;)
Escape Carcelario
¿Podrás descubrir los secretos de esta cárcel espacial?
Status | In development |
Author | Trevizer |
Genre | Interactive Fiction |
Tags | Godot, Singleplayer |
Languages | Catalan; Valencian, English, Spanish; Castilian, Galician |
Accessibility | Subtitles |
More posts
- 09/12/24 - Estado actual - Gestión de los idiomas53 days ago
- Estado 02/12/2460 days ago
- 19/11/2024 Estado actual72 days ago
- Estado Agosto 2481 days ago
- Estado 11/11/2481 days ago
Leave a comment
Log in with itch.io to leave a comment.