Hola geste, gracias por los consejos, llevo tiempo dandole vueltas a la cabeza sobre este tema..
Haber.. vamos por partes, por que aquí hay mucha cosa que no se cuenta al publico y que parece oro y es caca de la vaca XD..
Sobre el tema de los mapas de tiles, son una buena idea "a priory" pero en realidad no lo son, quizá son una buena forma de realizar escenarios pequeños y sin demasiada complicación, pero vamos a analizar esto detenidamente..
Sobre el papel, el estilo del tile map o 'tiled' es buena idea, ya que te permite dibujar muy comodamente un escenario, para la fase de diseño la verdad es que estamos completamente de acuerdo, es muy buena solución para alquien que no quiere hacer algo demasiado rebuscado y que sea en su mayor parte repetitivo, así que es una buena solución en general lo de poder dibujar una escena con un tileset.
Pero ya hablando de recursos.. la cosa cambia bastante.. y digo bastante por lo siguiente..
Lo que el publico en general no conoce o sabe es que un tileset se carga al completo en memoria, osea, todas esas pequeñas partes se almacenan en memoria para luego poder ser utilizadas ingame, enotonces siendo esto así, ahora pensando en lo que comentaba OscarG.. si tu cargas en memoria todo el mapa del nivel.. y vas haciendo map puts al lienzo que se ve en pantalla.. realmente que ganas?
Absolutamente nada, es mas, pierdes mucho, por que necesitas crear un control de posición y desplazamiento de la escena y además necesitas estar controlando y haciendo los puts() graficos al mapa.
En mi opinión, este sistema es el peor de todos, a no ser que no carges nada en memoria, y vayas cargando a razon de lo que va apareciendo en pantalla, y también vayas descargando recursos de memoria ram a razón de lo que deja de verse..
Esto es bastante costoso y tiene muchas limitaciones simplemente por la velocidad de carga y el uso continuado de disco o memoria no volatil.
Creo que no es una solución, pero me gustaria que me lo rebatierais haciendome ver en que me estoy equivocando, ya que no quiero tener la razon, simplemente quiero discutir sobre este tema tan interesante.
Por otro lado tenemos lo que dice hokuto, un motor de tiles, que si que es mejor que la solución de OscarG, pero también tiene sus contras..
La solución del mapa de tiles me gusta mas por que ahorras bastante recursos de memoria ram, pero realmente tiene un motor detras que anda pintando y borrando tiles.. y al final te encuentras con ciertos problemas cuando realizas juegos realmente grandes..
Por ejemplo.. un enemigo, un tile concreto, o un simple evento.. para hacer un juego LOCAL no hay problema.. borras de pantalla no que no se ve.. y listo.. pero.. y digo pero por que hay un gran pero..
Si tienes un enemigo en la parte superior del nivel.. que esta moviendose en una zona que tu no ves.. como comprueba colisiones y eventos con los demas objetos del juego?
Pues he aquí el gran problema real.. si no hay escenario completamente creado no se puede hacer.. sin mas..
Y es aquí donde las capacidades de openGL/Vulkan brillan y nos ofrecen soluciones muy poco costosas y atractivas tanto en fase de diseño como en fase de gameplay, hablo de las "wrapTexture".
La cosa actualmente está en que tu creas un viewport del tamaño de la pantalla, y tienes una textura bien grande, si, bien grande, y lo que hacen estos engines modernos es simplemente cargar el archivo de imagen como una textura para un 'shape' o mascara, osea.. un simple poligono.. y mediante un algoritmo de carga este gran poligono se "TROCEA" en poligonos mas pequeños y se les aplica una parte de la texutura grande original, con lo cual internamente ya tenemos el sistema que comentaba OscarG pero siendo controlado directamente por Vulkan u OpenGL y no por nosotros en plan espartano jeje..
Mi conclusion, es que algo como TILED es muy buena solución para "pintar" la escena, pero a la hora de renderizarla todo esto que estamos hablando ya lo hacen los grandes drivers graficos, otra cosa será como lo hace Gemix o lenguajes así, que no tengo ni la mas remota idea, yo creo que en gemix todo es una textura sin mas que se aplica a un rectangulo sin crear subpoligonos ni nada.. no lo se hee.. esto lo tendría que decir mejor CicTec.. pero vamos..
Que tu cargas el archivo .png en memoria y directamente al cargarse como una "textura" en vez de como una "imagen" ya se poligoniza solo y se aplica de la forma que decis de forma automatica, luego solo tienes que pintarlo desplazado en x o y internamente accediendo a los offset de la textura y ya esta.. tienes una imagen pequeña que parece un scroll como los de gemix mediante una imagen mas grande..
Un ejemplo de como lo hago yo es así:
class scroll {
int st = 0;
PImage gr;
PShape s = null;
float size = 100;
float sizeX = 100;
float sizeY = 100;
float x = 0;
float y = 0;
float angle = 0;
PVector offset = new PVector(0, 0);
PVector tiling = new PVector(1, 1);
boolean xmirror = false;
boolean ymirror = false;
//......................................
scroll(PImage gr) {
this.gr = gr;
}
//......................................
void render() {
// configure transformation matrix..
blitter.pushMatrix();
blitter.shapeMode(CENTER);
blitter.textureWrap(REPEAT);
// create a pshape..
s = createShape();
s.setTexture(gr);
s.disableStyle();
s.beginShape();
s.vertex(0, 0, offset.x*tiling.x, offset.y*tiling.y);
s.vertex(gr.width, 0, (gr.width+offset.x)*tiling.x, 0+(offset.y)*tiling.y);
s.vertex(gr.width, gr.height, (gr.width+offset.x)*tiling.x, (gr.height+offset.y)*tiling.y);
s.vertex(0, gr.height, offset.x*tiling.x, (gr.height+offset.y)*tiling.y);
s.endShape(CLOSE);
// apply pshape fx translate, rotate and scale..
blitter.translate(x, y);
blitter.rotate(radians(-angle));
if(size==100){
blitter.scale( xmirror ? -sizeX/100.0 : sizeX/100.0, ymirror ? -sizeY/100.0 : sizeY/100.0);
}else{
blitter.scale( xmirror ? -size/100.0 : size/100.0, ymirror ? -size/100.0 : size/100.0);
}
blitter.shape(s);
blitter.popMatrix();
}
//......................................
//......................................
//......................................
}
En este simple ejemplo tienes que creas un layer de scroll con un simple:
y para moverlo haces esto:
Y con esta birria de codigo ya tienes un scroll grandioso completamente controlado por Vulkan o OpenGL sin tener que hacer nada en absoluto.
Eso si, el que yo estoy diciendo ha de cargar entera la textura de la escena, mas ram gasta si, pero ahorras mucha CPU y carga de disco.
Que opinais sobre todo esto?