Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - El_Chavo

#16
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
12 de Marzo de 2011, 03:48:10 PM
Cita de: Hechelion en 11 de Marzo de 2011, 10:20:30 PM
Ojo, no digo que el diseño sea malo, al contrario, es simple y robusto. Lo que decía y por experiencia es que te puede quedar corto (que a mi ya me ha pasado varias veces, por eso programo pesando en que sea lo más versátil posible) si para tu diseño estás seguro que con 9 acciones y 99 tiles estás bien, pues entonces adelante, no le veo problemas al formato.

Sobre modificar un dígito, no es tan simple (o por lo menos, lo que yo entiendo), asumiendo que creas el mapa y tienes la información:

0195,01294,0195,0040,0040 etc

Y quedaste corto y se te ocurre agregar un dígito más, tendrías que transformar todo el mapa:
un 0195 deberá pasar 01095, si no, el 1 de la colisión pasará a ser parte de la información del tile, con eso me refiero a que es poco escalable, porque si tienes creado un mapa y se te ocurre cambiar algo debes editar todos los mapas anteriores (hablamos de editar la estructura del mapa a mitad de camino)

Añadiré un dígito más ahora, pudiento tener todavía más posibilidades, aunque según lo que he estimado, no creo que vaya a utilizarlos.

Cita de: Hechelion en 11 de Marzo de 2011, 10:20:30 PM
A veces me ha pasado que dices, una acción "hablar basta y sobra" y de pronto te das cuenta que para que el NPC haga lo que realmente quieres que haga pues tienes que pasar otro parámetro y vamos agregando otra opción y así va sumando, por eso, personalmente creo que es mejor que la programación sea versatil y fácilmente escalable, pero nuevamente, es una opinión y no significa que sea lo mejor para todos, en especial si ya tienes bien definido tu juego.

No has entendido bien. Las acciones no son de los NPCs si no de las casillas o celdas.
Para hablar con los NPCs y en general para interactuar con cualquier objeto, ya es otra historia.
Las acciones son sucesos que ocurren cuando el jugador entra en esa casilla, y no tiene nada que ver con los NPCs.
Por ejemplo, sería teletransportar a otro mapa, mostrar un texto, etc

Cita de: Hechelion en 11 de Marzo de 2011, 10:20:30 PM
Edit:
Acabo de probar el código que colocaste abajo y a mi me equipo le toma menos de un segundo completarlo. Algo más debes tener que está causando la demora.

Gracias, pero ya he encontrado el problema.
No estaba exactamente en ese bucle, si no en otro que se ejecuta a continuación de ese.
El código es el siguiente:


Type CellType
    action as string
    isBlocking as string
    material as string
End Type

Dim map() as CellType
Dim mapWidth as integer, mapHeight as integer
Dim asciiMap as string

mapWidth = 300
mapHeight = 300

asciiMap = ""

Redim map(mapWidth, mapHeight) as CellType

for i = 0 to mapHeight -1
    for j = 0 to mapWidth - 1
        'Concateno en asciiMap la información de cada celda del mapa.
        asciiMap = asciiMap & map(j,i).action & map(j,i).isBlocking & map(j,i).material
        'En este if...endif compruebo si no es el último elemento, y le añado una coma.
        if j < mapwidth - 1 then asciiMap = asciiMap & ","
    next j
    'al finalizar con cada fila, añado un retorno de carro.
    asciiMap = asciiMap & vbcrlf
next i



Pues ese código aparentemente tan sencillo, ralentiza eternamente al programa.
He realizado varias pruebas, y la conclusión es que las operaciones de concatenación de caracteres son tremendamente lentas.

En principio podría omitir esto, ya que en realidad esta función sirve para mostrar en un textbox una previsualización del fichero del mapa.
De todas maneras, me gustaría, a ser posible, si alguien me pudiese ofrecer alguna solución para esto.

Ahora bién, para escribir en el fichero el mapa también voy a tener que concatenar así que aunque elimine la previsualización ascii, me voy a encontrar el mismo problema.

¿Alguna solución para esto?

Un saludo y gracias.
#17
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
11 de Marzo de 2011, 09:01:05 PM
Antes de nada, gracias por tu respuesta.


Hay un par de cosas que comentas:

Cita de: Hechelion en 11 de Marzo de 2011, 06:35:18 PM
Se ve bien el formato, lo importante es que cumpla lo que necesitas para el juego, algunas cosas a considerar a mi juicio serán las siguientes.

El formato no tiene mucha versatilidad u opción de escalar, por  lo cual, antes de implementarlo tienes que estar seguro que cumplirá con todas las expectativas de diseño del juego, me explico. Sólo tienes un carácter para acciones, si sólo usas números, significa que cada mapa sólo podrá tener 9 acciones diferentes y si en medio del juego quieres agregar una décima acción tendrás que cambiar toda lo referente al mapa.

Es que en realidad, no creo que hagan falta las nueve acciones. Aún no he llegado a ese punto, pero acciones como "ir", "hablar", "usar", "teletransportar" y quizás alguna más podrían ser más que suficientes.
No sé si te habrás equivocado, pero son acciones independientes del jugador, es decir, no son acciones que el jugador pueda realizar cuando quiera pulsando una tecla, si no cuando entra en la casilla en cuestión.

Cita de: Hechelion en 11 de Marzo de 2011, 06:35:18 PM
El mapa solo te soporta 99 tile diferentes y no tiene multicapa, o sea, no puedes hacer combinaciones. Si me hablas de un mapa de 300*300 tienes 90.000 tiles y solo 99 "texturas" para llenarlos. ¿Estás seguro de esas cantidades?.

Básicamente lo que tienes que pensar, es si las limitaciones del mapa se adaptan o no a lo que quieres del juego, el formato que presentas es simple, robusto pero no se ve escalable ni versátil y si a mitad del juego se te ocurre que 99 tiles son pocos y quieres meter 101 te vas a dar cuenta que es imposible sin modificar todo lo que ya llevas hecho.

Igual que antes, 99 tipos diferentes de texturas creo que incluso sobrarían.
El mapa del juego es decir, el del mundo, no el de las ciudades o mazmorras, será algo así:

(es una imagen muy grande)
http://www.adamantyr.com/crpg/images/WorldMap.png

En ese mapa no hay ni 20 tipos diferentes de texturas.

también están las texturas de ciudades, mazmorras y demás, para las cuales voy a tener otras tantas texturas, o quizás menos.
99 creo que sobrará.
Pero en caso de que necesite más sólo tengo que aumentar de dos a tres dígitos y ya tendría 999 como máximo.


Cita de: Hechelion en 11 de Marzo de 2011, 06:35:18 PM
Personalmente, creo que sería mejor dotar al mapa de algunas capas, normalmente unas 3 capas de dibujo, una para colisión y otra para la lógica. Así por ejemplo, puedes tener la primera capa como suelo y  en la segunda capa colocar un árbol, de está forma el  árbol es independiente de la primera capa y puedes tener un árbol en un suelo de pasto, un suelo de gravilla, un suelo de colina, etc.

La capa de colisión puede ser un mapa de dureza y al tener una capa independiente para las acciones no tienes limitación al número, la otra ventaja es que cada tile en cada mapa sería un número en vez de un string con lo cual no necesitas hacer nada para que inicien en 0.

Ejemplos de tilemap con la librería tienes un par:
http://www.stratos-ad.com/forums/index.php?topic=12892.0
http://www.stratos-ad.com/forums/index.php?topic=12760.0

¿Qué es un mapa de durezas?
Deduzco que es algo así como una matriz que contenga en posiciones absolutas los objetos del mapa.
Pero ¿para qué crear otra matriz (si es que es eso) si ya tengo la información de todos los objetos en el propio archivo del mapa? Sólo tendría que comprobar si la casilla a la que se quiere mover el jugador contiene algún objeto, es decir, el "bit" de objeto es diferente de cero.


El juego se verá como esto mas o menos:


O quizás como esto:


Realmente no son necesarias las capas, ya que primero se pinta el mapa, luego los objetos y jugador, y finalmente el LOS.
Como ya sé en qué casillas está cada objeto por que tengo sus coordenadas en el fichero de definición del mapa, sólo tendría que dibujar los objetos en sus coordenadas apropiadas.


Cita de: Hechelion en 11 de Marzo de 2011, 06:35:18 PM
Lo del bucle me llama mucho la atención, 90.000 acciones (dos bucle de 300) no debería consumirte tanto tiempo, salvo que tengas una máquina muuuuuuuuuuuuuuuuuy antigua o que la tengas muy saturada, tal vez tengas algo más metido en el bucle que te consume recursos pero algo así

For i = 0 to 299
     For e = 0 to 299
          Mapa(i,e) = "0000"
     Next
Next

No debería tomarte más de un par de segundos. (yo tengo un Turion II de 2.4 Ghz y ese bucle le toma menos de un segundo)



No es muy antiguo, del 2004. Un AMD no_me_acuerdo_qué a 2.5 Ghz. No me acuerdo ahora mismo del modelo, pero es algo por el estilo.

En realidad el código sería como el siguiente:



Type CellType
    action as string
    isBlocking as string
    material as string
End Type

dim mapa() as CellType
dim mapHeight as integer, mapWidth as integer

mapHeight = 300
mapWidth = 300

Redim mapa(mapWidth, mapHeight) as CellType

for i = 0 to mapHeight - 1
    for j = 0 to mapWidth -1
        mapa(j,i).action = "0"
        mapa(j,i).isBlocking = "0"
        mapa(j,i).material = "00"
    next j
next i


Quizás tenga alguna cosa que se me ha pasado por alto. Le daré un vistazo.

Gracias por la ayuda.

Un saludo.
Larga vida y prosperidad. ;-)
#18
Proyecto dx_lib32 / Opinion de nuevo formato de mapas
11 de Marzo de 2011, 05:52:48 PM
Hola.

Quería saber sus opiniones acerca de una formato de mapas que voy a usar en un juego cRPG que llevo programando desde hace un tiempo.
El juego tendrá un aspecto clásico como The Magic Candle, Gates of Delirium o incluso el juego Lenges/Legends 2 de las viejas TI-99.

Para aquellos que no conozcais dichos juegos, son juegos 2D que consisten básicamente en un enorme mapa del mundo por el que libremente puedes moverte. El mapa del mundo contiene ciudades, catacumbas y etc... Además no suelen ser juegos muy lineales.

La cuestión es que los mapas todos están ya preconstruidos, no son como un Roguelike que todo es al azar, así que he creado un formato de mapas para este tipo de juegos, hecho en simple texto plano.
Os describo como lo he hecho:

los mapas se pueden abrir con un editor de texto plano, y se verá algo como esto (sin las líneas horizontales)

---------------------------------PARTE 1
Bosque Maldito
10
10
---------------------------------PARTE 2
0103,0103,0103,0103,0103,0103,0103,0103,0103,0103
0103,0001,0001,0001,0001,0001,0001,0001,0001,0103
0103,0001,0001,0001,0001,0001,0001,0001,0001,0103
0103,0001,0001,0001,0001,0001,0001,0001,0001,0103
0103,0001,0001,2001,0001,0001,0001,0001,0001,0103
0103,0001,0001,0001,0001,0001,0001,0001,0001,0103
0103,0001,0001,0001,0001,0001,1001,0001,0001,0103
0103,0001,0001,0001,0001,0001,0001,0001,0001,0103
0103,0001,0001,0001,0001,0001,0001,0001,0001,0103
0103,0103,0103,0103,0103,0103,0103,0103,0103,0103
----------------------------------PARTE 3
1,2
2,1
----------------------------------PARTE 4
2,3,1
4,6,2
2,5,1
7,2,3


La explicación es la siguiente, aunque seguro que ya os imaginais qué son algunas de las partes:

Parte 1: definiciones básicas del mapa: nombre, anchura y altura, en este caso, 10x10 tiles de superficie.

Parte 2: defición de cada celda del mapa. Cada número guarda información de la celda a la que corresponde.
Estos números tienen el siguiente formato:

<A><B><MM>

En donde:

<A> es la acción a la que se llamará cuando el jugador entre en dicha celda. Por ejemplo, en la celda cuya posición es [3,4] (empezamos a contar por el cero), vemos que se realiza la acción número 2.

<B> celda que bloquea o no el paso del jugador u otros monstruos o NPCs. 0 es no bloquea, y 1 es que sí bloquea.

<MM> tipo de material, o lo que es lo mismo, imagen que se colocará en el mapa. Viene definida por números de dos dígitos, desde el 01 hasta el 99. Cuando el juego empieza, carga la imagen con ese índice. El valor 0000 no está permitido, ya que se usará para informar al juego de que esa es una celda vacía.

Por lo tanto: 0002 es que es una celda que no bloquea, no realiza ninguna acción y usará la imagen número 02
Otro caso: 5014 es una celda que tampoco bloquea, y que usará la imagen 14, y cuando el jugador entre en ella, se realizará la acción 5
Otro más: 0101 es una celda que bloquea y usará la imagen numero 01.


Parte 3:
Es la lista de acciones.
Cuando el mapa se inicia se carga toda la lista. Cada vez que el jugador entre en una celda que contenga un indicador de acción, entonces se buscará entre la lista de acciones la que se indica en la celda, y se ejecutará. Es decir, si la celda del mapa tiene la acción 0, entonces no se hace nada, pero si es mayor que 0, pues se buscará en la lista de acciones esa acción y se ejecutará.
Tiene el siguiente formato:

<A><P>

En donde:

<A> es el número de acción a ejecutar
<P> el parámetro que se puede usar si fuese necesario.

Por ejemplo: 1,2 llamará a la acción 1, con el parámetro 2
3,0 llamará a la acción 3 con el parámetro 0. En este caso, el 0 siempre hay que ponerlo para indicar que no se necesita parámetro.



Parte 4:

Es la lista de objetos, NPCs y demás.
Tiene el siguiente formato:

<N><X><Y>

En donde:

<N> es el número de objeto a colocar
<X> e <Y> son las coordenadas del mapa en el que se colocará.

En este caso, los NPCs se almacenan en una matriz a parte, no en la del mapa.
Para comprobar colisiones entre jugador y objetos, cada vez que el jugador quiera moverse a una nueva casilla, se comprueva si en dicha casilla de la matriz de objetos hay algo o no.






Eso es básicamente la definición del mapa y todos sus elementos.
Me interesa mucho sus opiniones para que así pueda mejorarlo.



Otra cosa que quería preguntar:
me he creado un editor de mapas sencillo para crear los mapas.
Cuando creo un mapa en blanco, en realidad está relleno de celdas con valor "0000".
El problema que tengo es que cuando quiero crear el mapa del mundo, que será unos 300x300, tengo que crear una matriz de esas mismas dimensiones, y rellenarlas de "0000"
El problema reside en que usando bucles for..next tarda demasiado, y cuando digo demasiado, hablo de varios minutos.
Y la pregunta es: ¿hay alguna manera para evitar esto, quizás algún otro método que no sean bucles for...next?

Gracias por las respuestas.





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.