GS-Zone

Sistema de Areas Ir al Indice

Moderadores: Moderadores de Argentum, Especialistas de Argentum, Especialistas de Programación

40

Nota » 06 Feb 2012 22:10

@Ema, Miqueas : de esa forma si matas un npc con /MATA o borras 1 objeto con /DEST podes hacer reventar todo a la meirda.

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
806
Dragon Ancestral [1]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2305
Aportes: 109

Nota » 07 Feb 2012 17:24

maTih.- escribió:@Ema, Miqueas : de esa forma si matas un npc con /MATA o borras 1 objeto con /DEST podes hacer reventar todo a la meirda.


No vas a borrar un arbol, la funte de ulla, un cacho de piedra ,ect

Imagen
Ninja en progreso
929 (+5)
Dragon Ancestral [5]
Registrado: Años de membresía
Ubicación: • olivos •
Mensajes: 4103
Aportes: 13

Nota » 07 Feb 2012 18:28

Pudiste solucionarlo al final? Si tienes alguna duda posteala, es algo complejo el quadtree, pero cuando lo entiendes es muy facil y simple.

maTih.- escribió:
Shalvaid escribió:Bueno gracias a todos por sus respuestas. El sistema es tal cual como lo describe Pato, está hardcodeado y se complica entenderlo.
Seguí la idea que me dió Parra, empecé a buscar un poco acerca de los QuadTrees y se me ocurrió hacer algo asi:

[ Imagen ]

Como se puede ver, me quedarían 16 secciones (Hojas), divididas al ancho necesario, pongamos como ejemplo para un fullscreen.
(800 / 32) = 25 Tiles que sería la cantidad que entraría en una "hoja" del "arbol".
(600 / 32 = 19 Tiles, me estarían sobrando un par :p, pero bueno.

Mediante una ecuación, ubicar en que hoja se encuentra el usuario, y darle su ID de hoja. Cada vez que camina se fija si llega a la intersección marcada en líneas verdes, allí cambia la ID y reenvia la informacion del sector.

Como el CheckUpdateNeededUser solo checkea 3 cosas, Usuarios, Npc's y Objetos. Podría hacer algo así

  1.  
  2. Public Type QuadTree
  3.          MaxUsers as integer
  4.          UserIndeX(1 to 100) as integer
  5. ---------------------------------------------
  6.          MaxItems as integer
  7.          Item(1 to 100) as QTObject (Este tipo tendría el ObjIndex, posicion X y posición Y del mapa)
  8. ---------------------------------------------
  9.          MaxNpcs as integer
  10.          Npcs(1 to 100) as QTNpc (Este tipo tendría el NpcIndex, posición X y posicion Y del mapa)
  11. end type


Se crearía una variable de este tipo, para cada "hoja". Y cuando un usuario accede a esa área, le envía solo la información que tiene almacenada previamente por los "MaxUsers", "MaxItems", "MaxNpcs", solo lo justo y necesario y nos ahorramos el loop por todas las coordenadas de esa área buscando a ver que hay.

Lo que si habría que hacer es cada vez que un usuario Tira un objeto, entra al mapa, o un npc se crea o se mueve, actualizarlo a su debido QuadTree.

Bueno, eso es todo, veremos que opinan.
Gracias a todos.

Edit: Pensandolo bien, en un rango de 25 tiles por 25 tiles tengo un total de 625 tiles, tendría que ver como manejar eso, para no tener que andar haciendo Redim Preserve al array cada vez que se agrega un user, un npc, un objeto, etc. -.- . Y 100 es muy poco.


eso mas que un quadtree es una negrada, maneja un array grande para cada tipo (npcs, usuarios, objetos), no uses redim, simplemente para añadir un tipo (npcs , usuarios, objetos) te fijas si entra , si no , mediante una funcion buscas un slot libre para el array y lo metes todo ahí, suponete

  1. Function buscarNpc(byval NPCindex as integeR) as byte
  2.  
  3. 'Devuelve la posición para el array de npcs.
  4.  
  5. dim j as long
  6.  
  7. for j = 1 to ubound(arrayNPCS())
  8.  if arraynpcs(j).npcindex = NPCINDEX then
  9.     buscarnpc = j
  10.     exit function
  11.  end if
  12. next j
  13.  
  14. end function


despues igualas si eso es > 0 entonces esta en el array, y actualizas las posiciones etc etc.

Pero con eso que ganas? Es practicamente lo mismo...
Este mensaje ha obtenido 10 Monedas de Oro.


Vicinity of obscenity
525
Legendario Inmortal [2]
Registrado: 5 Años de membresía!
Ubicación: España
Mensajes: 5580
Aportes: 50
Premios: 3
Mister Programador FreeForAll (3)

Nota » 07 Feb 2012 23:45

Bueno Parra, realmente los QuadTrees son bastante complejos, estuve leyendo y viendo ejemplos pero no es nada fácil y creo haber visto solo uno hecho en visual basic que era "similar" pero de igual forma complejo. Creo que no es mi tiempo para implementar QuadTrees, aún me falta bastante por aprender y es una técnica utilizada por gente mucho más experimentada que yo en lo que es creacion de engines. No digo que no sea capas, es que dadas las circunstancias actuales, lo veo bastante dificil poder programar dicho sistema y que sea funcional y libre de bugs.
El problema no lo he podido solucionar aún, sigo con las áreas normales que tiene argentum, que por cierto, son incompatibles con una pantalla de 800x600. Estuve descargando otros engines en visual basic, así que voy a ponerme a ver por encima de qué forma trabajan para tener una idea.

Yo por mi parte, agradesco tu ayuda. Siempre estás ahí para ayudar a quien tenga algun problema.
No es un NO definitivo para los QuadTrees, simplemente voy a dejarlos para el futuro cuando tenga algo más de experiencia y práctica en engines y por supuesto en c++.
Te dejo 10 monedas por tu gran ayuda, ultimamente la gente anda escatimándolas no sé por qué.

Ah y suerte en AOC ;)
Usuario Registrado
166
Aprendiz [1]
Registrado: Años de membresía
Mensajes: 241

Nota » 08 Feb 2012 01:40

Te soy sincero, yo todavía no entendí como hacer un quadtree, no me puse a probar tampoco pero por ahora la teoría no la entiendo xD! jajaja capaz en la práctica y haciéndolo lo voy comprendiendo pero sí es bastante complicado xd.

Hay maneras mas fáciles de optimizar las áeras, yo que vos no me perocuparía tanto xD
All we need is love
480
Oraculo [5]
Registrado: Años de membresíaAños de membresía
Ubicación: Mar del Plata
Mensajes: 2003
Aportes: 30
Premios: 1
Mister Programador AO (1)

Nota » 08 Feb 2012 12:46

Shalvaid escribió:Bueno Parra, realmente los QuadTrees son bastante complejos, estuve leyendo y viendo ejemplos pero no es nada fácil y creo haber visto solo uno hecho en visual basic que era "similar" pero de igual forma complejo. Creo que no es mi tiempo para implementar QuadTrees, aún me falta bastante por aprender y es una técnica utilizada por gente mucho más experimentada que yo en lo que es creacion de engines. No digo que no sea capas, es que dadas las circunstancias actuales, lo veo bastante dificil poder programar dicho sistema y que sea funcional y libre de bugs.
El problema no lo he podido solucionar aún, sigo con las áreas normales que tiene argentum, que por cierto, son incompatibles con una pantalla de 800x600. Estuve descargando otros engines en visual basic, así que voy a ponerme a ver por encima de qué forma trabajan para tener una idea.

Yo por mi parte, agradesco tu ayuda. Siempre estás ahí para ayudar a quien tenga algun problema.
No es un NO definitivo para los QuadTrees, simplemente voy a dejarlos para el futuro cuando tenga algo más de experiencia y práctica en engines y por supuesto en c++.
Te dejo 10 monedas por tu gran ayuda, ultimamente la gente anda escatimándolas no sé por qué.

Ah y suerte en AOC ;)

Haciendoles un par de cambios puedes hacer que sean compatibles las áreas con pantalla completa.

El quadtree, la verdad es para rizar el rizo, si mantienes las areas actuales, arreglandolas un poco.. no creo que tengas problemas.

Para que te hagas una idea, y por si te sirve en el futuro.. o a alguien que esté interesado.

En un módulo cualquiera (puedes crear una clase a parte, es lo que haria yo, así le implementas dentro todas las operaciones para trabajar con vectores):
  1. public type Vector2f
  2.     x as double
  3.     y as double ' si quieres usa float, no problem (creo q era single en vb)
  4. end type
  5.  


Ahora, creas una clase que se llame QuadTreeNode:
  1. private bounds(2) as Vector2f
  2. private center as Vector2f
  3. private nodetype as integer ' byte si quieres, aunque tampoco importa mucho
  4. private depth as integer ' lo mismo q arriba
  5. private child(4) as QuadTreeNode ' aqui guardaremos la referencia a los nodos hijos
  6. private entities as collection ' esto realmente es una lista, para guardar npcs, objetos.. cualquier cosa, puedes utilizar un array de tamaño fijo tambien
  7. private entitysize as integer
  8.  
  9. ' Aqui, un par de funciones basicas, el constructor, destructor.., manejo de los entities actuales, geters y seters (para obtener profundidad, entities, el numero de entities q tienes en ese nodo, el tamaño y centro.., tipo de nodo..)
  10.  


Luego lo demás, crear un módulo que se llame QuadTree e implemente todo para manejarte con todos los nodos.

Para poder entender mejor el quadtree, primero has de entender como funciona la recursión. La recursión es llamar a un método, desde dentro del propio método.. o tener estructuras dentro de estructuras (así es como funciona realmente el quadtree, los hijos apuntan a la misma estructura o en este caso clase, de ese modo, es posible ramificarlo con la profundidad que querramos). Aquí tienes una imágen para que te lo puedas imaginar (lo de un pixel no le hagas caso, eso es relativo):
Imagen


Si te fijás los nodos en negro se corresponden a las subdivisiones. Por ejemplo, en el segundo nivel, el cuarto nodo está en negro, y como está en la profundidad 2, al dividir todo en cuatro partes, la de abajo a la izquierda, está completamente en negra. En cambio en profundidad 4, el nodo que está en negro (el penultimo de izquierda a derecha), equivale al cuadrado de abajo a la derecha.

Si te fijas, es similar a las áreas, solo que el tamaño de cada area puede ser variable, y éste se ramifica de cuatro en cuatro. Además, si le añades una lista con los entities, puedes unificar tanto áreas como mapdata en una sola estructura. Por eso es muchisimo mejor el quadtree.
Última edición por •Parra el 08 Feb 2012 12:55, editado 3 veces en total

Vicinity of obscenity
525
Legendario Inmortal [2]
Registrado: 5 Años de membresía!
Ubicación: España
Mensajes: 5580
Aportes: 50
Premios: 3
Mister Programador FreeForAll (3)

Nota » 08 Feb 2012 13:19

Fuera del tema de parra que me parece espectacular pero no logro cazarlo, para mejorar las areas, se me ocurre usar el cliente y su memoria.

No hablo de cargar todo el mapa cuando pasas, ya que si pasas y volves al anterior, mandaste datos sin usarlo.
Pero lo que podes hacer es, si pasas por el centro de ulla y tenes ciertos objetos estaticos, los almacenas. AL pasar la proxima vez, no vas a pedirle los datos de objetos que ya vistes, por lo tanto el paquete va a ser mucho menor.

Lo mejor si queres seria tener un gran array de mapas y posiciones.

type mapa
x as integer
y as integer
grhindex as integer
block as byte
objname as string
end type

public VMapa[1 to maxmapas] as mapa


cuando llegan los datos se los asignas a ese vector, y que el engine dibuje el vector en vez de trabajar con el paquete. El ultimo punto no estoy seguro si se cumple, pero lo demás es la optimizacion que podrías hacerle.
Aguante River Plate ! ! !
909
Moderador
Registrado: Años de membresíaAños de membresíaAños de membresía
Ubicación: Villa adelina, Vicente Lopez.
Mensajes: 14428
Aportes: 305
Premios: 10
Señor Moderador (3) Señor Reglamento (1) Aportes (2) Embajador (3) Detector de Bugs (1)

Nota » 08 Feb 2012 15:01

Franeg95 escribió:Fuera del tema de parra que me parece espectacular pero no logro cazarlo, para mejorar las areas, se me ocurre usar el cliente y su memoria.

No hablo de cargar todo el mapa cuando pasas, ya que si pasas y volves al anterior, mandaste datos sin usarlo.
Pero lo que podes hacer es, si pasas por el centro de ulla y tenes ciertos objetos estaticos, los almacenas. AL pasar la proxima vez, no vas a pedirle los datos de objetos que ya vistes, por lo tanto el paquete va a ser mucho menor.

Lo mejor si queres seria tener un gran array de mapas y posiciones.

type mapa
x as integer
y as integer
grhindex as integer
block as byte
objname as string
end type

public VMapa[1 to maxmapas] as mapa


cuando llegan los datos se los asignas a ese vector, y que el engine dibuje el vector en vez de trabajar con el paquete. El ultimo punto no estoy seguro si se cumple, pero lo demás es la optimizacion que podrías hacerle.

Te refieres a usar un caché? Los caches funcionan bien, pero no es la solución. De todos modos, no entiendo como el metodo que has propuesto va a optimizar. Estás guardando una estructura por mapa, como puedes guardar varios objetos por ejemplo de ese modo? Solo podrás guardar uno por mapa..

Vicinity of obscenity
525
Legendario Inmortal [2]
Registrado: 5 Años de membresía!
Ubicación: España
Mensajes: 5580
Aportes: 50
Premios: 3
Mister Programador FreeForAll (3)

Nota » 08 Feb 2012 20:19

parra la idea q tire yo no esta tan lejos de la realidad eh y lo q dijo fran tampoco.

yo decia algo como esto (ya q estamos tirando codigos)

  1. const maxtilesMapa as integer = 400
  2.  
  3. type tipos
  4.        pos as worldpos
  5.        index as integer
  6. end type
  7.  
  8. type datos
  9.       usuarios(1 to maxtilesMapa) as tipos
  10.       objetos(1 to maxtilesMapa)  as tipos
  11.       npcs(1 to maxtilesMapa)      as tipos  
  12.       contadornpcs                     as integer
  13.       contadorusuarios                as integer
  14.       contadorobjetos                 as integer
  15. end type
  16.  
  17. public mapdatos(1 to nummaps) as datos
  18.  
  19.  


despues es simple, para meter un usuario por ejemplo

  1. sub meterusuario(byval userindex as integer)
  2.  
  3. dim nuevoIndice as integer
  4.  
  5. with userlist(userindex).pos
  6.        nuevoindice = indiceparausuario(.map)
  7.        userlist(userindex).infoarea = nuevoindice
  8.        mapdatos(.map).usuarios(nuevoindice).index = userindex
  9.        mapdatos(.map).usuarios(nuevoindice).pos.map = .map
  10.        mapdatos(.map).usuarios(nuevoindice).pos.x = .x
  11.        mapdatos(.map).usuarios(nuevoindice).pos.y = .y
  12. end with
  13.  
  14. end sub
  15.  
  16. sub borrarusuario(byval userindex as integer)
  17.  
  18.    dim map as integer
  19.    dim indice as integer
  20.    map = userlist(userindex).pos.map
  21.    indice = userlist(userindex).infoareas 'esto seria una variable para guardar su indice
  22.  
  23.    with mapdatos(map).usuarios(indice)
  24.           .index = 0
  25.           .pos.map = 0
  26.           .pos.x = 0
  27.           .pos.y = 0
  28.    end with
  29.  
  30. end sub
  31.  
  32. function indiceparausuario(byval mapa as integeR) as integer
  33.  
  34.      with mapdatos(mapa)
  35.      
  36.       if .contadorusuarios < maxtilesmapa then
  37.          .contadorusuarios = .contadorusuarios + 1
  38.          indiceparausuario = .contadorusuarios
  39.          exit function
  40.       end if
  41.      
  42.      'si estamos ak es por q el contador se lleno y necesitamos 1 slot.
  43.      dim loopx as long
  44.      
  45.        for loopx = 1 to .contadorusuarios
  46.        
  47.            if .usuarios(loopx).index = 0 then exit for
  48.        
  49.         next loopx
  50.      
  51.        if loopx < maxtilesmapa then indiceparausuario = loopx
  52.  
  53.       end with
  54.  
  55. end function


despues , para enviar los chars del area SOLO recorres el array este.

  1. sub enviarAreas(byval userindex as integer)
  2.  
  3.   dim map as integer
  4.   dim loopx as long
  5.  
  6.   map = userlist(userindeX).pos.map
  7.  
  8.   with mapdatos(map)
  9.        
  10.         for loopx = 1 to ubound(.usuarios())
  11.              
  12.             'enviar usuarios
  13.             if .usuarios(loopx).index > 0 and .usuarios(loopx).index <> userindex then
  14.                if estapcarea(.usuarios(loopx).index, userindex) then
  15.                   writecharactercreate blabal
  16.                end if
  17.            end if
  18.  
  19.         next loopx
  20.  
  21.        for loopx = 1 to ubound(.npcs())
  22.            if .npcs(loopx).index > 0 then
  23.               'condicion para ver si esta en pcarea
  24.                writecharactercreate
  25.            end if
  26.        next loopx
  27.  
  28.        for loopx = 1 to ubound(.objetos())
  29.             if .objetos(loopx).index > 0 then
  30.                writecreateobj blabl
  31.             end if
  32.        next loopx
  33.  
  34.   end with
  35.  
  36. end sub


se entiende lo q qiero decir?

LyRan escribió:Buenos Dias amigos y programadores de Gs Zone, Me gustaria pedirle la amabilidad de una ayuda con un cliente editado para mi Ao casero, Osea me explico, yo juego Ao con varios amigos y ellos todos usan cheat y no me gusta eso me gustaria que alguien me ayudara a crear un cliente editado con auto poteo de ambas potas a la ves ya sea que se alla gastado Mana lanzando algun hechis y comienze a potear solo hasta estar completamente el Mana, igual para la salud y poteo rapido para ambos.
mAnco programEr
806
Dragon Ancestral [1]
Registrado: Años de membresíaAños de membresía
Ubicación: Bolivia
Mensajes: 2305
Aportes: 109

Nota » 09 Feb 2012 09:49

maTih.- escribió:...

Esa, ahora entendí por donde vas. Es una muy buena idea, pero si te fijas, yo tambien la tuve en cuenta (solo que no la expliqué tan a fondo).

Si te fijas, en la estructura del quadtree también hay una lista de entities. En esta lista se guardaria cualquier cosa, por ejemplo, un objeto, un character (npc o usuario), una particula, una luz, o un tile (o un grupo de tiles :P, y si, yo también consideraria los tiles como un entity y no como algo separado).

La unica diferencia es que estos entities, yo los manejaria desde el quadtree, en vez de por areas. En realidad, llegamos a la misma conclusión ambos. Solo que el quadtree es un poco más elaborado (y eficiente) a la hora de dividir el mapa en rangos :P
Última edición por •Parra el 09 Feb 2012 09:50, editado 1 vez en total

Vicinity of obscenity
525
Legendario Inmortal [2]
Registrado: 5 Años de membresía!
Ubicación: España
Mensajes: 5580
Aportes: 50
Premios: 3
Mister Programador FreeForAll (3)

Anterior

Volver a AO 0.11.5

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados