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 - Guacusio

241
Cita de: Jangse en Agosto 16, 2015, 09:03:15 AM
Cita de: Guacusio en Agosto 16, 2015, 12:58:42 AM



El método que se me ocurrió es una generalización, no sirve para todos los casos tal como está. Esto se debe a que para que funcione, el origen del sprite que representa al jugador debe estar dentro de su bounding box. Ya que el evento outside room se gatilla al momento en que su mask está completamente fuera del room, es necesario que para entonces sus coordenadas x,y también hayan salido del room. En tu caso, el ejemplo no funciona porque al momento en que se gatilla outside room las coordenadas x,y del sprite siguen en el mismo room. Para solucionar esto, dejé el origen del sprite dentro del bounding box. Otra cosa importante a tener en cuenta para tu caso es el darle continuidad a las condiciones de borde de los rooms en lo que se refiere a paredes. Ya que tu engine usa gravedad, al momento de salir del room y no haber suelo, el personaje empezará a caer justo antes de hacer el cambio de room; ese pixel que alcanza a caer será suficiente para atascarlo cuando reaparezca en el nuevo room superpuesto a un objeto sólido. Por ello, recuerda agregar un bloque más de pared en los empalmes de éstas entre rooms para que el personaje no caiga antes de cambiar de room. Adjunto tu ejemplo modificado con lo que te acabo de explicar.

Muchas gracias de nuevo. Ahora funciona muy bien. Y por lo que veo no has modificado nada el codigo. Simplemente a sido poner un bloque mas en los cambios de rooms. Yo pensaba que con dar continuidad del suelo entre rooms era suficiente. Pero no, hacia falta ese bloque mas suelo (que queda fuera del editor) que hace como de puente entre ambas rooms.

Por archivos no te preocupes. He modificado el tema y el puesto el icono del GMS. Ya que tengo la version standard del mismo.

Efectivamente, el código es idéntico al anterior, sólo cambié el origen de los sprites del personaje y agregué bloques de continuidad fuera de los rooms en las paredes que empalman entre rooms.

Cita de: Jangse en Agosto 16, 2015, 09:03:15 AM
Una duda que tengo es del codigo de GML. Es un lenguaje que se puede escribir de muchas maneras y a veces crea confusion. Si te fijas, en el evento outside room hay un pedazo de codigo que lo acabas asi:

if x<0
    x+=w;
else if x>=w
    x-=w;
if y<0
    y+=h;
else if y>=h
    y-=h;
room_goto(r);


Y entre las sentencias if y else no pones las llaves. Cosa que si haces en otras partes del codigo. A mi de hecho ya me esta bien. Ya que suelo utilizar el lenguaje Python que no lleva llaves. Pero no se, si en GML,  es correcto no poner estas llaves.

La sintaxis del GML es bastante flexible a la hora de escribir código. Cuando existe una sentencia que implica la ejecución de una serie de otras sentencias (como cuando se usa if, while, with, etc.), las llaves sólo son necesarias si ese conjunto de otras sentencias son dos o más. Por ejemplo:

if a=b
    c=1;//sin llaves ya que sólo es una sentencia la que se ejecuta si el if es verdadero


if a=b
    {
    c=1;//requiere llaves para englobar todo lo que se debe hacer si el if es verdadero.
    d=2;//si no se usaran llaves, sólo se ejecutaría la primera sentencia del grupo (c=1)
    e=3;
    }


Si quieres puedes usarlas de todas maneras cuando se sigue una sola sentencia en vez de varias, pero no es necesario

Cita de: Jangse en Agosto 16, 2015, 09:03:15 AM
Bueno, hablando del editable, ahora pondre algun enemigo para ver si respeta la animacion una vez entramos y salimos de las rooms. Que era otra duda que tenia.

Y me quedara por entender la logica de estos arreglos:

w=room_width;
h=room_height;
rooms[0,0]=A;
rooms[0,1]=0;
rooms[0,2]=0;
rooms[1,0]=B;
rooms[1,1]=w;
rooms[1,2]=0;
rooms[2,0]=C;
rooms[2,1]=2*w;
rooms[2,2]=0;
rooms[3,0]=D;
rooms[3,1]=w;
rooms[3,2]=h;
rooms[4,0]=E;
rooms[4,1]=2*w;
rooms[4,2]=h;


Osea que significa cuando hacemos 2 * w o rooms[0, 1] = 0
Ya ire trasteando a ver...

Es un codigo muy importante el que has creado aqui. Ya que es basico saber cambiar entre rooms o pantallas y respetar la continuidad del ciclo de movimientos del personaje.

Saludos!

MODIFICACION:

He añadido en la room B otro trozo de suelo fuera del escenario. Ya que cuando volvia de la room B a la room A, se quedaba trabado en la room A.

Adjunto un editable donde ya podemos pasear por las 5 pantallas. He tenido que crear entre rooms todos los enlaces de union entre rooms. Sino el personaje se quedaba trabado en alguna de ellas.

Solo me falta implementar que cuando la mitad del personaje este fuera de la room, la room actual cambie. Sino, muchas veces el personaje desaparece de la room actual y no da tiempo a este cambio de room. Aunque si seguimos apretando el boton de direccion, la room cambia perfectamente.

w y h son el ancho y el alto de los rooms (que deben ser los mismos en todos para que el método funcione). Lo que el arreglo hace es guardar para cada room (donde cada fila del arreglo está asociada a un room) sus "coordenadas" dentro del mapa general de rooms, donde por "coordenadas" me refiero a las coordenadas de su esquina superior izquierda:



Donde el arreglo bidimensional tiene esta forma:



Para que la room cambie antes de que el personaje desaparezca completamente, se requieren modificaciones importantes del código. Si quieres implementarlo de esta manera, tendrías que cambiar el evento outside room por intersect boundary y dentro de éste calcular cuál de los 4 lados del room es el que fue intersecado por el personaje para saber a qué room viajar; también tendrás que calcular las nuevas coordenadas x,y del personaje de otra forma, ya que el personaje no se moverá continuamente dentro del mapa sino que pegará un salto dentro de éste.
242
Preguntas y respuestas / Re:Guardar global imagen.
Agosto 16, 2015, 03:44:06 AM
¿A qué te refieres con "guardar"? los global.spr_par y global.spr_impar son referencias a sprites, números que los identifican pero no tienen ninguna otra información sobre la imagen. Si guardas estas variables en un ini lo que estás guardando son números y no hay manera de regenerar luego un sprite en base a un número. Si lo que pretendes es disponer de ellos en una nueva ejecución del juego, tendrás que volver a crearlos desde la URL. Si lo que quieres es guardar los sprites en el equipo, usa sprite_save. En cualquier caso, los índices probablemente van a ser diferentes a los originales.
243
Cita de: oskarg en Agosto 10, 2015, 01:37:51 PM
Hola ,buenas,el ejemplo lo podrias poner para  :GM8:?
Una duda que me ha surgido sobre este tema,Cuando hago el fondo a base de tiles,¿el programa carga todo el mapa,nivel?.Lo expreso para saber si puedo hacerlo tan grande como se me antoje,sin que afecte el rendimiento.
Otra cuestion,sobre mapas,¿hay alguna funcion donde teniendo un scroll ciclico pueda pegar un grafico en una coordenada del scroll?,asi no utilizo objetos,pues el grafico se pega al fondo.
Por cierto,me llamo Oscar y espero aprender bastante con vuestra ayuda .

No tengo cómo grabarlo en formato de   :GM8: pero puedes copiar y pegar el código que indiqué en los eventos correspondientes del objeto jugador. Si no lo consigues aun así, avísame para ver qué podemos hacer.

Cita de: Jangse en Agosto 15, 2015, 07:17:40 PM
Hola Guacusio. He realizado una pequeña prueba del codigo que pasaste. En tu ejemplo funcionaba muy bien. Yo he realizado un pequeño test, pero no me funciona. Ha decir verdad, aun me falta entender bien el codigo que pusiste. Pero aun haciendo el copia-pega no me va.

En el ejemplo del archivo adjunto,  movemos el personaje con las teclas del cursor y salta con la tecla 'a'. Movimientos programados en el evento step. Pero si pasamos de pantalla el tio desaparece. Y tampoco se cambia de pantallo como en tu ejemplo. Se ve en pantalla pequeña pero se puede hacer mas grande. No quiero retocar mucho el codigo pusiste hasta que no lo comprenda bien.

Si puedes, echale un vistazo. Gracias!

El método que se me ocurrió es una generalización, no sirve para todos los casos tal como está. Esto se debe a que para que funcione, el origen del sprite que representa al jugador debe estar dentro de su bounding box. Ya que el evento outside room se gatilla al momento en que su mask está completamente fuera del room, es necesario que para entonces sus coordenadas x,y también hayan salido del room. En tu caso, el ejemplo no funciona porque al momento en que se gatilla outside room las coordenadas x,y del sprite siguen en el mismo room. Para solucionar esto, dejé el origen del sprite dentro del bounding box. Otra cosa importante a tener en cuenta para tu caso es el darle continuidad a las condiciones de borde de los rooms en lo que se refiere a paredes. Ya que tu engine usa gravedad, al momento de salir del room y no haber suelo, el personaje empezará a caer justo antes de hacer el cambio de room; ese pixel que alcanza a caer será suficiente para atascarlo cuando reaparezca en el nuevo room superpuesto a un objeto sólido. Por ello, recuerda agregar un bloque más de pared en los empalmes de éstas entre rooms para que el personaje no caiga antes de cambiar de room. Adjunto tu ejemplo modificado con lo que te acabo de explicar.
244
El jugador tendrá acceso a un archivo ini para borrar o agregar cosas; yo debo tener también acceso a éste para agregarle cosas nuevas a medida que genere actualizaciones del juego (este archivo representa puzzles disponibles, donde yo entrego por defecto una cantidad, el jugador puede borrar o agregar nuevos puzzles con un editor incorporado en el juego y además quiero poder agregar nuevos puzzles al archivo con una actualización del juego sin afectar los puzzles ya guardados en el ini). Por lo tanto, necesito que el archivo no sea borrado con una actualización.


Pienso guardar el progreso en un archivo ini (que no requiere cambiarse por una actualización del juego) y los otros archivos ini que requieran actualización por cambios en la mecánica de juego (como los de puzzles) los voy a leer desde un servidor para actualizar los del área de storage en base a éstos, haciendo una operación tipo "append" para agregar los nuevos datos sin borrar los existentes.
245
Cita de: djboro88 en Agosto 15, 2015, 10:20:23 AM
La colocacion de los numeros funciona.
Pero con el boton derecho no funciona nada. Algo ocurre

¿Indicaste para cada círculo cuál es su antecesor? Por ejemplo, si tienes un círculo Nº1 que origina líneas a los círculos Nº2 y Nº3 y el Nº3 al Nº4, la secuencia es:

-botón izquierdo/círculo anterior -1: crea círculo Nº1
-botón izquierdo/círculo anterior 1/círculo anterior -1: crea círculo Nº2
-botón izquierdo/círculo anterior 1/círculo anterior -1: crea círculo Nº3
-botón izquierdo/círculo anterior 3/círculo anterior -1: crea círculo Nº4
-botón derecho: muestra la secuencia funcionando.
246
Mi problema es el siguiente. Tengo un archivo ini que guardo en la carpeta included files. Cuando lo modifico desde el juego la primera vez, pasa de estar en el file bundle a la save area (o local storage). Todas las operaciones sobre el archivo ini, tanto lectura como escritura, desde ese momento se realizan sobre la versión guardada en la save area. El problema es que si saco una versión nueva del juego con el ini modificado en included files, el juego seguirá ocupando la versión de la save area en vez de actualizarla. En otras palabras, GMS no hace una instalación "fresca" de la actualización de un juego ya que usa la misma carpeta save area que ya existía, sin borrar su contenido. Por una parte eso es conveniente para poder, por ejemplo, guardar el progreso del jugador y que no se pierda al actualizar el juego, pero por otra no me permite hacer modificaciones de esos archivos ini que tengo modificados en la carpeta included files. Tengo entendido que para Android se puede activar la opción Always do full install of APK en las preferencias, que borra todo registro del juego previo antes de instalar una actualización pero en Windows parece que no existe esa opción. Lo único que se me ocurre por ahora es agregar otro archivo ini que guarde una variable que indique si es la primera vez que se corre el juego; si es así, desde el juego borrar los archivos en la save area para obligar a leerlos desde el file bundle ¿Habrá otra manera mejor?
247
Más visual...

Mejor te paso un editable con lo que se me ocurre, un poco modificada pero es la misma idea.

Con el botón izquierdo del mouse agrega círculos. Cada vez que agregas uno, el programa le coloca un número correlativo comenzando de 1. Cuando agregues un círculo te preguntará qué círculo(s) viene(n) antes de ése, si es el primero que colocas o si ya colocaste todos los antecesores, coloca -1; de lo contrario ingresa el número del círculo antecesor. Con el botón derecho del mouse reproduces la secuencia. Normalmente cada círculo tiene sólo un antecesor pero lo dejé para que si quieres puede tener un número arbitrario de antecesores.
248
Me parece que en el ejemplo que encontraste la dll no va a descargar un archivo de audio desde una URL sino que su objetivo es reproducir archivos de audio ya en disco. Ahora bien, GMS (si es éste el que usas) no permite streaming de audio desde una URL pero si lo que quieres es descargar al dispositivo el archivo de audio para luego reproducirlo, se puede hacer utilizando la función http_get_file.
249
Una forma puede ser ésta:

-Crea un objeto línea que dibuje una línea desde la coordenada (x0,y0) en dirección d con velocidad v. Los valores de x0,y0,d y v de la primera línea debes dárselos tú de acuerdo a dónde parte la primera línea y en qué dirección. Asígnale a esa instancia los valores direction=d y speed=v y en el evento draw dibuja una línea entre (x0,y0) y (x,y).
-Crea un objeto círculo que guarde las direcciones posibles desde las cuales puedan surgir nuevas líneas. Para ello deberás asignar a cada instancia de círculo un grupo de direcciones factibles.
-En la colisión de la línea con un círculo (o en el evento step del objeto línea revisa si ésta llega a un círculo, por ejemplo usando instance_position(x,y,o_circulo)) se reproduce el sonido y haz que esa instancia círculo cree tantas instancias línea como direcciones posibles guarda ese círculo, cada una partiendo de las coordenadas del círculo y con las direcciones que guarda. La línea que llegó al círculo debe ignorar nuevas colisiones con ese círculo o bien ser destruida y reemplazada por una instancia de un objeto que dibuje esa línea que queda fija.
250
Preguntas y respuestas / Re:Lio con los mandos.
Agosto 14, 2015, 06:09:28 AM
CitarPuesto que también debo dar cabida al movimiento con teclado, no es exactamente el mismo código que en los exportables, aunque reconozco que se podría pulir un poco :-[:

if((keyboard_check(vk_left) || (joystick_exists(0) && joystick_xpos(0)<0) || (gamepad_is_connected(0) && gamepad_axis_value(0,gp_axislh)<0)) && x>view_xview[0]+sprite_xoffset) x-=desplazamiento
else if((keyboard_check(vk_right) || (joystick_exists(0) && joystick_xpos(0)>0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislh)>0)) && x<view_xview[0]+view_wview[0]-sprite_width+sprite_xoffset) x+=desplazamiento
if((keyboard_check(vk_up) || (joystick_exists(0) && joystick_ypos(0)<0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislv)<0)) && y>view_yview[0]+sprite_yoffset) y-=desplazamiento
else if((keyboard_check(vk_down) || (joystick_exists(0) && joystick_ypos(0)>0) || (gamepad_is_connected(0) &&  gamepad_axis_value(0,gp_axislv)>0)) && y<Escenario.y-sprite_height+sprite_yoffset) y+=desplazamiento

Sí, se podría pulir, sobre todo para hacerlo más legible y fácil de depurar. Copié tu código en GMS asumiendo lo siguiente:

-El código va en el evento step
-La variable desplazamiento la tomé como 1
-La variable Escenario.y la tomé como 0 (supongo que la usas para detectar cuándo la nave toca el borde superior de la pantalla)

Probé el código con el joystick genérico y el resultado fue que... la nave se dirige automáticamente hacia el borde superior izquierdo de la pantalla si no se toca el joystick; si se presiona hacia la derecha entonces la nave se va hacia la derecha pero si se suelta se vuelve a ir a la izquierda; si se presiona hacia abajo, la nave no sube ni baja.

Noté algo interesante al probar con la función joystick_xpos y joystick_ypos: cuando no se está presionando la dirección correspondiente, la función no retorna 0 sino que -0.01. No sé si es un problema con el joystick que uso o es un bug de GMS; sería genial si tú o alguien más pudiera hacer la prueba. Eso explica por qué la nave se va hacia la esquina superior izquierda cuando no se toca el joystick. Para el caso del joystick de Xbox, las funciones joystick_xpos y joystick_ypos siempre me devuelven 0 como si no leyeran el joystick. Como yo utilizo la función joystick_direction en vez de esas, no me he topado con este problema para leer el joystick genérico.

Personalmente lo que yo hago para incorporar el uso de joystick a un juego es primero crear todo en base a eventos de press o release de teclas y tengo un objeto dedicado al control del joystick que lo que hace es simular las presiones de las teclas en base al input del joystick, utilizando keyboard_key_press y keyboard_key_release (como mapear el joystick al teclado).
251
Preguntas y respuestas / Re:Lio con los mandos.
Agosto 13, 2015, 09:29:21 PM
Si en tu juego estás usando el mismo código que el del programa que adjuntaste no veo de dónde puede existir esa diferencia tan grande de comportamientos. ¿Usas el mismo código para leer el joystick?
252
Preguntas y respuestas / Re:Lio con los mandos.
Agosto 13, 2015, 09:08:25 PM
Cita de: Marth en Agosto 12, 2015, 10:59:56 PM
Al final, incluso con el sistema de checkeo sigue habiendo errores.
Subo el programa de la anterior vez pero con un añadido: ahora también es posible controlar la nave con un mando normal.
Que todo el que tenga algún tipo de mando lo pruebe y me diga si funciona perfectamente o el control es defectuoso.

El programa que adjuntaste funciona bien tanto para joystick tipo Xbox como para uno genérico (en el caso del joystick Xbox la nave se mueve con la palanca en vez de la cruceta).

Probé también tu juego y ahora reconoce ambos tipos de mando. Sin embargo, el problema de que la nave se tiende a ir a la esquina superior izquierda de la pantalla, aún sin presionar nada, sigue existiendo para el joystick genérico. Cuando el joystick Xbox está conectado, la nave nunca se queda quieta aún cuando se suelte el mando, y tiende a irse a distintas direcciones.
253
En primer lugar, el cuarto argumento de la función collision_crircle debe ser un solo objeto; no puedes "sumar" objetos para indicar que quieres hacer la prueba de colisión con varios tipos de objeto. En este caso te sugeriría que agrupes los objetos bajo el mismo parent, por ejemplo un objeto "escenario" que sea parent de todos los objetos del escenario que representan obstáculos a la hora de encontrar un espacio para colocar al zombie.

En segundo lugar, dado que buscas coordenadas aleatorias para el zombie, nada te garantiza que en 5 ciclos de for vas a encontrar siquiera una posición libre. Lo que debieras hacer es, por ejemplo, usar un do/until dentro del for de esta manera:

for(i=0;i<5;i+=1)   
    {
    do
        {
        xx=random(room_width);
        yy=random(room_height);
        }
    until !collision_circle(xx,yy,1500,escenario,0,0)
    instance_create(xx,yy,Zombi_01)
    }


Por cierto, una distancia libre de 1500 a la redonda de cada obstáculo es bastante grande.
254
Juegos completos / Re:Monster
Agosto 09, 2015, 07:51:05 AM
¡Genial!

Podrá ser muy corto pero tiene una tremenda carga emotiva. Me sorprendió lo que llegaste a lograr con tan poco. Esto muestra que la creación de videojuegos no es sino otro tipo de arte.
255
En los Demos que vienen con GMS hay uno que se llama LAN_Platformer. Coloca File->New Project para encontrarlo.