domingo, 24 de febrero de 2019

Actualización de estado #3

Hoy domingo 24 de febrero de 2019, he grabado un vídeo para enseñar las adiciones que he ido haciendo al proyecto desde la semana pasada.


El termino definitivo para los elementos que representan bloques lógicos es "Pieza", el antiguo Elemento sigue haciendo de base pero ha sido adaptada a las mecánicas que faltaban en la primera demo.

A parte de los orgánulos básicos que tienen los elementos he creado el par Tip-Hole. (Referencia al par Electron-Hueco) Los tips son elementos especiales que comienzan siendo arrastrados y si se sueltan y no están conectados un hueco, se eliminan. La mayoría de huecos son estáticos, porque están hechos para una categoría especifica de Tips. Pero hay un componente recurrente que utiliza huecos dinámicamente.


Estoy hablando de el Constructor, usado para generar expresiones. Admite cualquier combinación de literales, variables, paréntesis, operadores lógicos y aritméticos. Sus huecos se adaptan al tamaño de la pieza, el constructor se adapta al tamaño de sus huecos y avisa a la pieza que lo contiene para que se actualice. Hay dos tipos de Hole en un Constructor; un hueco Daft y un hueco Punk, es broma se llama Linker. Los Linkers son operadores y los Daft son variables o literales. En general el usuario puede crear cualquier abominación, pero la secuencia Daft-Linker mantiene un poco de coherencia. Los paréntesis no encajan en ningún grupo, pueden ser colocados en cualquiera y no provocan alteración en la secuencia.



Para que los Tips encajen perfectamente se hace una aproximación fina hasta el centro del hueco. (La cual dio problemas por el tratamiento que tienen las posiciones en el código base)


Para conectar piezas se usa un mecanismo más avanzado de par Macho-Hembra. El puerto hembra, caracterizado por tener dos terminales a los extremos, tiene el trabajo de mover al macho. El puerto macho, con un terminal central, no se encarga de otra tarea más que realizar una aproximación fina hasta encajar perfectamente.
En realidad no hay piezas macho o hembra, sino que son los puertos los que tienen género. Una pieza puede estar conectada con un puerto macho, y tener a su vez otra pieza conectada por un puerto hembra.
Como resultado, si la hembra se mueve el macho le sigue; para desconectarlos hay que mover al macho.


El usuario arrastra las Piezas y Tips desde un generador ubicado en el lateral izquierdo. El Summoner tiene una forma y texto para identificar el elemento que generará cuando se pulsa en él. Existen colecciones de Summoners que aparecen dependido de el elemento seleccionado.



Adjunto una anécdota del problema que cariñosamente he apodado "Piezas gays"
Puestos a decir verdades; el nombre Tip no tiene nada que ver con lo que hace, se lo puse porque fue lo primero que se me vino a la cabeza al crear la clase. Lo mismo con Daft, le puse el nombre porque estaba escuchando Steam Machine.


He tenido que reconstruir todo el mecanismo de docking. Las cajas que se incrustan en los huecos (llamados Tip y Hole, respectivamente) tienen un mecanismo completamente diferente a las piezas grandes (Al final yamadas Pieces).
Al principio la conexión entre piezas era muy sencilla. Cuando terminas de arrastrar algo, el controlador miraba que puertos estaban en superposición y si coincidían en nombre (El puerto de uno tiene el mismo nombre que la otra pieza y vice versa) se lo decía a los objetos.
En la conexión hoy dos roles. La hembra (conexión con dos patillas) mueve consigo al macho, pero el macho puede moverse libremente. Si cuando el macho se mueve se aleja demasiado acaban desconectados.
Pero hay una pieza (el ExtraVar) que tiene un puerto macho que va al Declarator o a otro ExtraVar y un hembra al que se conecta otro ExtraVar. El problema es que la conexión solo se podía hacer si el puerto coincidía con la otra pieza. El ExtraVar solo podía conectarse a si mismo mediante Hembra-Hembra y os podéis imaginar como acaba eso.
He creado un objeto de tipo puerto que se configura como macho o hembra y que actúa de mediador entre las piezas. Ahora los puertos del ExtraVar son los dos del mismo tipo, pero uno macho y otro hembra.
Ahora está bien hecho.
Yo lo llamo "El error de las piezas gays"

jueves, 21 de febrero de 2019

Actualización de estado #2

Hoy jueves 21 de febrero de 2019, he terminado de dar forma a la interfaz. También he actualizado enormemente el código pero hablaré de ello en una actualización futura.


Tengo decidida la resolución, será cualquiera que el usuario le de. En un principio iba a limitarla desde 1280x720 o 1920x1080, pero he llegado a una forma de adaptar la interfaz a cualquier resolución. El límite inferior es 1280x800 y el superior viene dado por la potencia gráfica del equipo.
Las interfaces más agradables serán completamente relativas y se verán idénticas en cualquier resolución. Pero el resto de interfaces usan elementos de tamaños fijos, en el caso de los menús se crea espacio entre sus elementos para cubrir toda la ventana. De esta forma el espacio de trabajo es mayor conforme aumenta la resolución.

Por otro lado; en mi cabeza siempre he tenido un diseño oscuro (que está tanto de moda últimamente), no obstante un tema claro atraería más a un público joven, que es el objetivo. Por esto se van a incluir dos diseños.
Como se puede ver en los diseños que adjunto, se diferencian por los colores y algunas imágenes.









domingo, 17 de febrero de 2019

Actualización de estado #1

Hoy domingo 17 de febrero de 2019, he subido a github el código base en el que he estado trabajando este fin de semana.


La parte visual del proyecto está hecha con OpenGL en Java mediante la librería LWJGL.
Pese a haber tenido experiencia previa con LWJGL 2, he preferido usar la versión más reciente (3.2) y debo decir que no tiene nada que ver.
Pese a este contratiempo, he ido dando pinceladas durante la semana al motor base. Mi idea es crear una base (que no un framework, ahora esta de moda llamar framework a todo) para que el diseño de la interfaz sea lo más fácil posible, ya que sobre ella debe ir el funcionamiento final y no quiero tener que discutir sobre el sistema de coordenadas cuando ya haya pasado a implementar las últimas funciones del programa.

En rasgos generales cabe destacar que he intentado escribir todo el código en ingles; tengo la mala costumbre de mezclar idiomas todo el rato. lowerCammelCase para todas las variables excepto las constantes o variables globales importantes, esas en mayuscula y SNEAK_CASE.
Esta es la estructura que he seguido:

  • Dot define un punto en el espacio 2D. (sirve para lidiar con el sistema de coordenadas de LWJGL)
  • ElementBase es el padre de todos los objetos que tienen posición, es decir, de todos los elementos y orgánulos.
  • Shape es la estructura básica de una forma. El resto de formas se crean a partir de estas, por ejemplo Shape_Square. Estos si son orgánulos.
  • Texture es una textura, carga imágenes y contiene el ID de textura en OpenGL.
  • Image es el orgánulo que dibuja una textura.
  • Font es una colección de Texturas para dibujar texto.
  • TextLabel es un orgánulo que dibuja texto.
  • TextBox es un orgánulo que permite introducir texto, utiliza un TextLabel.
  • Element es el que contiene los orgánulos. Se maneja con sus propiedades principales Drawable y Dragable, y la lista de orgánulos. Element es abstracto, los elementos reales implementan esta clase.
  • Global contiene las constantes o variables globales a las que se accede en cualquier parte del código.
  • Keyboard y Mouse son dos clases para leer las entradas.
  • SoundPlayer es una clase para reproducir audio.
  • Controller es proceso principal. Se le llama desde el ciclo de ejecución del hilo (creado en Display) y se controla el número de actualizaciones mediante SyncTimer. Controller maneja el dibujado, arrastrado y seleccionado de los elementos. (Estos dos últimos diferenciándose muy poco)


Adjunto un vídeo que muestra un elemento de prueba con las características que he introducido.

Entre semana intentaré publicar un esquema con los elementos reales de la interfaz y para el fin de semana que viene espero poder tener una demo con características más cercanas a la interfaz final.

lunes, 11 de febrero de 2019

Actualización de estado #0

Hoy lunes 11 de febrero de 2019, he creado este blog.


He usado blogger porque no se me ocurría otra forma más cutre y anticuada.
También adjunto un logo provisional a este proyecto.
No esperéis actualizaciones hasta dentro de unos días, aún me faltan algunos exámenes del cuatrimestre.

En las siguientes actualizaciones espero realizar una prueba de concepto del motor gráfico y, más adelante, publicaré esbozos e la interfaz hechos en papel.