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

721
Una tecla virtual funciona en base a un área de la pantalla (no de la habitación) a la que le asigna un evento de una tecla

El multitouch no tiene relación directa con posiciones en la pantalla, sino con posiciones dentro de la habitación actual. Tampoco tiene relación con eventos de teclas, como las teclas virtuales, sino con eventos de ratón. El multitouch es como si tuvieras dos o más ratones, y pudieras hacer clicks al mismo tiempo con cada uno de ellos. Esto quiere decir que para detectar un click, tienes que especificar a qué ratón (dispositivo) te estás refiriendo.

para pinchar más de un globo a la vez se debe usar multitouch
http://docs.yoyogames.com/source/dadiospice/002_reference/mouse,%20keyboard%20and%20other%20controls/device%20input/index.html
722
Preguntas y respuestas / Re:LIMITE DE TECLAS?
Marzo 07, 2015, 01:07:05 AM
Es cierto lo que dice Iros. No recordaba que cierto hardware de teclado puede estar más o menos limitado. El teclado que tengo es relativamente nuevo (unos 2 meses con él), pero ahora creo recordar que cuando comenzaba con GM, me pasó algo similar a lo que comentas.

Aquí una discusión relacionada con el problema:
http://gmc.yoyogames.com/index.php?showtopic=365313
723
Preguntas y respuestas / Re:LIMITE DE TECLAS?
Marzo 07, 2015, 12:40:12 AM
Me suena más a que es un error en el código que usas. Acabo de probarlo en GM8.1 y me detecta tres (o más) teclas al mismo tiempo sin problemas.
725
La manera más fácil de lograr lo que quieres sería usar dos sprites, uno con los primeros 7 frames, y cuando ese sprite llegue a su fin, cambiar de sprite a uno que sólo contenga los frames 7 y 8.

Si de todas maneras, prefieres usar un único sprite:
[gml]
if image_index < 7
     image_speed = 0.5
else
{
     salto = true
     image_speed = 0.05      //Velocidad muy baja, para que se aprecien los dos últimos
}

if (salto) and (image_index < 7)
     image_index = 7                   //saltar a la subimagen  8
[/gml]

No lo he probado, pero en esencia la idea me parece correcta. la variable salto se debe inicializar en 0 en CREATE para que funcione.
726
Preguntas y respuestas / Re:Velocidad en el aire
Marzo 05, 2015, 04:11:57 AM
En tu código de movimiento izquierda/derecha, debes agregar una condición para saber si estás en el aire o no. Si estás en el aire, la velocidad de movimiento (ya sea hspeed o el incremento a x) debe ser menor que cuando se está en el suelo.

Sin ver qué código usas no hay seguridad, pero sospecho que el rozamiento actúa sólo en una dirección, entonces, al saltar a la derecha, el rozamiento es un vector con dirección a la izquierda. Mientras mantengas la dirección hacia la derecha, el rozamiento va en contra del movimiento original, pero si cambias de dirección en el aire, el rozamiento se suma al movimiento, haciendo que regreses al punto de salto (o más allá).

Es una suposición solamente, pero si ese fuera el caso, el rozamiento debería manejarse más o menos como (suponiendo que el rozamiento es de 0.5)

[gml]
if (gravity != 0)
     rozamiento = sign(image_xscale) * -0.5[/gml]
Esto haría que el rozamiento siempre actuara en dirección opuesta a donde mira el personaje (mientras esté en el aire).


727
Cita de: Strod en Marzo 04, 2015, 06:03:49 PM
¿Cómo puedo conectar el objeto botón con el del personaje? ¿Alguien me puede dar alguna idea de cómo encarar este problema?

Hay dos maneras de hacerlo. Una, mediante el método punto: nombre_del_objeto_o_instancia.variable_de_ese_objeto_o_instancia

Otra, mediante la construcción with: with (objeto_o_instancia) { acciones }

http://www.inventati.org/estupidezartificial/manual.html
La primera se explica en la introducción a GML, parte 1, y la segunda, en la Introducción a GML, parte V.

Ejemplo (usando with). En el botón:
[gml]with(obj_jugador)
{
      x += 64        //Mueve al jugador a la derecha.
}[/gml]

Adicionalmente, se debe crear un sistema para identificar cada casilla y/o asociarle a cada casilla una posición. Esto se puede hacer de distintas maneras, mediante arreglos, listas, mapas, grids, etc. Otra es mediante el uso de las funciones snapped (creo que esta es la más sencilla). En la sección de ejemplos, aquí en el foro, ver el ejemplo de "movimiento en una grid" o "movimiento tipo pokemon"(no recuerdo el nombre exacto, pero es un ejemplo sencillo y claro de cómo moverse en intervalos fijos). Otra sería crear una rejilla mediante  mp_grid.
728
Esta condición
if(x == previousx){hspeed = 0;}

Da por hecho que al regresar, va a haber un STEP donde la posición actual del objeto coincida con la posición previousx, pero puede suceder que esto nunca ocurra. Según su velocidad, en un STEP, el objeto podría estar a uno, dos, tres, etc pixeles a la derecha de previousx, y al siguiente STEP, el objeto podría haber pasado más allá (hacia la izquierda) del punto previousx, por lo que nunca se cumpliría la condición.

Creo que para evitar fallas, la condición debería cambiarse para que evalúe un margen (rango) de distancia en lugar de un punto exacto.
729
Para llenar la pantalla en orden, a base de cuadros pequeños, se usarían ciclos anidados.
http://www.comunidadgm.org/preguntas-y-respuestas/dibujar-sprite-como-se-muetra-en-la-imagen/msg111761/#msg111761
http://www.comunidadgm.org/preguntas-y-respuestas/ayuda-corrigiendo-este-script/msg110944/#msg110944

pero como dijo Iros, no es muy eficiente llenar la pantalla de objetos. La alternativa que a mi me parece viable es en lugar de usar 200 objetos, usar sólo un sprite que se dibujaría (mediante los ciclos) en una superficie. Cuando se halla completado de dibujar los 200 cuadros en la superficie, la superficie se dibuja en draw. esto evitaría tener que crear objetos de manera innecesaria.

El uso de arreglos se adecua más para que los objetos se dibujen en orden, si quieres que los cuadros se dibujen desordenadamente (aleatoriamente), entonces a mi me parece que los arreglos no es lo más recomendable.Se puede probar a que los cuadros se dibujen aleatoriamente en cualquier posición dentro de la pantalla, pero no sé qué tanto tiempo tardaría en llenarse la pantalla, podría llenarse rápido o podría tardar mucho.

Otra estrategia es usar los objetos cuadrados que mencionas, crearlos al azar, pero al crear cada cuadro, que el cuadro revise si la posición está vacía. si no lo está, se movería hasta encontrar una posición vacía y esto haría que el tiempo en que se llena la pantalla fuera menor,
730
Cita de: vitail en Marzo 02, 2015, 10:22:36 PM
a ver, es como el while, solo que con menos lineas de codigo
No, no es como un while. El que while y for sean ciclos, no los hace similares.Obvio que todos los ciclos implican repetición, pero cada uno tiene sus particularidades (no es correcto pensar que un ciclo while trabaja como uno for).

Cita de: vitail en Marzo 02, 2015, 10:22:36 PM
bueno supongo que no sera tan importante el ciclo for ¿o si?
Al contrario, el ciclo for posiblemente sea el ciclo más usado en cualquier lenguaje de programación.

¿Quieres entender fácilmente como funciona un ciclo for? Usa el debugger de GMS para ver cómo progresa cada iteración del ciclo, cómo se evalúa la condición y cómo se incrementa la variable del ciclo
731
No. Una cosa es el movimiento en un path, y otra el movimiento "libre" mediante hspeed.

Una idea:

hspeed: el valor que quieras para que avance a la izquierda o derecha
vspeed: Usa una alarma, en la alarma, cambias el signo de vspeed, eso haría que cada cierto tiempo el fantasma suba y después de cierto tiempo baje, creando el movimiento vertical que quieres

Otra manera es usar las funciones seno/coseno, que fluctúan periódicamente entre -1 y 1, pero esto creo que es más demandante
732
Preguntas y respuestas / Re:Ayuda personajes meta
Marzo 02, 2015, 08:59:29 PM
Cita de: pacne en Marzo 02, 2015, 08:59:25 PM
Ahora tengo otra pregunta, para no tener tanta progrmacion como puedo hacer que el personaje 2 haga los mismos movimiento que el personaje 1, sin utilizar el parent. Gracias
El siguiente código debe funcionar con el planteamiento original, dos instancias de un mismo objeto personaje:


Usar un objeto controlador: objControl
CREATE (objControl)
[gml]
id_meta1 = noone
id_player1 = noone
id_meta2 = noone
id_player2 = noone[/gml]

En los eventos CREATE de cada objeto
Instancia player1: objControl.id_player1 = id; 
Instancia player2: objControl.id_player2 = id
Instancia meta1: objControl.id_meta1 = id
Instancia meta2: objControl.id_meta2 = id

Bajo esta idea, no es necesario un evento de colisión en ningún objeto, símplemente verificar las distancias de cada par player-meta. En el controlador:[gml]
if ( abs(point_distance(id_player1.x, id_player1.y, id_meta1.x, id_meta1.y)) < 50  ) and (abs(point_distance(id_player2.x, id_player2.y, id_meta2.x, id_meta2.y)) < 50  )
{
    //ir a la siguiente habitación
}[/gml]

El código está pensado para que los personajes tengan que estar A LA VEZ en la meta, para avanzar a la siguiente habitación. Si un personaje llega a la meta, pero la abandona, y después el otro llega a la meta, NO se va a pasar a la siguiente habitación (aunque esto se puede cambiar de manera fácil usando una variable adicional)
733
Como indica el manual, la función trata de evitar obstáculos, pero no hay garantía de que funcione al 100%. El problema se puede resolver de distintas maneras, una de ellas, es usar un evento de colisión ENEMIGO VS OBJETO

[gml]
{
   var dir = point_direction(other.x, other.y, x, y);
   move_outside_solid(pdir, 20);                           //Alejarse del objeto sólido en la dirección contraria
}
[/gml]
734
Preguntas y respuestas / Re:Sonido despues de otro
Marzo 01, 2015, 05:27:38 PM
Cita de: arcangelcaos en Marzo 01, 2015, 10:09:33 AM
Se puede crear una lista de reproducción?, he leído algo, pero no veo como hacerlo.

La lista de reproducción más sencilla sería un arreglo (arr_playlist) con los temas/sonidos, y una variable para indicar la posición/tema.
CREATE
[gml]
pos = 0
played = 0[/gml]

Tocar tema según posición [STEP]
[gml]
if (pos == played) and (!audio_is_playing(arr_playlist[pos])
{
     audio_play_sound(arr_playlist[pos], 0, false);         
     played += 1
}[/gml]

Actualizar posición en la lista de reproducción [STEP]:
[gml]
if (played > pos) and (!audio_is_playing(arr_playlist[pos] )
     pos += 1                 //Esto haría que pos fuera igual a played, y se tocaría el siguiente tema (en el primer if)
[/gml]
735
Preguntas y respuestas / Re:Como crear juego
Marzo 01, 2015, 04:54:55 PM
Las variables se crean en el evento CREATE de los objetos. el objecto CuadradoParent no hace nada por si mismo, pero sirve para agrupar a los dos objetos cuadros y hacer más fácil de manejar las colisiones.

Si no agrupas los objetos cuadros, (ni los objetos puño), tendrías que agregar 4 eventos de colisión

Si agrupas los cuadros (y no los objetos puño, que es como está el cósigo que puse), se agregan dos eventos de colisión, uno por cada puño

Si agrupas los cuadros y los puños (esto no lo hice, pero se puede hacer, un objeto para los puños y otro para los cuadros), sólo sería necesario un evento de colisión.

Si vas empezando, este juego quizás sea demasiado. Yo te recomendaría que antes hicieras los tutoriales básicos que aparecen en la pestaña de Tutoriales al arrancar el GMS, y después de completarlos, volvieras a este juego.