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

#1
Proyecto dx_lib32 / Re: Juego RPG. Dudas en general
19 de Marzo de 2011, 01:57:17 PM
Cita de: fjfnaranjo en 18 de Marzo de 2011, 05:17:18 PM
Bueno, este post si acaso debería estar en diseño.

A ver, algunas ideas/brainstorming, no necesariamente juntas:

1.-

Yo te recomiendo que no copies otro juego, invéntate algo nuevo. Por ejemplo, haz que las armas estén basadas en un personaje no jugador generado aleatoriamente y crea el arma mágica según las características del mismo. Podrías hacer que el pnj estuviese en el juego, y hacer que el jugador lo busque porque sus estilos de juego encajen y le quiera comprar más objetos.

No se si lo he entendido bién, pero ¿estás diciendo que haga objetos basados en clases, algo así como "bastones sólo para mago", "espadas solo para barbaro" etc...?
En ese caso, me parece que el juego quedaría muy limitado no sólo en cuanto a rejugabilidad, si no que todos los PJs de un mismo tipo serán muy parecidos.
Creo que lo que quizás más se valore de un juego RPG es la posibilidad de variación infinita, es decir, el hecho de que cada vez que se juege sea diferente. Fíjate en Diablo 1 o 2: puedes jugarlo mil y una veces sin aburrirte ya que cada vez que lo juegas tus personajes son diferentes y las tácticas de combates que uses tendrán que ser diferentes también.

Cita de: fjfnaranjo en 18 de Marzo de 2011, 05:17:18 PM
Monta algo parecido al Dwarf Fortress, y lleva un registro de que material ha sido recolectado por que personaje y como esos materiales han sido combinados para dar lugar al objeto mágico. Le dará diversidad a los objetos mágicos y llevarlos concederá al personaje jugador un cierto trasfondo.

Ya se lleva un control de ingredientes. Están guardados en el formulario del jugador.

Cita de: fjfnaranjo en 18 de Marzo de 2011, 05:17:18 PM
Crea los objetos mágicos según una serie de escuelas de magia (como las escuelas de la tercera edición de Dungeons, o las de Oblivion). Crea sinergias entre estas escuelas, de forma que algunos poderes se sumen o combinen de forma creativa (o se anulen los unos a los otros).

En fin, etcétera.

El sistema de magias ya está hecho, y es un sistema de árbol de habilidades.
Cada tipo de PJ tiene tres posibles "escuelas" con sus propias habilidades o hechizos.
Por ejemplo, el clérigo tiene las siguientes escuelas: Holy, Poison y Nature.
Cada vez que se sube de nivel, adquiere un punto de habilidad que puede añadir a la habilidad que quiera, eso sí, siempre que cumpla los requisitos de nivel y que tenga 5 o más puntos en la habilidad anterior a la que quiere estudiar.
Por ejemplo, para el clérigo, la habilidada básica es "Bash" y el árbol "Holy" es así:

"Healing Light->Prayer of Mending->Retribution->Ascension".
Entonces, si quiere aprender "Healing Light" tendrá que tener Bash en nivel 5 o más.
Para aprender Prayer of Mending necesitará Healing Light en 5 o más, y así sucesivamente.

La razón de por qué se pidan 5 o más puntos de la habilidad anterior es por que así se evita el poder hacer PJs que usen habilidades "ultimate", evitando de esta manera personajes overpowered.
Como el nivel máximo del juego es 99, el nivel máximo de las habilidades es 20 y ya se empieza con un punto de habilidad en la habildad básica (bash, en caso del clérigo), pues sólo es posible tener una de las tres escuelas de magia completa.
Eso sí, siempre es posible mezclar escuelas, por lo que un clérigo puede tener lo siguiente:

"Bash->lvl5" (como requisito solamente)
"Healing Light->lvl20"
"Poison Arrow->lvl5" (como requisito)
"Strangle->lvl20" (de la escuela "poison", segunda habilidad)
"Corrupt->lvl20" (de la escuela Poison, tercera habilidad)
"Inner Beast->lvl5" (de la escuela "nature", primera habilidad, como requisito)
"Nature's Blessing->lvl5" (escuela nature, segunda habilidad, como requisito)
"Earth Link->lvl20" (escuela nature, tercera habilidad)

Hemos gastado todos los puntos de habilidad y tenemos un clérigo que puede curarse, que hace bastante daño de veneno en combate y que además, gracias a earth link, tiene su vitalidad aumentada.
El problema: que no tiene ninguna habilidad ultimate, por lo que en cuanto a ese aspecto, es algo más débil que otro clérigo que sí la tenga.

Mañana os enviaré screenshots de los árboles de habilidades para que os hagáis una idea de las posibles combinaciones.

En cuanto a la combinación de magias o combos durante el combate, no es posible ya que el combate será por turnos. Cada turno de combate el jugador puede elejir o bién atacar con el arma, usar un objeto (poción de vida o maná) o hacer un hechizo, por lo que hacer combos de hechizos es imposible.

Cita de: fjfnaranjo en 18 de Marzo de 2011, 05:17:18 PM
2.-

Mírate como se hace en Oblivion, está muy bien. O fíjate en Magika, como han hecho los diseñadores que se combinen los poderes, a ver si te sale alguna idea.

La cosa es que no se te vaya el sistema de marras, y te permita hacer objetos inutiles ultracaros o objetos mega over perribaratos.


Nunca he jugado a Oblivion, pero sí a Morrowind, aunque no veo realmente lo que quieres que haga.

Si con Magika te refieres al RPG Ars Magica (yo tengo uno de los libros), pues me parece demasiado complejo para ponerme a hacerlo.
De momento mantendré el sistema de juego más o menos sencillo, y quizás en nuevas versiones  añada más cosas.








Cita de: Hechelion en 18 de Marzo de 2011, 07:36:11 PM
1. El tema de sufijos y prefijos es mucho más simple de como lo planteas, de hecho, es uno de lo sistemas más simples de implementar al potenciar un arma ya que tienes lugares fijos para inplementar cada habilidad, así que es un buen sistema para comenzar.
Hay varias formas de implementarlo, pero una simple es la siguiente:

Tienes tu objeto arma, el cual debe tener 2 propiedades, una habilidad prefijo y una habilidad sufijo para almacenar la habilidad o el indice a la lista de habilidades y una o dos listas de habilidades (Depende de como quieras ordenarte), cada habilidad debe indicar que poder le da al arma, puede ser un script, un indice a una tabla de funciones, etc. Y puede almacenar en ella el Strig del sufijo y el del prejifo, más menos algo así:

Struc Habilidad
     Script as string
     Prefijo as string
     Sufijo as String
End Struc

En el objeto arma colocas una función que agregue el contenido de la o las habilidades al objeto, algo así

Public Sub Update_Skill()
      Nombre = ListaHabilidades(Me.IndicePrejifo).Prefijo & ListaArmas(Me.IndiceArmaBase).Nombre & ListaHabilidades(Me.IndiceSufijo).Sufijo
End Sub

Básicamente, el nombre se compone en base a una propiedad de la habilidad, pues el nombre pasa a ser eyecandy, no es necesario que la programación analice el nombre para decir que atributo ganar, eso lo hace un indice que se encuentra almacenado en una propiedad del arma.
El problema de crear un arma aleatoria se reduce a asignar 3 valores aleatorios a 3 propiedades, IndiceArmaBase, IndicePrefijo, IndiceSufijo y puedes usar el indice 0 o el -1 para indicar que no hay valor en alguna de las propiedades, por ejemplo

"Espada Mata conejos"
IndiceArmaBase = 1 '1 es el valor que corresponde a Espada, lo he asignado yo de forma arbitraria
IndicePrefijo = 0 'no tiene prefijo
IndiceSufijo = 15 'la habilidad 15 es "Mata Conejos"

Este sistema yo lo conozco como parametrización, ya que tu problema se resume a cargar valores en ciertos parametros para cambiar el comportamiento del sistema.

En realidad ya tengo hecho el sistema de poderes mágicos de los objetos, y que es diferente a cómo has escrito aquí:

Hay objetos básicos, pongamos por ejemplo, una "Espada Corta".
En realidad son variables de tipo "Objeto", y el tipo objeto tiene las siguientes características:


Type Objeto
    nombre as string
    tipo as string
    subtipo as string
    magicPropsNum as integer
    magicProps() as propiedades
end type


tipo y subtipo indican "espada" y "dos manos" respectivamente.
magicPropsNum indica la cantidad de propiedades mágicas que tiene. Va desde 0 hasta infinito. :-P
magicProps() es una matriz de tipo "propiedades" que contiene las propiedades mágicas del objeto, y es tal que así:


type propiedades
    tipoProp as integer
    arg1 as integer
    arg2 as integer
end type


tipoProp es un valor numérico que indica qué tipo de magia es.
arg1 y arg2 son los valores que usará la magia, así por ejemplo, tipoProp = 0 significa que esa magia añade daño al objeto, y arg1 será 2 y arg2 será 5, así el objeto que tenga esa magia añadirá al jugador entre 2 y 5 de daño físico.

Entonces la cosa funcional así:

Dim miObjeto as Objeto
dim propiedades(2) as propiedades

propiedades(0).tipoProp = 0 'añade dmg
propiedades(0).arg1 = 10 '+10 al daño mínimo
propiedades(0).arg2 = 20 '+20 al daño máximo

Propiedades(1).tipoProp = 1 'añade defense
propiedades(1).arg1 = 50 '+50 a la defensa
'el arg2 no es necesario

miObjeto.nombre = "Espada Corta"
miObjeto.tipo = "Espada"
miObjeto.subtipo = "dos manos"
miObjeto.magicPropsNum = 2
miObjeto.magicProps() = propieades()


Fíjate lo fácil que es añadirle propiedades mágicas a un objeto.
Y según lo que has dicho, como cada objeto tiene almacenado el número y tipo de propiedades mágicas, pues sería fácil añadirle los sufijos y prefijos para ponerle más "eyecandy" como tú dices.

Sin embargo a tu método le veo un pequeño problema: sólo se puede añadir un prefijo y un sufijo de manera que sería imposible tener un arma que sea "Great-Black-Mace-of Necromancy-of the Night".
Es decir, unir varios prefijos y sufijos.

Cita de: Hechelion en 18 de Marzo de 2011, 07:36:11 PM
2.
La mayoría de los sistemas de crafteo en estos juegos funcionan en base a recetas, es lo más simple. Cada receta asocia los materiales con el objeto final. Es simple de implementar, es el sistema más extendido entre los juegos y te aseguras que no se podrán crear objetos que no hayas diseñado.
Como tus objetos tendrán atributos mágicos, te aconsejo separar la fase de crafteo en 2, creación del arma base y luengo un proceso de encantar el arma (así lo programamos en un mundo persistente para NWN), esto te da más potencial sin necesidad de invertir en miles de recetas individuales, me explico.

Suponiendo que uses el sistema de arriba, si tienes 5 tipos bases de arma, 10 sufijos y 10 prefijos, tendrás potencialmente  5*11*11 = 605 armas diferentes, crear 605 recetas para crear cada arma es un dolor de cabeza, así que divides el problema

5 recetas para crear las 5 armas básicas. 10 recetas para agregar los prefijos y lo mismo para los sufijos, así te queda todo resumido a 25 recetas en vez de 605, por ejemplo:

10 lingotes de hierro + 10 trozos de carbón = espada.
10 sangres de conejo + 4 polvo mágico de únion = sujifo 15 "Mata conejos"

ASí, si quieres crear una espada Mata conejos, entonces necesitas 10 lingotes de hierro + 10 trozos de carbón + 10 sangres de conejo + 4 polvo mágico de únion

Sí las recetas pueden ser una buena alternativa. Quizás use este método, aunque en realidad no hay tampoco mucha diferencia de lo que yo propuse.
Con mi método tampoco hace falta crear 9999 recetas ya que no todos los objetos son crafteables. Pero eso sí, tendría que asignale a todos los ingredientes y productos finales un valor de crafteo, por ejemplo:


Iron Ingot (A1)      |
Leather Strip (A2)   |---> Dagger (A1A2A3)
Wood Stick (A3)      |


Aunque en realidad el método de crafteo que tenía pensado era más bién para cosas como pociones, comida, cristales mágicos y runas, e incluso como mucho para anillos y colgantes.



Por otro lado, también hablas de imbuir poderes mágicos a los objetos.
Eso también lo tenía pensado, pero no mediante el mismo sistema de crafteo, si no más bién mediante el uso de runas y cristales mágicos:
los cristales mágicos permiten mejorar las características "de fábrica" del objeto, mientras que las runas permiten añadir más propiedades mágicas.

Si tenemos "Daga, daño=2-3, +1% Crit hit", mejorando dicha arma con un cristal mágico podremos crear "Daga +1, daño=3-4, +2% Crit Hit".
Pero si le ponemos una runa que sea "Fiery Rune", tendremos "Daga, daño=2-3, +1crit hit, +2de daño de fuego".

El sistema se basa en probabilidades de éxito: cuanto más mejores el arma, más probabilidades hay de que falle el encantamiento. Empezando por un 100%, cada cristal mágico reduce la probabilidad de acierto en 10%, y las runas reducen la probabilidad en 15% cada vez.

Estoy pensando en añadir algún tipo de gema que aumente la probabilidad, por supuesto difícil de encontrar.

Para fabricar runas, se necesita encontrar/comprar runas en blanco y los ingredientes necesarios para fabricar la runa mágica apropiada.
Para los cristales mágicos, habrá que encontrar/comprar cristales de poder.
Una vez que los tengas, reúne los ingredientes necesarios y podrás fabricar un cristal mágico.

Por supuesto ambos objetos (runas y cristales) podrán ser encontrados matando monstruos o abriendo tesoros, así que te ahorras los ingredientes.
#2
Proyecto dx_lib32 / Juego RPG. Dudas en general
18 de Marzo de 2011, 04:10:43 PM
Es la primera vez que programo un juego RPG así que querría saber vuestras opiniones acerca de ciertos aspectos del juego, NO de la programación.

Veamos pués:

1.- El juego que estoy desarrollando usará un sistema de objetos aleatorio, de forma que existirán varias clases básicas de objetos invariables, con características fijas, pero se le añadirán aleatoriamente propiedades mágicas. Algo así como sucede con el juego de Diablo 1 o Diablo 2. No sé si lo sabréis, pero ambos juegos usan un sistema de prefijos y sufijos para los objetos, por ejemplo, prefijos podrían ser "Brutal" o "Huge" o "Necromaner's", etc... y sufijos podrían ser "of the Titans", "of the Gods", etc...
Ambos prefijos y/o sufijos se le añaden a lo que es el nombre del objeto, dando como resultado cosas como "Brutal Axe of the Titans".
La cosa es que cada prefijo/sufijo indica que ese objeto va a tener ciertas propiedades mágicas definidas por dicho prefijo/sufijo, por ejemplo, "Brutal" indica que dará +5 de fuerza, por poner un ejemplo.
la pregunta es: ¿cómo usaríais vosotros este sistema: añadiríais primero las propiedades mágicas de forma aleatoria y a continuación le pondríais el prefijo/sufijo correspondiente, o al revés, primero el prefijo/sufijo y luego las propiedades mágicas definidas por ese prefijo/sufijo?

2.- Otra cosa que estoy empezando a hacer es un sistema de "crafteo", es decir, que se podrán fabricar todo tipo de cosas usando convinaciones de elementos, algo así como en muchos MMORPGs actuales. Y la pregunta es: ¿qué método usaríais para hacer esto? De momento he hecho un método de combinaciones de valores: los objetos ingredientes todos tienen un valor de dos o más caracteres. Al combinar varios de ellos, también se concatenan sus valores, dando como resultado otro valor diferente que podría ser el del objeto a fabricar. Es decir, tengo tres ingredientes con los siguientes valores: A1, A2 y A3. Al combinarlos darían A1A2A3, y el objeto a fabricar tiene dicho valor, por lo tanto la combinación de ingredientes es correcta.
#3
Proyecto dx_lib32 / Re: Acerca de valores ¿hexadecimales?
18 de Marzo de 2011, 03:54:19 PM
Cita de: Hechelion en 17 de Marzo de 2011, 06:55:54 PM
Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.
Pero el mapa solo se graba una vez, y 90000 concatenaciones (300*300) no deberían tomarte tanto tiempo, el editor que yo creé, también lo hice en VB6, es multicapa y también guarda la información en archivos de textos planos y no se traba como el tuyo.
10 layer de 256*128 = 327.680 concatenaciones y en mi equipo guardar el mapa no le toma ni 30 segundos.

Si 327.680 concatenaciones no demoran ni medio minuto y tu programa se traba con 90.0000 es porque hay algo mal.

No se traba, simplemente tarda un siglo en terminar todas las iteraciones, y no es que lo hiciese una sola vez, si no que lo tendría que hacer cada vez que quisiera mostrar una previsualización ASCII del mapa, así que imagínate...

Cita de: Hechelion en 17 de Marzo de 2011, 06:55:54 PM
Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
En fin, cada cual sabe donde le aprieta el zapatito, si vas a trabajar con valores NUMÉRICOS (no sirve sobre cadenas) puedes usar los operadores lógicos para separar un bit o un grupo de bit (operas directo en binario).
Bit1 = (valor AND &H1)  /  1
Bit2 = (valor AND &H2)  /  2
Bit3 = (valor AND &H4)  /  4

Byte1 = (Valor AND &HF) / 1
Byte2 = (Valor AND &HF0) / &H10

Por lo tanto, (valor AND &H1) / 1 daría como resultado el primer bit de la cadena, no?
Si, el primero, te sirve para cualquier valor numérico, sea decimal o hexadecimal.

PD: recuerda que el primer bit es el de la derecha.

Entonces para el siguiente ejemplo:

miCadena = "123abc"
aux = (miCadena And &H1) / 1

la variable aux tendría el valor "c" o daría error, ya que el primer bit es un valor tipo string?

Gracias por la ayuda y perdona las molestias.
#4
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
18 de Marzo de 2011, 03:50:12 PM
Cita de: [EX3] en 17 de Marzo de 2011, 06:30:39 PM
Cita de: El_Chavo en 17 de Marzo de 2011, 05:11:17 PM
He hecho el bucle con una simple suma (aux = i +j) y apenas invierte un segundo, por lo que la causa de la lentitud está claro que es por las operaciones de concatenación.
Pero solo por curiosidad, has probado el codigo que he puesto antes? Es solo por saber que tiempos te devuelve y comparar con las tostadoras de aquí del banco.

Sin insistir mas con lo de las cadenas (tampoco quiero ponerme pesado con esto), exactamente que configuración de maquina/hardware tienes? Es que me extraña que con la basura de PC's que tenemos aquí en mi departamento, que ya es un milagro que puedan ejecutar Visual Studio 2005 sin tostarse, mis pruebas de texto con VB6.0 hayan ido como la seda y a ti te vayan mal, es un caso como poco excepcional y raro, es que hasta en mi netbook va considerablemente bien :-/

Salu2...

Intentaré con tu código a ver qué resultados obtengo.

Mi ordenador es un AMD no_me_acuerdo_qué a 2.5 GHz, 1Gb de RAM, corriendo con WindowsXP y un HDD Seagate de 80Gb a 7200rpm (es que ya no me acuerto xD ).
En realidad me lo monté yo el ordenador en el 2004 y todo era nuevo salvo el HDD que lo reciclé de otro ordenador antiguo que tenía.
Pero ya te digo, me funciona perfectamente, incluso puedo jugar juegos mas o menos actuales.
Como ya he comentado, no tengo ningún proceso que me esté dando la lata de fondo, no si quiera tengo antivirus (realmente no lo necesito).

Y no te preocupes por lo de ponerse pesado, agradezco cualquier comentario :-)
#5
Proyecto dx_lib32 / Re: Acerca de valores ¿hexadecimales?
17 de Marzo de 2011, 05:35:59 PM
Cita de: Vicente en 17 de Marzo de 2011, 04:53:59 PM
Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.

Esto hasta que no lo pruebes no lo sabras. De todas formas es para generar el mundo, no pasa nada si tarda un poco...
[/quote]

Ya lo he provado y va demasiado lento.
Pero ya lo he solucionado con la solución de EX3
#6
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
17 de Marzo de 2011, 05:11:17 PM
No tengo ningún proceso en segundo plano que esté ocupado con el procesador, ni ninguna otra operación en el bucle más que la de concatenación.

He hecho el bucle con una simple suma (aux = i +j) y apenas invierte un segundo, por lo que la causa de la lentitud está claro que es por las operaciones de concatenación.

Pero da igual, al final he aplicado tu otra solución (guardar los datos en formato binario) y así me ahorro tener que tirar líneas de código adicionales.

La previsualización tampoco es tan importante. En realidad, incluso prescindible.

De todas maneras, gracias por los consejos.
#7
Proyecto dx_lib32 / Re: Acerca de valores ¿hexadecimales?
17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.

Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
En fin, cada cual sabe donde le aprieta el zapatito, si vas a trabajar con valores NUMÉRICOS (no sirve sobre cadenas) puedes usar los operadores lógicos para separar un bit o un grupo de bit (operas directo en binario).
Bit1 = (valor AND &H1)  /  1
Bit2 = (valor AND &H2)  /  2
Bit3 = (valor AND &H4)  /  4

Byte1 = (Valor AND &HF) / 1
Byte2 = (Valor AND &HF0) / &H10

Por lo tanto, (valor AND &H1) / 1 daría como resultado el primer bit de la cadena, no?
#8
Proyecto dx_lib32 / Re: Acerca de valores ¿hexadecimales?
16 de Marzo de 2011, 08:02:10 PM
Cita de: Vicente en 15 de Marzo de 2011, 07:25:01 PM
Un generador de numeros aleatorios con la misma semilla siempre genera las mismas cosas aleatorias.

Esas semillas se usaran modificadas, enteras o troceadas como cadenas de bits para inicializar generadores aleatorios de numeros que se usan para construir el juego (por ejemplo en un Dungeon numero de mazmorras, habitaciones, niveles de los bichos,...). Por ejemplo para las habitaciones los primeros 4 bits, para los monstruos los 4 siguientes, etc etc.

Buenas.

Gracias por la info, aunque ya me imaginaba que dichos números eran semillas aleatorias.
La pregunta en realidad es que cómo puedo hacer en Visual Basic para obtener la información de una cadena similar a esas, pudiendo leerla bit a bit o algo similar. Es decir, sin usar split(), ni mid() ni funciones similares de manejo de cadenas alfanuméricas.

Por ejemplo, algo así como

aux = bit(2, cadenaPrueba)

En lo cual se almacena en aux los datos existentes en el bit 2 de la memoria referenciada por cadenaPrueba.

Un saludo.
#9
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
16 de Marzo de 2011, 04:54:06 PM
Cita de: Mars Attacks en 15 de Marzo de 2011, 11:03:13 PM
Siempre puedes exportar en texto plano y añadir a tu workflow un paso intermedio de conversión de texto plano a binario (e incluso exportar inicialmente a ambos pero mantener un programa conversor en el registro de windows para usarlo con el botón derecho sobre la extensión que elijas, o alguna cosa por el estilo). Así te quedas con lo mejor de los dos mundos :)

Depende de la intensidad de uso que le des, te puede salir a cuento invertir el tiempo en esta herramienta.

El problema reside en la lentitud de Visual Basic a la hora de concatenar cadenas alfanuméricas.
Con matrices de pocos elementos (menos de 100), apenas se nota mucho, pero con 200 o más elementos, ya sí se nota.
De todas manera, implementaré un sistema para buscar y reemplazar dentro del propio editor, cosa que no veo para nada difícil, aunque lo dejaré para el final ya que es algo accesorio.

Gracias por tu feedback :-)
#10
Proyecto dx_lib32 / Acerca de valores ¿hexadecimales?
15 de Marzo de 2011, 06:56:32 PM
Buenas.

Quería preguntar una cosa que siempre me ha tenido intrigado:

en algunos juegos, sobretodo juegos de rol, el jugador puede conseguir objetos con cualidades mágicas y nombres aleatorios.
Generar nombres aleatorios y añadirle cualidades mágicas correspondientes no me parece difícil, sim embargo me he fijado que dichos juegos usan una especie de valor hexadecimal o algo parecido para almacenar la información de las propiedades y características del objeto en cuestión.
También utilizan dichos valores numéricos para otras cosas que tienen algo de aleatoriedad, así, por ejemplo, en un juego llamado "Dungeon Hack", se puede general el mapa de forma aleatoria, parametrizando valores como dificultad de monstruos, número de trampas, cantidad de objetos-tesoro, etc... En este juego, puedes ver la "semilla aleatoria" del nivel que se va a generar, y es algo así como "8756g12hg546ahjh", con números y letras.

La pregunta es: ¿cómo narices puedo usar un método similar para almacenar características aleatorias de los objetos, o qué explicación lógica tienen dichos valores hexadecimales o alfanuméricos? Por que me imagino que no serán cadenas de texto que el engine las vaya dividiendo en partes, como hago yo con cada una de las celdas del mapa de juego.

Lo pregunto por que hasta el momento lo que tengo que hacer es una serie de Select Cases, que en principio no es muy largo, pero que cuando empiece a añadirle al juego nuevas posible scaracterísticas a los objetos, puede convertirse en una lista considerable de Cases.
#11
Proyecto dx_lib32 / Re: gestión de los recursos
14 de Marzo de 2011, 05:04:38 PM
Cita de: [EX3] en 13 de Marzo de 2011, 09:40:10 PM
En cuanto declares una variable esta ya ocupa espacio le asignes valor o no, un integer por ejemplo siempre ocupara sus 2 Bytes en memoria este a cero o no. Los objetos es distinto por que son referencias a clases y objetos instanciados en memoria, no simples valores, de ahi que se tengan que liberar su referencia para destruir los recursos que ese objeto este usando (no es lo mismo un valor que una clase instanciada en memoria que puede tener mas variables y codigo ejecutandose).

Lo unico que os puede servir de algo es con arrays dinamicos el hacer un Erase <nombreArray>. La instruccion Erase destruira todo el contenido del array dejando el array completamente vacio, sin elementos, solo la declaracion del array para seguir usandolo. Si el array es estatico sencillamente dejara todos los elementos al valor por defecto del tipo de dato: integer = 0, string = "", object o cualquier tipo clase = Nothing.

Cita de: El_Chavo en 13 de Marzo de 2011, 05:00:08 PM
Más que nada lo pregunto por que tengo una matriz de udts (se trata del inventario de mi juego RPG) y cuando el jugador empieza otra partida después de la primera, tengo que usar un bucle para poner todos los elementos a cero.
Salvo que tu array sea estatico, que ahi te serviria la instruccion Erase, haz un Redim <array>(<numero_elementos>). Al hacer un Redim sin la clausula Preserve tu array tendra todos sus elementos sin inicializar, como si fueran nuevos. De esta forma te evitas tener que recorrer con un bucle el array asignando valores.

Salu2...

Vaya, es cierto, no sé cómo no se me ocurrió antes :-P
Gracias.
Un saludo.
#12
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
14 de Marzo de 2011, 05:02:59 PM
Y he solucionado el problema, aunque con otro algoritmo similar, no esxactamente con el código que has puesto arriba.

Gracias por la ayuda.
#13
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
13 de Marzo de 2011, 09:57:19 PM
Cita de: [EX3] en 13 de Marzo de 2011, 09:30:45 PM
Cita de: El_Chavo en 13 de Marzo de 2011, 04:53:48 PM
No es el salto de línea la causa, si no la concatenación de caracteres.

He googleado un poco acerca del tema (concretamente he buscado visual basic slow concatenation) y parece ser que efectivamente VB es muy lento a la hora de realizar operaciones de concatenación.
Si lento es, mas que en otros lenguajes, pero lento en la mayoria de las funciones que se pueden realizar en este lenguaje xD No se, ya te digo que yo en el trabajo no sufrimos en los programas de Visual Basic 6.0 y macros de VBA problemas de ralentizacion tan severos por la concatenacion de caracteres en cadenas (componiendo archivos linea a linea y cada linea a base de distintas variables) y nuestros archivos son a veces de mas de un megabyte en algun caso (obviamente tardamos mil veces menos en Visual Basic .NET con el objeto StringBuilder pero no hay nada similar en Visual Basic 6.0 :P)

He visto por algún lado, no sé si en vbextreme o bigresource o en algún sitio parecido, alguien que escribió una función para vb6 que mejoraba considerablemente la concatenación de caracteres.
Según he visto, lo que hacía era crear espacios en memoria para concatenar las cadenas, pero lo que hacía era mover bits de unas direcciones de memoria a otras, y por lo que parece en VB es más rápido eso que hacer "a" & "b". :-P

Cita de: [EX3] en 13 de Marzo de 2011, 09:30:45 PM
Cita de: El_Chavo en 13 de Marzo de 2011, 04:53:48 PM
Lo único malo de usar un formato binario es que no es posible editar el mapa con un editor de texto plano.
Por ejemplo, si quiero solamente cambiar un 1 por un 2 en una celda en concreto, voy a tener que abrir el mapa con el editor a narices, en vez de simplemente abrirlo con el notepad y editarlo rápidamente. Vamos, que es un pequeño inconveniente que tampoco es muy importante.
Ya, pero no se, teniendo el editor no veo "util" ni productivo tener que andar buscando donde se encuentra la informacion exacta de la celda que quieres modificar. No se tu, teniendo ya el editor que te es mas facil para cambiar 4 celdas, usar el editor que ves visualmente lo que quieres editar o ponerte a buscarlo en el bloc de notas? ;) Pero igualmente estoy deacuerdo en lo de tenerlo legible. Yo en .NET por ejemplo usamos XML para tenerlo legible por si necesitamos meterle mano rapidamente (aunque es mas facil navegar y editar un arbol de nodos en XML que una estructura en texto plano).

Pero si lo que quiero es cambiar todas las celdas que sean "1073" por "0141", con el bloc de notas lo tengo fácil.
También podría currarme una sencilla función para hacer esto, pero es que tampoco me quiero centrar mucho en el editor ya que el juego apenas lo tengo empezado. Con las funciones básicas de mapeo me sería suficiente. Más adelante cuando el juego esté terminado pues ya sí que podría meterle mano al editor para hacerlo más potente.

Cita de: [EX3] en 13 de Marzo de 2011, 09:30:45 PM
Pues deberia ser exactamente el mismo codigo que uses en el juego para mostrar la region visible del mapa la que uses en el editor. En tu caso, que trabajas con un array unidimensional, podrias trabajar cada tile como una unidad (para trabajar como si fuera un mapa de bits), por lo que si quisieras visualizar los tiles comprendidos desde el tile de la posicion x33 y44 y una region de 16 tiles de alto por 32 de ancho tu lectura, en un array unidimensional, seria algo asi:
Const mapWidth As Long = 256 ' Ancho del mapa completo.
Const mapHeight As Long = 256 ' Alto del mapa completo.

Dim map() As CellType ' Celdas del mapa.

' Posicion a leer:
Dim x As Long: x = 33
Dim y As Long: y = 44

' Dimensiones del area a leer:
Dim width As Long: width = 32
Dim height As Long: height = 16

Dim firstTile As Long: firstTile = x + (width * y) ' Primer tile a leer.
Dim lastTile As Long: lastTile = firstTile + (width * height) ' Ultimo tile a leer.

' Leemos solo los tiles dentro del area definida desde la posicion indicada:
Dim i As Long
For i = firstTile To lastTile
    drawTile(map(i))
Next


Este codigo te deberia servir igual para el editor que para la representación en pantalla en el juego. Lo unico sera, que imagino que es a lo que te referias, es que en el juego, la posicion de lectura la tendras que derivar de la posicion del jugador, que supongo estara centrado en la vista del mapa, sencillamente tendrias que restar a la posicion de lectura del mapa la mitad de la anchura y altura del area a leer:
' Posicion a leer en referencia al jugador:
Dim x As Long: x = jugador.x - (mapWidth / 2)
Dim y As Long: y = jugador.y - (mapHeight / 2)

Con esto deberia quedar tu jugador centrado siempre en la vista del mapa.

Salu2...

No, pero es que del editor al juego hay una gran diferencia en cuanto a la presentación del juego.
En el juego, el jugador no está siempre centrado en el medio de la visualización, si no que se mueve libremente y cuando alcanza el borde de la ventana de juego, se desplaza el mapa para mostrar la parte correspondiente.
Es decir, la vista del mapa sólo se desplaza cuando el jugador alcanza el borde.

Sin embargo en el editor, también quiero que se muestre una parte del mapa correspondiente a unas dimensiones de 44x44 celdas.
El problema es que no tengo un punto de referencia como en el caso del juego, que sería la posición actual del jugador, si no que tengo dos scrollbars, horizontal y vertical.
Ambas scrollbars tienen un valor máximo de mapWidth/8 y mapHeight/8 y uno mínimo de cero.
El movimiento de las scrollbars desplaza la visualización del mapa una sola casilla o celda, y haciendo AvPag o RePag, mueve 8 casillas en vez de una.
Yo había hecho algo así:


for i = 0 + HorizontalScrollbar*8 to 44 + horizontalScrollbar*8
    'y ahora para columnas
   if i > 44 then i = 44 'no quiero que se dibujen más de 44 casillas horizontales
    for j = 0 + verticalscrollbar*8 to 44 + horizontalscrollbar*8
        if j > 44 then j = 44 'lo mismo que con i
        'código para dibujar casillas en la posición (i , j)
    next j
next i


Pero no funciona como desearía....
#14
Proyecto dx_lib32 / Re: gestión de los recursos
13 de Marzo de 2011, 05:00:08 PM
me viene como anillo al dedo este tema.

quería preguntar algo parecido a esto y es que si con visual basic se puede liberar memoria de alguna manera, para las variables, es decir, si yo creo una variable de tipo integer, si existe alguna manera de romper el vínculo de dicha variable con la dirección de memoria que usa y vaciar dicha memoria de los datos.

Sé que para objetos se puede hacer Set Objeto = Nothing, pero para variables no funciona.
Más que nada lo pregunto por que tengo una matriz de udts (se trata del inventario de mi juego RPG) y cuando el jugador empieza otra partida después de la primera, tengo que usar un bucle para poner todos los elementos a cero.
#15
Proyecto dx_lib32 / Re: Opinion de nuevo formato de mapas
13 de Marzo de 2011, 04:53:48 PM
Cita de: [EX3] en 12 de Marzo de 2011, 09:42:02 PM
Me extraña que el salto de linea sea la causa de que te vaya mas lento el bucle cuando en mi trabajo generamos y trabajamos con archivos de texto mucho mas grandes que lo que estas generando con ese codigo y tardamos escasos segundos. Algun otro proceso en tu codigo que estas ejecutando tiene que ser la causa pero agregar un salto de linea desde luego no.

No es el salto de línea la causa, si no la concatenación de caracteres.

He googleado un poco acerca del tema (concretamente he buscado visual basic slow concatenation) y parece ser que efectivamente VB es muy lento a la hora de realizar operaciones de concatenación.

Cita de: [EX3] en 12 de Marzo de 2011, 09:42:02 PM
Por otro lado, si estas usando un editor para generar los mapas significa que no te hace falta tener un formato "legible" a la vista (para que si usas el editor). Podrias entonces hacer algo tan sencillo como volcar toda la estructura que contiene el nivel y sus elementos en un archivo en formato binario y despues volver a cargarlo tal cual en memoria. No tengo Visual Basic 6.0 instalado en mi maquina pero el codigo deberia ser algo asi:

Para guardar los datos:
Dim map() as CellType ' Tu array para el mapa.
' Llenas los datos en la estructura...

Dim file As Integer: file = FreeFile()
Open "archivo.dat" For Binary Access Read As #file
    Put #file, , map ' Volcamos todo el contenido del array al archivo.
Close #file


Para cargar los datos:
Dim map() as CellType ' Tu array para el mapa.

Dim file As Integer: file = FreeFile()
Open "archivo.dat" For Binary Access Read As #file
    Get #file, , map ' Leemos y volcamos todo el contenido del archivo al array.
Close #file

Años atras tenia algo similar a lo que estas haciendo tu pero con estructuras de multiples niveles de informacion (como un arbol de nodos) y recurria a este sistema para almacenarlo de forma rapida y precisa (es como un volcado directo de memoria a disco) y lo mas parecido a serializacion binaria que existe en Visual Basic 6.0.

Salu2...

Ya sé como guardar datos en forma binaria.

De hecho he provado de esa manera y ya funciona bién. Gracias por refrescarme la memoria. :-)

Lo único malo de usar un formato binario es que no es posible editar el mapa con un editor de texto plano.
Por ejemplo, si quiero solamente cambiar un 1 por un 2 en una celda en concreto, voy a tener que abrir el mapa con el editor a narices, en vez de simplemente abrirlo con el notepad y editarlo rápidamente. Vamos, que es un pequeño inconveniente que tampoco es muy importante.



Y ya para acabar, una última duda:

como bién habéis leído, el mapa del mundo tendrá una dimensión de celdas de 300x300 o más.
La cosa es que en el editor, para dibujar el mapa, uso un picturebox, el cual puedes desplazar usando dos scrollbars, una vertical y otra horizontal.
Cada vez que muevo las scrollbars, el picturebox se actualiza mostrando la parte correspondiente del mapa.
Sin embargo no me acuerdo cuál es el algoritmo para que se muestre solamente el trozo de mapa que tiene que ser, en vez de que carge todo el mapa entero.


Durante el juego para mostrar las casillas que están a 10 celdas de distancia del jugador, solo tengo que sumar y restar desde la posición del jugador, pero en el editor la cosa es distinta.

No se si me he explicado bién lo que quiero decir.

un saludo y gracias.





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.