Mostrar Mensajes

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

Mensajes - ferhand

196
Preguntas y respuestas / Re:PROBLEMA CON IA ENEMIGA
Octubre 05, 2012, 06:20:25 PM
Primero lo primero:


  Cada objeto de tu mundo ocupa diferente cantidad de cuadros de 16x16, esa es el área de colisiones a chequear al mover.

  Cada objeto debe tener determinada el área que ocupan en el mundo. Yo particularmente lo determinaría con un "array". Dicho "array" tendría la forma de determinar todos los cuadros que ocupa dicho objeto a partir de un cuadro pivote (o de referencia) de la siguiente manera:

         







Representaré las columnas como "b" y las filas como "a". Tomo como pivote el cuadro rojo con la "palomita" y a partir de él redacto matemáticamente donde están los demás cuadros rojos.  Un cuadro está del cuadro de pivote a un cuadro más por las columnas en la misma fila, lo que es igual a: a+0, b+1. Otro cuadro está situado debajo del cuadro de pivote lo que equivale a un cuadro más por las filas en la misma columna: a+1, b+0. El último cuadro está situado del cuadro pivote a un cuadro más por las filas y un cuadro más por las columnas: a+1, b+1.

En dicho, que estará presente en cada objeto, solo guardo las posiciones relativas al cuadro pivote del objeto en cuestión. ¿Por qué relativas a un punto? Por que solo podemos posicionar a un objeto con un punto, pero si a partir de es punto conocemos el área que ocupa, que son sus cuadros, podemos controlar si colisiona o no en su totalidad con solo un punto.

Cada vez que el objeto se vaya a mover solo moverá el cuadro de pivote a las coordenadas de GM y a partir de él preguntará si el resto de los cuadros están vacíos o no.

Para saber que espacios del mundo están vacíos o llenos tendremos que llevar un "array" a modo de matriz con los cuadros del mundo ya ocupados. Para tener todos los datos actualizados en la matriz crearemos un algoritmo que recorra el mundo una sola vez, al inicio del juego para que sitúe los objetos inicialmente y otro algoritmo que escribirá y borrará los objetos móviles cada vez que se muevan.

Las bases del algoritmo son las ya mencionadas. Ahora presentaremos los pasos que debe hacer el juego para el control de colisiones y así sabremos nosotros que debemos programar:

1 el juego se inicia por lo que el objeto controlador crea la matriz del mundo, un "array" bidimensional (array[a,b]). Recorre todo el mundo ("room") y localiza cada objeto situado en él y lo registra en la matriz cuadro por cuadro. Ya está listo para empezar.

2 Cada objeto antes de moverse debe:
2.1  verificar si está vacío el cuadro de la matriz que coincide con la posición nueva a moverse, en caso de que esté vacío debe comprobar que el resto de los cuadros que componen al objeto pueden posicionarse también. En caso de que todo de positivo debe indicarle al objeto controlador que va a moverse y este borrará la posición vieja y escribirá la nueva en la matriz. Luego el objeto ejecuta la animación de moverse. En caso de que cambie de fila en la matriz debe actualizarse la profundidad para dibujar al objeto.

Implementar todos esos pasos es sencillamente meticulosidad, nada complicado solo trabajoso. Una vez esté implementado se verán las ventajas a la hora de implementar un algoritmo de IA que busque caminos posibles, que persiga, que esquive los obstáculos, incluso que realice emboscadas con cierto grado de inteligencia.

Esto es solo lo que debe hacer el código, para programarlo solo hay que ir paso a paso para evitar errores o variables inservibles.

Sería bueno saber como tratas los niveles, si es un "room" completo o solo una parte de un "room" gigantesco. Para determinar el tamaño de la matriz a utilizar en cada momento pues podemos tener, por ejemplo: una matriz mundo grande y otra pequeña que será solo del tamaño de la "view" porque en el juego ustedes decidieron que lo que estaba fuera de la "view" no se movería ya que no es multijugador.

Necesito saber las características del juego para poder diseñar los algoritmos óptimos pues se ajustan a las particularidades de cada proyecto. A demás no tengo mucho tiempo, mi idea es que aprendan en el proceso y lo programen ustedes, así sabrán mejor arreglarlo a la hora de los errores.

Si no entiendes dímelo que estoy en línea.
197
Preguntas y respuestas / Re:PROBLEMA CON IA ENEMIGA
Octubre 05, 2012, 12:19:41 AM
  Primero lo primero:


  Cada objeto de tu mundo ocupa diferente cantidad de cuadros de 16x16, esa es el área de colisiones a chequear al mover.

  Cada objeto debe tener determinada el área que ocupan en el mundo. (imagen anexa)

  Mañana te traigo el algoritmo que utilicé en GIA Tetris modificado para que te sirva de ejemplo...Ahora debo ir a casa.  :-[ 
198
Preguntas y respuestas / Re:PROBLEMA CON IA ENEMIGA
Octubre 04, 2012, 09:53:56 PM
  Makero the_blade:


  Sí, he visto las imágenes y son sorprendentes su calidad. El juego tiene buena pinta, pero sin un sistema robusto pasarás bastante trabajo para organizar y controlar todo su contenido.

  No te mentiré, los cambios que planteo no son "coser y cantar", levan su trabajo y análisis, pero mejorarían mucho el control de colisiones para que no se cargue la PC, te ayudarían a controlar el dibujado de profundidad, podrías generar tus propias IA sin que carguen demasiado la PC, todo eso solamente porque controlas las posiciones de los objetos sin tener que preguntarles a cada uno.

  Si todos los espacios que ocupan los objetos son múltiplos de 16x16 entonces es posible hacerlo, pero no está exento de trabajo.   

  Es tu decisión.  :-[ 
199
Preguntas y respuestas / Re:PROBLEMA CON IA ENEMIGA
Octubre 04, 2012, 08:44:05 PM
  Makero the_blade:


   El MSN no me será útil ya que vivo en Cuba y no tengo opción de ningún tipo de chat. Las comunicaciones deberán ser a través de la ComunidadGM.

  Si tienes puesto 16x16 significa que los objetos y personajes ocupan uno o varios cuadros de esas medidas. Igual puedes decir en el "array" de control de colisiones que más de un cuadro están siendo ocupados y no se puede mover a esa dirección. Da igual que un objeto ocupe uno o más cuadros, el hecho es que todos esos cuadros deben aparecer como ocupados en el "array" para chequear la colisión antes de moverse.

Esto se parece mucho al GIA Tetris, donde una ficha ocupaba más de un cuadro en el campo. Mi solución fue crear un cuadro que tomo como punto centro o pivote. A partir de él documento todos los demás cuadros que este objeto debe ocupar. Todo lo hago relativo al cuadro pivote.

Por ejemplo: este personaje "cofre" ocupa a partir del cuadro pivote, un cuadro a la derecha, otro cuadro hacia abajo y otro a la derecha y abajo, sumando todos los cuadros incluyendo el de pivote son cuatro cuadros. Cada vez que ese "cofre" se mueva a la derecha debe revisar en el "array" si sus cuatro cuadros están desocupados, entoces se desplaza y actualiza en el "array" los cuadros que están ocupados en el mundo.

Este método es muy eficiente, no carga la PC y tienes control de lo que sucede todo el tiempo.

  Una cosa que se me pasó por alto es que el juego es isométrico. ¿Lo estás haciendo desde cero o ya tienes mucho adelantado? Lo pregunto porque para que en un isométrico los objetos se dibujen unos sobre otros en dependencia de la lejanía con la cámara debes tener una relación de la profundidad/posición y controlarla. Según la fila de cuadros que ocupas en el mundo será tu profundidad a la hora de dibujar. Para esto puedes utilizar el mismo "array" del que estamos ablando.

  Mi opinión es que  bases todo el juego en este sistema. Una vez implementado solo tienes que dedicarte a diseñar los elementos del mundo, pues las colisiones y orden de dibujado estarán controladas por un objeto controlador al respecto. El objeto que contendrá el "array" del mundo y le dirá a cada objeto su profundidad para ser dibujado...

Voy a almorzar, puedes escribir, pero responderé después de media hora... 
200
Preguntas y respuestas / Re:PROBLEMA CON IA ENEMIGA
Octubre 04, 2012, 07:54:17 PM
   Saludos makero the_blade:

  Lo del tamaño del "stepsize" es más bien una suposición, no estoy seguro que sea eso. No he trabajado mucho con esas funciones.

  En cuanto a lo de chequear el espacio por uno mismo, si tienes diferentes tamaños en los espacios que ocupan los elementos del mundo, puede ser un inconveniente. ¿Acaso no utilizastes "Snap" para colocar los objetos en el "room"? ¿En la ventana del "room", donde dice SnapX y SnapY qué número colocaste?

En caso de hayas puesto un número mayor de diez es posible subdividir el espacio y realizar por nosotros mismos los chequeos de la IA.

espero respuesta...   
201
Preguntas y respuestas / Re:PROBLEMA CON IA ENEMIGA
Octubre 04, 2012, 07:15:40 PM
  Saludos Makero the_blade:

  Como bien dice la explicación de la función esta no está exenta de errores, puede fallar. Aun así dice que en la mayoría de los casos puede llegar a alcanzar el objetivo.   :-[

  Un posible error en tu código puede ser que el tamaño del "stepsize" sea muy grande y a en el momento de chequear colisiones ya se encuentre dentro del objeto a evitar.    :-\

 

  Una solución a largo plazo puede ser crear tus propios "scripts" de movimientos donde chequees los espacios cuadrados que ocupan los objetos. Claro esto es válido si el juego que estás haciendo se mueve según el tamaño del "tile" del suelo, o sea un "tile" es un paso.  :)

  Si fuera así solo tienes que crear un "array" de todo el terreno a chequear donde los números cero (0) sean los espacios vacíos, uno (1) los espacios ocupados con objetos inmóviles y dos (2) los espacios ocupados con los personajes amigos y enemigos.   ;)

Cada vez que un personaje se vaya a mover, chequeará en el "array" si la posición a la que se mueve está vacía (o mejor dicho tiene un cero (0)), si ese así se mueve y actualiza los números en el "array". Este chequeo de colisiones es bueno no solo para el personaje jugador al moverse sino también para las IA enemigas para alcanzar un objetivo esquivando los obstáculos.  :D

De esta manera controlas cuantas veces quieres que un enemigo chequee las colisiones y el juego no estará lento. 8)

  Si tienes dudas puedes preguntar... 8)
202
Propuestas y soporte / Re:¿Cómo agradecer?
Octubre 04, 2012, 12:24:29 AM
  Saludos Makero Fenris78:


  Estamos claros que en este mundo nada es gratuito, nada está exento de algún tipo de remuneración, aunque no sea dinero propiamente dicho. Uno siempre ayuda a los amigos con sus actividades, a la familia, etc. y con un "gracias" basta, pero estemos claro que ese mismo interés en ayudar a un familiar, o un amigo no lo tenemos con un desconocido. No es el mismo grado de afinidad, por lo que un incentivo nunca está de más.  :D

  ¿Me dirás que el sistema de puntos implementado en la comunidad no presenta un caracter competitivo para incentivar a los makero a participar con calidad? ¿Acaso el Concurso Anual de la ComunidadGM tendría la misma participación si no se distinguiera a los ganadores del resto? Ese tipo de incentivo ayudan a canalizar las intenciones.  8)

  Alguien puede ser un buen músico y saberlo, pero nunca lo creerá si el resto no le reconoce como tal. El mundo gira tan de prisa y hay tan poco tiempo libre que a uno le gustaría hacer algo que tenga un objetivo más allá del mero hecho de divertirse.  :-\

  ¡Vamos, que no estoy pidiendo dinero! A todos nos gusta el reconocimiento las labores que realizamos, mientras más público mejor.  >:(

  Es mi opinión particular...  :-[

    Gracias por la atención prestada y disculpen por las molestias ocasionadas.  ;D

     
203
Preguntas y respuestas / Re:Variables creadas en Script
Octubre 03, 2012, 11:31:59 PM
  Saludos amigo Samigabacho:


   No te preocupes por el número de variables, no creo que tengas una cantidad de variables globales suficiente como para poner lento el juego. En el concurso GIA Tetris tuve un arreglo de veinte por diez y corría bien en una PC lenta.  :-[

  El hecho de que sean globales solamente determina que no se eliminarán de la "ram" hasta que el juego cierre totalmente. Particularmente creo un objeto que será el controlador de las funciones generales de un juego y dentro creo las variables generales, a la hora de utilizarlas las llamo "nombreObjeto . nombreVariable", siempre se donde están.  ;) 

Y sí, puedes llamar al "array" resultante donde está guardado el nombre de la variable que no conoces, para eso se creó. Recuerda, tienes un "array" donde guardas el nombre de los "arrays" creados dinámicamente, esa es la referencia.  8)

    Disculpa las molestias ocasionadas.  ;D
204
Propuestas y soporte / Re:¿Cómo agradecer?
Octubre 03, 2012, 11:19:12 PM
Cita de: Texic en Octubre 03, 2012, 10:24:25 PM
Mh no te creas que era puro problema. A mi me gustaba que la gente apreciara mi ayuda con un simple click y una buena frase. Obviamente no ayudaba pensando en que me dieran karma, pero la posibilidad de que lo hicieran existía, y siempre te hacía feliz ver que la gente quería recompensar de alguna manera el tiempo que pasabas haciendo los ejemplos y resolviendo los problemas... Al menos en mi opinión, no sé qué pensarán los demás
  Mi pensar concuerda con el del amigo Texic.

  Está bien claro el sistema de puntos creado en la comunidad es para incentivar a los makeros a participar.

  Ese es el objetivo de la comunidad, crecer con el trabajo comunitario, pero la recompensa está en ver cuanta gente has ayudado y el sistema de puntuación se implementó para esto, al tiempo que genera cierto aire de competitividad sana.

  El problema radica en que no se siente el impacto de la ayuda sin una forma explícita de expresarla.

   Incentivar a colocar información en la comunidad ha generado que haya más información de mejor calidad y la calidad te la demuestran los puntos alcanzados por algunos temas. Creo que en la ayuda no estaría de más una forma de incentivación competitiva.

  Simplemente mi opinión la que, estoy seguro, se comparte con un buen grupo de makeros.

  Gracias por la atención prestada y disculpen por las molestias ocasionadas.  ;D
205
Propuestas y soporte / ¿Cómo agradecer?
Octubre 03, 2012, 06:34:48 PM
  Saludos Makeros:


  En algunos casos uno quiere agradecer a algún makero por ayudar en la comunidad, pero no encuentro cómo.   :-\

  Se que está implementado el sistema de puntos, pero solo los brindan al makero que creo el tema, no al makero que el creador del tema quiera agradecer.  :-[

  Más claro, realizo una pregunta, me responden y quiero agradecer a los que me ayudaron...  :-X

  ¿Qué se hace en estos casos?  ???

  Si no lo han pensado ya quisiera proponer una forma de puntear la ayuda, no solo en el foro, sino incluso alguna que venga vía "MP", "Shoutbox", etc.    ;)

  El sistema de "karma" funcionaba, lo malo era que ponía nerviosos a algunos con los puntos negativos.  XD

  El nuevo sistema insta a crear contenido útil en la ComuniddaGM, pero ¿cómo recompensamos la ayuda que no tiene un tema "per se"?   

  Gracias por la atención prestada y disculpen las molestias ocasionadas.  ;D
206
Cita de: Mgbu en Octubre 02, 2012, 10:07:32 PM
Jeje muchas gracias, me esforcé XD
Está muy bueno como alternativa "show_debug_message()", escribe el mensaje cuando corres en "Debug Mode" (El play rojo). Para ver los mensajes de esa función, en la ventana de debug andá a Tools>Show Messages, te abre una ventana en donde van apareciendo los mensajes, me gusta porque no para el juego, no molesta cuando no se necesita y guarda los mensajes
  Saludos amigos:

  ¡ Increíble! Yo no sabía acerca de esa función...  :o 

   Eso me hará la vida más fácil...
207
Preguntas y respuestas / Re:Variables creadas en Script
Octubre 03, 2012, 06:06:39 PM
Cita de: Samigabacho en Octubre 03, 2012, 08:41:32 AM
Y ese global. ¿puede ser declarado como string dentro de una función?:

variable_local_array2_set("global.tb_"+string(var_tablas[i,1]),0,0,i);
  Saludos makero Samigabacho:

  En la función que escribes ya viene el rango de alcance de la variable observa:
   
   variable_local_array2_set ();
   variable_global_array2_set();

  El primer argumento es el nombre solamente, el alcance está en la función en sí.

   Disculpa la demora con el "script" que te debo, he tenido inconvenientes en mi trabajo, disculpa. En cuanto me libere te lo completo.  ;D
   
208
Preguntas y respuestas / Re:[Problema] Rompeladrillos
Octubre 01, 2012, 04:25:55 PM
  Saludos makero Erthalion:


Citar4) También me gustaría, a poder ser, que al terminar de romper todos los bloques, me transporte al siguiente nivel (sé que comando hace eso, lo que no sé es que lo haga cuando los bloques estén destruidos).

   Para resolver este punto primero sería bueno saber a que llamas "destruir bloques".
1  ¿Borrar un "sprite"?
2  ¿Destruir un objeto bloque?

  En caso de que sea la primera puedes tener una lista de dos dimensiones ( array[a,b] ) donde guardes todos los "sprites" de cada bloque y al "destruirlos" los marcas, para saber cuales ya están "destruidos"
  ejemplo:


array_bloques[a,b]
   [0,0] = bloque_1       [0,1] = roto
   [1,0] = bloque_2       [1,1] = entero
   [2,0] = bloque_3       [2,1] = entero
   [3,0] = bloque_4       [3,1] = roto
   [4,0] = bloque_5       [4,1] = roto


  En caso que sea la segunda opción:
  *  simplemente puedes crear un objeto llamado "obj_bloque_padre" y
  *  luego en cada objeto que sea un bloque le seleccionas la opción "parent" y le asignas el nuevo objeto" "obj_bloque_padre", (esto convierte a todos esos objetos bloques en hijos del nuevo objeto) (imagen_1)


  *  y luego en un objeto preguntas en el evento "steps" si la cantidad de objetos "obj_bloques_padre" es igual a cero, entonces cambias de "room"  (imagen_2)


  Espero que hayas entendido, sino pregunta, que para eso estamos.

  Gracias por la atención prestada y disculpen las molestias ocasionadas. ;D 
209
  Saludos makero Samigabacho:


  Dos respuestas atrás, en este tema, te dejé un adjunto con el "script" para cargar que si debe funcionar. Este es un "punto gml" que debes ingresarlo al proyecto con la opción "import script".

   Lo hice precisamente porque los "scripts" de "cargar" y "guardar" enviados antes no estaban pensados para ese formato de datos.

  Te pido por favor que me disculpes la demora y trates de probar el último que te dejé como adjunto dos respuestas atrás.

  Gracias por la atención prestada y disculpa las molestias causadas.  ;D
210
  Saludos makero xcbgames:

  Hace mucho tuve el mismo problema. Revisé el ejemplo y la única diferencia que veo con el tuyo es que en vez de usar doble comillas " ", las uso simples ' ' .  :D

  Intenta con comillas simples así: T='\Cfg\A1.cfg'   :-\

  Gracias por la atención prestada y disculpen las molestias ocasionadas.  ;D