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

121
Preguntas y respuestas / Re:Con sprite o con game maker
Noviembre 07, 2015, 09:41:59 AM
¿Por qué quieres dibujar eso con código?

Desde luego que se puede dibujar por código, pero en el primer mensaje preguntas por algo eficiente, y si es así, entonces es mucho más eficiente dibujar un sprite que ya tiene la figura que dibujar varios "brazos" para los cuales se tiene que calcular la posición y/o rotación y usar funciones de dibujo de primitivas que son más demandantes. Además, en el sprite se puede incluír un degradado radial en la transparencia, cosa que no sé si se pueda lograr mediante las funciones de dibujo.

Seguramente lo ideal sería usar shaders, pero ahí sí te quedo mal.  :-[

EDITADO:
Los rayos de la izquierda son creados mediante código (primitivas, surfaces, etc). Los de la derecha pertenecen a un sprite. Yo optaría por el sprite (supongo que quedaría aun mejor si se utiliza un editor de gráficos vectoriales).
122
Cita de: NiuWeb en Noviembre 07, 2015, 06:42:27 AM
no entiendo bien a lo que te refieres, cuando escribo "#define" en el script GML me aparece error, así que no sé en dónde debe ir este #define...
Exactamente, sí se escribe desde el editor de scripts de GML dará error porque no es una palabra que reconozca el compilador.

Mira este artículo.
http://gmc.yoyogames.com/index.php?showtopic=537612

Descarga el zip que se incluye. Dentro hay un archivo con extensión .gml. Revisa cómo está construído ese archivo.

Las extensiones se pueden crear directamente en GMS, sin necesidad de usar el Extension Maker, pero bueno, cuestión de gustos.
123
Mejor te respondo por aquí y elimino el otro post. Puedes usar una "bandera".

En el objeto en donde quieres lanzar la alarma, declara (CREATE) una variable, por ejemplo
[gml]colision = false[/gml]

Cuando se produzca la colisión, por ejemplo, en el evento de colisión, usas esa variable (bandera) para llamar por ÚNICA vez a la alarma, así:
[gml]
if (!colision)
{
     alarm[0] = valor_deseado
     colision = true                   //Al siguiente step, esta condición ya no será verdadera y no se sobreescribirá la alarma
     
}
[/gml]
124
Cita de: NiuWeb en Noviembre 06, 2015, 03:42:58 AM
1)- He visto en algunas capturas de pantalla del Extension Maker que se puede insertar un archivo GML, y dentro de él se pueden crear varias funciones. Pero no sé como hacer para indicarle al programa desde dónde a dónde va cada función.
[gml]
#define nombre_script
{
     //código del script
}
[/gml]
125
Se puede hacer de distintas maneras. Una manera es preguntar si la distancia entre el bloque y la plataforma es menor o igual all ancho del sprite del jugador, si es cierto, quiere decir que ambas estructuras están tan cerca que pueden aplastar/comprimir al jugador. Luego, se pregunta si el jugador está en medio de las dos.
[gml]
if abs(obj_plataform.x - obj_block.x) <= 32   //Estoy suponiendo que el ancho del sprite del jugador es aprox. 32 pixeles
{
     if (obj_player.x > obj_bloque.x) and (obj_player.x < obj_plataforma)
          muerte = true        //El jugador muere. Aplastamiento: bloque - jugador - plataforma
     else if (obj_player.x > obj_plataforma.x) and (obj_player.x < obj_bloque)
          muerte = true         //El jugador muere. Aplastamiento: plataforma - jugador - bloque
}
[/gml]
Esto es una idea básica. Esto sólo funciona si idealmente hay una sola plataforma y un solo bloque. Obviamente la idea se puede extender para más plataformas y más bloques, pero entonces se tendría que crear un método para identificar qué plataforma y qué bloques se van a usar en las comparaciones de los ifs anteriores (mediante identificadores de instancia)
126
Preguntas y respuestas / Re:Girar el player
Noviembre 05, 2015, 07:03:37 AM
Sería algo parecido a esto:
CREATE
[gml]
inicio = phy_rotation   //Al inicio, determinar el ángulo original de la instancia
rotar = false;             //Bandera para activar/desactivar rotación
mag_giro = 3             //Magnitud del giro
puntos = 0                 //Puntos por giro
[/gml]
Cuando se quiera comenzar a gira la instancia, se tiene que hacer rotar = true. Luego, en STEP
[gml]
if (rotar)
     phy_rotation += mag_giro
     
if abs(phy_rotation) >= inicio + 360
{
     inicio = abs(phy_rotation)
     puntos += 10             //Sumar puntos al completar un giro
}
[/gml]

Para detener el giro, se debe poner la variable rotar en false. Puede que me falte algo, pero la idea es esa.
127
Cita de: Clamud en Noviembre 03, 2015, 08:26:57 PM
Existen muchas formas de resolver el problema
Aquí se discuten unas cuantas, si es que alguien se siente curioso por experimentar:
http://math.stackexchange.com/questions/190111/how-to-check-if-a-point-is-inside-a-rectangle
128
Preguntas y respuestas / Re:seleccionar partent con gml
Noviembre 03, 2015, 07:20:53 PM
No hay función (se eliminó) para volver padre a un objeto.

Sólo existe la función para conocer qué objeto es el padre de otro (object_get_parent) o para saber si un objeto es padre de otro (object_is_ancestor).

Ya muy apurado, se puede encontrar alguna solución mañosa para crear una relación padre-hijo en objetos en tiempo de ejecución, aunque no va a funcionar exactamente igual ni tan fácil como si existiera la función.

Por ejemplo, una instancia puede contener una variable de nombre "padre", y en el momento en que se quiera darle un padre a esa instancia, se le asigna el índice de objeto deseado a dicha variable (mediante object_index), y para indicar que la instancia no tiene padre, se puede usar el valor "noone" en la misma variable. Luego, si se quiere hacer una operación en todos los hijos de X padre, se haría:
[gml]
with (obj_hijos)
{
     if padre = object_index(obj_padre)
     {
            //Operaciones
     }
}
[/gml]
129
En el evento Room_start o en el evento CREATE de un objeto controlador que esté presente en la primera habitación, o en el evento CREATION_CODE de la primera habitación:

[gml]
if !audio_is_playing(snd_musicaFondo)
     audio_play_sound(snd_musicaFondo)
[/gml]
130
Otra manera de hacerlo, si acaso quisieras evitar el realizar cálculos es crear un objeto "genérico" para representar a cualquier rectángulo (obj_rectangle) y hacer un scrip del estilo

punto_en_rectangulo(x1, y1, x2, y2, px, py, angulo)

1. El script crearía una instancia del obj_rectángulo
2. El script definiría una surface de las medidas dadas por los primeros 4 argumentos
3. En la surface, se dibujaría un rectángulo sólido igual a la medida de la surface.
4. El script usaría la función sprite_add_from_surface() junto con la surface previa para crear un sprite y asignárselo (sprite_index) a la instancia del obj_rectángulo recién creada
5. El script rotaría la instancia rectangular mediante image_angle según el argumento final del script.
6. El script devolvería true o false dependiendo de si la función collision_point() detecta que hay colisión con el rectángulo, en el punto dado por px,y py.

Habiendo resuelto la colisión, se puede destruír el rectángulo creado (lo que se puede hacer dentro o fuera del script).
131
El parent es en principio un objeto vacío, sólo necesitas darle un nombre. Luego, para hacer que OTRO objeto sea hijo de ese parent, usas el botón parent (en ese otro objeto). El parent también puede contener código, pero eso es harina de otro costal y no es necesario para el caso de este hilo.



Más información:
http://docs.yoyogames.com/source/dadiospice/001_advanced%20use/more%20about%20objects/parents.html
132
Si los objetos que abren las puertas son objetos distintos en el árbol de recursos, entonces a todos esos objetos les puedes asignar un MISMO objeto padre (botón "parent") vacío (sin código ni sprite), como mencionó antes Guacusio.

Despues, en el código original, cambias obj_player por el nombre del objeto parent y con eso, los tres objetos podrían abrir la puerta.
133
Si las tres instancias jugador pertenecen al mismo objeto, puedes cambiar el código en [STEP] a
[gml]
if instance_nearest(x, y, obj_player)  < 64
     sprite_index = spr_puerta_abierta
else
     sprite_index = spr_puerta_cerrada
[/gml]

134
Aquí dejo este ejemplo que parece comportarse parecido a la explicación que diste (si es que entendí)

En el ejemplo, las variables a y b son los ángulos límites: a = 90° (donde inicia el giro) y b = 200° (donde termina)
http://www.mediafire.com/download/myn5h3a87jqbi7j/rotacion.gmz

El ángulo máyor debe calcularse si es que alguno de los ángulos límites se encuentra en los cuadrantes 3 y 4. El ejemplo no está muy desarrollado y puede no haga exactamente lo que buscas, pero probablemente sirva de guía. Hacer click en el botón azul para que el objeto comience a girar.

Lo que hace el script angle_max(), es que cambia el ángulo b = °200 a un valor de -160
135
Preguntas y respuestas / Re:DETENER MOVE_TOWARDS
Noviembre 01, 2015, 10:10:42 PM
Cita de: nonoroman en Noviembre 01, 2015, 09:59:47 PM
cuando colisiona con otro personaje B, este personaje A, no se detiene, veo como su sprite cambia debido a la colision, pero ignora el movimiento de detenerse
¿Qué código usas para detenerlo? Probablemente ese código es es lo que provoca la falla.

La función  move_towards_point() no se detiene al haber una colisión, de hecho, no se detiene ni siquiera al llegar al punto indicado, sino que es el programador el encargado de especificar qué hacer al llegar al destino.

Cita de: nonoroman en Noviembre 01, 2015, 09:59:47 PM
Y aqui, la gran pregunta. Como anulo esa orden ya cargada del move_towards???
Lo que hace la función es darle un valor a la variable speed. El ejemplo del manual ilustra justamente cómo "anular" la orden de movimiento:
Citarif point_distance(x, y, target.x, target.y) > 5
   {
   move_towards_point(target.x, target.y, 5);
   }
else speed = 0;

Si no se está cerca del punto target, se aplica un movimiento hacia ese punto con velocidad de 5, de lo contrario (se llegó al punto), la velocidad de la instancia se hace 0 para detener su movimiento.

Una alternativa que quizás te parezca mejor es usar la función mp_linear_step() que sí detiene la instancia al llegar al punto indicado (o al chocar con un objeto)
http://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/motion%20planning/mp_linear_step.html