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

736
Preguntas y respuestas / Re:Como crear juego
Marzo 01, 2015, 04:35:13 PM
Habría cuatro objetos:

obj_punoVerde
obj_punoRojo
obj_cuadroVerde
obj_cuadroRojo

a cada objeto, en su evento create les asignas una variable: (sólo una de las dos líneas siguientes, NO LAS DOS A LA VEZ)
[gml]color = "verde"     //si el objeto es verde
color = "rojo"       //si el objeto es rojo[/gml]

Creas un objeto obParentCuadros(vacío, es decir, sin eventos) , y lo haces padre de los dos objetos obj_cuadro


Agregas un evento de colisión en el obj_punoVerde contra el objeto obParentCuadros
[gml]if (color == other.color)
{
      //EL color coincide, agregar acciones pertinentes (sumar al score, etc)
     with(other) { instance_destroy() }    //Destruír el cuadro verde
}
else
{
     game_restart()     //El color no coincide, se termina el juego
}
[/gml]

Sería lo mismo para el puño rojo. ¿Qué falta? Hacer que al presionar un botón se haga la animación del puño avanzando hacia el cuadro.
737
Aquí andamos, todo bien. Un saludo, the_blade.

La validación de la multiplicación se puede implementar de varias maneras, una que se me ocurre es, cambiando un poco el orden del código, es decir, lo primero que se haría es elegir la operación
[gml]
randomize()
signo = choose(0, 1, 2, 3)     //Decidimos la operación de esta "ronda"; suma = 0; resta = 1, etc.
//En caso de que la operación sea una división...
if (signo == 3)
{
     B = irandom_range(1, 10)            //Elegir al azar el divisor
     A = B * irandom_range(1, 10)        //Elegir "pseudoaleatoriamente" el dividendo: A depende de B (A es múltiplo de B, se asegura división entera)
}
else
{
    //Si la operación no es una división, se definen A y B de manera "normal"
    A = irandom(100)
    B = irandom(100)
}
[/gml]
738
Para que las operaciones sean aleatorias, necesitas agregar la función randomize(), de lo contrario se van a repetir siempre en el mismo orden.

Quizás no entendí correctamente lo que quieres lograr (no me fijé en el código), pero según lo que capté, si las operaciones son binarias siempre van a tener dos miembros, por ejemplo A + B, se me ocurre tener dos variables, una para guardar el miembro A y otra para B, por ejemplo

[gml]
randomize()
A = irandom(100)
B = irandom(100)
[/gml]

Luego, tener un arreglo de cuatro elementos, porque hay cuatro operaciones (pensando en las operaciones básicas)
[gml]
operacion[0] = A + B
operacion[1] = A - B
operacion[2] = A * B
operacion[3] = A / B
[/gml]

Definir qué operación se elige[gml]
signo = choose(0, 1, 2, 3)     //Esto se puede colocar arriba, donde se definen A y B. suma = 0; resta = 1, etc.[/gml]

Elegir el resultado de la operación actual:
[gml]resultado = operacion[signo][/gml]

En el evento donde se presiona el BOTÓN DE SUMA:
[gml]
if (A + B) == resultado
     //Se acertó en la elección del signo[/gml]

En el evento donde se presiona el BOTÓN DE RESTA:
[gml]
if (A - B) == resultado
     //Se acertó en la elección del signo[/gml]

Los 4 primeros bloques de código se pueden juntar en un solo script, que se llamaría cada vez que se quisiera realizar una nueva operación, así quedaría más limpio el código.

Es una idea simple. Se necesita pulirla más, por ejemplo, si es un juego para chicos, pues no sería justo que la división arrojara un cociente no entero, o que el cociente fuera  un número decimal menor a 1, por lo que A debería ser múltiplo de B (en el caso de la división. En el caso de la resta, se debe asegurar que A sea mayor a B para no obtener números negativos, si no se quiere)
739
Si la trayectoria de la torre al enemigo es simple, como ir en línea recta (ya sea horizontalmente, verticalmente, o en una sola dirección todo el tiempo), la solución más sencilla es darle velocidad y dirección (o aumentar x/y) a los autos para que avancen

Si la trayectoria NO ES simple, es decir, que se debe cambiar de dirección al menos una vez para llegar al objetivo, entonces (al menos es mi idea) yo usaría alguna de las funciones de planeación de movimiento para calcular una trayectoria entre la torre y el enemigo más cercano.

http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/motion%20planning/index.html
740
Preguntas y respuestas / Re:Exceso de tamaño
Febrero 27, 2015, 11:05:33 PM
El aumento de tamaño es normal y creo que no se puede evitar.

El motivo es simple, GMS convierte todas las imágenes a formato PNG. Si tienes un fondo o sprite de tamaño mediano/grande en formato JPG, al final, convertido en PNG ocupará mucho más espacio. hasta donde sé, no hay manera de decirle a GMS que no convierta las imágenes a PNG.
741
Si ya tienes la tercera imagen, lo que falta es mostrar esa surface, pero "quitándole" lo blanco. Hasta donde entiendo, para hacerlo tienes dos opciones.

1) La fácil: usar un modo blending adecuado en el evento DRAW, para dibujar la surface sin que se vea lo blanco.

2) La difícil: usar un shader para detectar un rango/tonalidad en específico y remover esos pixeles (borrar los pixeles blancos).

Aquí se explican los blending mode
https://www.yoyogames.com/tech_blog/68
https://www.yoyogames.com/tech_blog/69

Este ejemplo te puede resultar útil
http://gmc.yoyogames.com/index.php?showtopic=512187
742
http://www.comunidadgm.org/preguntas-y-respuestas/que-es-un-surface/msg93169/#msg93169

Game Maker Studio incluye dos tutoriales explicando qué son las surfaces y su uso, un tutorial básico para principiantes y otro más avanzado. Mi sugerencia es que al menos hagas el primero, si es que te interesa entender el asunto de las surfaces.
743
Preguntas y respuestas / Re:problema con virtual keys
Febrero 27, 2015, 08:04:17 PM
Los códigos que pusiste son para crear la tecla virtual y dibujarla, lo cual me parece que no tiene relación con el problema, que es que la tecla parece que se queda presionada. El código importante es el que detecta la pulsación de la tecla, pero probablemente eso esté bien (a menos que hagas algo raro)

Yo probaría a llamar a la función io_clear en un evento ROOM START (o CREATE, si es que el objeto que controla las teclas virtuales NO es persistente) para asegurarme que cualquier estado del teclado/ratón se limpia.
http://docs.yoyogames.com/source/dadiospice/002_reference/mouse,%20keyboard%20and%20other%20controls/keyboard%20input/io_clear.html

744
¿Qué es lo que hace que ocurra X y qué es lo que jace que ocurra Y? ¿O en qué momento ocurre X y cuándo Y?

Cuando pase X o Y, ajusta image_index al número de subimagen con la que quieres empezar, esa es la solución básica, pero casi apostaría a que al hacerlo podrían presentarse algunas fallas menores si no se toman ciertas "precauciones"
745
¿Podrías dar más detalles de lo que quieres lograr?

image_index cambia la subimagen del sprite. Suponiendo que un sprite tiene 5 subimágenes, que image_speed es 0 (no va a animarse) y que se quiere mostrar la cuarta subimagen.
image_index = 3

Si el sprite neecsita animarse (image_speed mayor a cero) y se quiere indicar que empiece en una subimagen distinta de la primera, entonces image_index tiene que ajustarse en un evento no recurrente (no step, ni draw) o si se usa step/draw, es necesario usar una condición o una función "especial" para que ese cambio ocurra una vez, de lo contrario, sólo se va a mostrar una sola subimagen.
746
Otra manera, sin depender del evento de colisión, sería que al crear una flecha/bala (por ejemplo, un evento keypress de una tecla)

with (instance_create(x,y, obj_flecha) )
{
     Alcance = other.alcance
     Dano=other.Dano
     speed = other.Vel      //Esto haría que la flecha de inmediato tuviera velocidad y se moviera
     origen = other.id       //Por si se quiere "marcar" la flecha para saber qué torre la creó.
}

Aunque todos los métodos son más o menos lo mismo  XD

747
Lo que pasa es que si se usa el evento de colisión (como especificó en el comentario original), no es necesario usar una variable "origen", porque la palabra especial other ya se refiere a la instancia de la cual quiere leer las variables.

Si en lugar del evento de colisión se quiere usar otro lugar, entonces sí habría que utilizar una variable para guardar el id de instancia.
748
Comprendo lo que quieres hacer, pero la explicación me resulta confusa.

Cita de: bcortesl@gmail.com en Febrero 25, 2015, 12:57:55 AM
Tengo entendido que lo que estoy haciendo es lo siguiente.
La flecha se crea con 'origen=0'. Al colisionar con la torre (que lo hace al momento de ser creada) le digo que si el origen=0, que tome el origen de la torre (other.id).
Es correcta esta interpretación?
A lo que tú le llamas origen, se le conoce como identificador de instancia. origen es otra cosa: es el punto que indica la posición de un objeto, definido en las propiedades del sprite de ese objeto. Y sí es posible: el identificador de instancia "A" se puede guardar en una variable de otra instancia "B" al momento que se crea esta segunda instancia.

Cita de: bcortesl@gmail.com en Febrero 25, 2015, 12:57:55 AM
Pensé que debía especificarle a la flecha que también debe tomar los valores de dano, alcance y Vel de la torre. 

Bien, lo que puse en la colisión de la flecha con el enemigo fue

Hp-=Dano;

Pero no se hacerle saber al programa que lo que me refiero a Dano es a los valores de la torre flecha.
Disculpa, lo que pasa es que ahora me doy cuenta que usas el evento colisión para darle valores a las flechas cuando se crean. Es una manera algo inusual, porque la mayoría de las veces el evento colisión se usa para restar vida, pero tú lo usas justo cuando se crea la flecha para asignar variables, eso me confundió. La asignación sería (si se usa el evento de colisión)
[gml]if origen=0
{
   origen=other.origen
   Alcance=other.Alcance
   Dano=other.Dano
   Vel=other.Vel
}[/gml]
Suponiendo que las variables de la torre tienen el mismo nombre que las de la flecha

El error es porque al momento de querer restarle el Dano, la variable "Hp" no está inicializada, La debes definir en el evento CREATE (Hp = 100, por decir algo).






749
Procura poner siempre el mensaje de error. Así es más fácil para lo demás entender la falla.

Lo que pasa es que  esto no es correcto:
if origen=0
{
origen=other.id;
Alcance=other.id;
Dano=other.id;
Vel=other.id;
}

a 4 variables (muy distintas entre sí) les estás dando el mismo valor, esto no tiene sentido. Y aun más, ese valor es el identificador de instancia de la otra instancia implicada en la colisión. En este código, no hay nada que reste o quite vida. para quitar vida, sería.
[gml]if origen=0
{
     vida -=other.Dano      //Restar el valor de Dano a la variable vida (la variable vida debe estar inicializada en CREATE)
}[/gml]

Cita de: bcortesl@gmail.com en Febrero 25, 2015, 12:23:43 AM
Lo más cercano que logré fue que en el obj_EnemigoEsqueleto agregué un evento de colisión con la FLECHA y agregué el siguiente SCRIPT:

if place_meeting(x,y,obj_EnemyParent)
{
obj_EnemyParent.Hp-=Dano;
}

pero el resultado fue que al eliminar a 1 enemigo, eliminó a todos los que estaban en la pantalla. No sé por qué será.

Eliminó a todos porque te estás refiriéndote a TODAS las instancias. En GM, si tú le quitas vida a UN OBJETO, entonces, todas las instancias de ese objeto que existan en la habitación van a recibir el daño, ya sea que haya una instancia, diez instancias o cien instancias.
Solución: No quitarle vida a un objeto, sino sólo a UNA de las instancias de ese objeto.
750
Juegos en desarrollo / Re:Iliada Espacial
Febrero 24, 2015, 11:27:04 PM
1 ¿Por qué insistes en usar una dirección privada?
2 ¿Exactamente qué pasos estás haciendo para colocar la página en línea?

Forzosamente necesitas buscar un proovedor de servicios de hosting, registrarte en su sitio y mandar tu página a su servidor mediante la herramienta que ellos te indiquen o te provean. Difícilmente la dirección "final" (con la que cualquiera puede ver la página en línea) que te otorgue el proovedor va a comenzar con un número IP, sino que va a tener una url, así como www.comunidadgm.org