PDA

Ver la Versión Completa : Ayuda al utilizar TImage como pintura para crear mapas al estilo de juegos antiguos


Kandorf
17-07-2010, 16:19:09
Estoy intentando crear algo parecido a los mapas que hace el programa RPG Maker.
Para los que no sepan a qué me refiero, en los videojuegos antiguos los mapas se componían por trocitos de imagen uno al lado de otro y así se componían los escenarios, eso es lo que quiero hacer.
Las imágenes que quiero utilizar de pintura son de 32x32.
Tengo unas imágenes grandes con medidas múltipos de 32, que al hacer click sobre ellas tomo como pintura el trozo correspondiente si la dividiéramos en cuadrados de 32x32.
Tengo un mapa compuesto por TImages de 32x32 con un evento OnDragOver que pinta con la pintura que hayamos elegido.

El problema está en que ahora mismo para pintar tengo un TImage auxiliar de 32x32 a la que, al hacer click en la imagen grande, asigno como Canvas el trozo de imagen correspondiente, y al hacer click sobre el mapa lo que hago es copiar el Canvas de la imagen pincel en el Canvas de las imágenes del mapa. Lo que me gustaría hacer es que el Canvas de la imagen del mapa hiciera referencia al trozo de la imagen grande, para que cada Cuadrado del mapa no ocupara memoria, sino que fuera un puntero o algo por el estilo, y así también, si se cambiara la imagen grande, no tener que cambiar cada imagen del mapa una a una, ya que se cambiaría automáticamente.

Un saludo y gracias por vuestro tiempo.

PD: Como posible solución se me ha ocurrido crear un TImage por cada Cuadrado 32x32 en que se dividiría la imagen grande y hacer referencia a estos, pero no sé si sería una solución cutre.

coso
17-07-2010, 20:37:58
Hola,
lo mejor que puedes hacer entonces no es copiar directamente de la imagen al canvas digamos destino, sino crear un mapa donde este, por ejemplo, un numero identificador del bitmap que necesitas. Entonces recorrer este mapa (que puede ser un doble array, por ejemplo 1000x100) de integer y ir leyendo sus valores. Al encontrar por ejemplo un uno, pintas en el canvas destino el bitmap nº1, etc...Para usar la lista de bitmaps no te haria falta creartela tu, existe el componente bitmaplist el cual ya simplifica bastante esta tarea. Espero que te sirva, un saludo.

Kandorf
18-07-2010, 11:30:36
Gracias por la respuesta.
Lo de utilizar enteros es lo que tenía pensado, sólo que además hace falta un TImage en el que representar el trozo de mapa, estaba probando esta parte porque era la que más dudas me generaba.
Finalmente creo que seguiré mostrando la imagen grande y crearé un BitmapList representando las imágenes 32x32 en las que se subdivide, y en el evento OnMouseDown de la imagen grande, en función de donde se haya hecho click haga referencia a una de las imágenes del BitmapList (cogerá el valor entero de la lista del BitmapList en lugar de cargar el canvas en una imagen auxiliar).

Ahora me surge otro problema, hasta ahora estaba probando a crear mapas de 20x15 e iba genial, he probado a crear uno de 500x500 y al iniciarlo me da un problema de "Violación de acceso de memoria en la dirección TAL" ¿Esto es porque pido demasiada memoria? ¿Porque pide tanta memoria seguida que se pisa él solo? Tengo 4GB de RAM, no creo que ese sea el problema, y aunque la ocupara toda supongo que el propio Windows utilizaría memoria virtual.
Lo que he pensado para solucionar esto es crear sólo los objetos que se puedan mostrar en pantalla e ir creando y eliminando conforme se mueven los ScrollBars del ScrollBox que los contiene, aunque no sé si se me quedará grande saber hacer eso, además de que habría que tener en cuenta cuándo se cambia el tamaño de la ventana y puede que más cosas.
¿Consejos?

Un saludo.

Kandorf
19-07-2010, 01:53:32
He intentado ponerme con lo de pedir memoria dinámicamente para los trozos de mapa que se muestren, pero no encuentro nungún evento en el ScrollBox para cuando mueva las barras de desplazamiento, o en definitiva, muestre otra parte del contenido scrollbox, esperaba un evento OnScroll, pero no lo tiene, el objeto TScrollBar sí lo tiene, pero no sé usarlo, aun así, creo que no es lo que debería usar, ¿O sí?
Creo que este mensaje empieza a no encajar en este subforo.
Por cierto, ¿Con BitmapList te referías al ImageList? Es que no encuentro la manera de usar un BitmapList, ni desde autocompletar ni en la ayuda.

Un saludo.

Kandorf
19-07-2010, 03:35:20
Ya he hecho lo de los BitmapList, he intentado hacerlo hacerlo con un ImageList, pero no sabía cómo añadir y borrar imágenes, así que al final he optado por hacer un array de TPicture, que puede que hasta sea más eficiente, el programa va perfecto.
El problema que tengo ahora es el de no poder pedir memoria para un mapa de 500x500 y tener que ir cargando el mapa según la zona que se muestre del ScrollBox, si existiera un evento OnScroll para el ScrollBox mi vida sería mucho más fácil.

Esto se está convirtiendo en mis relatos, sólo escribo yo...

Si veo que no responde nadie, postearé la duda en el subforo de POO, que creo que es más adecuado.

Saludos.