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

91
y el muro lo estas dibujando antes o después de las esferas? tienes que dibujar en este caso las esferas primero y luego el muro para que de ese modo solo se vean afectados los primeros objetos y no haya nada previamente dibujado que pueda causar problemas...

EDIT: el tema es que no se puede desactivar para una instancia aislada, se desactiva en relación a lo que haya dibujado en ese momento, por lo que si tienes 4 esferas alineadas y quieres que un par no interfiera con el otro entonces vas a tener que mirar nuevamente el orden de dibujo, ya que si por decir dibujas primero las 2 cercanas y luego las 2 lejanas, así hayas desactivado y activado a tiempo, cuando vas a dibujar las 2 lejanas ellas trabajan sobre las 2 cercanas porque ya estaban dibujadas.
92
Hola,

No creo que se pueda solucionar con d3d_set_zwriteenable ya que aunque esta función ignora el orden de pintado, dibuja igualmente uno por encima del otro, es decir que si tienes una esfera cerca y a lo lejos otra esfera puedes ver que la otra esfera se dibuja de forma pequeña sobre la esfera que esta mas cerca (siempre que el orden de dibujo sea primero la cercana y luego la lejana)

La mejor forma de solucionar ese problema es ordenando el dibujado de las instancias pero creo que para ayudarte mejor me podrías decir que tipo de geometría y textura estas intentando renderizar.

Igualmente el orden de dibujo siempre es aconsejable dibujar todas las instancias que sean opacas primero y luego las instancias con transparencia de la mas lejana a la mas cercana a la cámara.

Saludos.
93
Hola, (recuerda poner el icono de la versión de GM que usas en el titulo del tema)

Pues como respuesta corta: si, si es posible, ahora bien, si no estas muy familiarizado con Game Maker y en especial sobre como dibujar sprites (y preferiblemente un poco de GML) te va a resultar complejo entenderlo e implementarlo, pero básicamente funciona así:

supongamos que tienes un objeto "obj_personaje" y en el evento create declaras 2 variables "casco=-1" y "armadura=-1"

ahora bien, si quieres que el personaje tenga una armadura entonces a la variable de "armadura" le asignas digamos el sprite de la armadura: "armadura=spr_armadura", lo mismo para el casco.

Lo ultimo sería en el evento draw tendrías que dibujar tu personaje partes por partes:

[gml]
// Cuerpo base del personaje
draw_sprite(sprite_index, image_index, x, y);

// Armadura solo si tiene una
if (armadura != -1){
    draw_sprite(armadura, image_index, x, y);
}

// Casco solo si tiene uno
if (casco != -1){
    draw_sprite(casco, image_index, x, y);
}
[/gml]

Puede volverse mas complejo si estas usando sprites con muchas animaciones...

Saludos
94
Sacado del manual:

Citar
random()

NOTE: This function will return the same value every time the game is run afresh due to the fact that GameMaker: Studio generates the same initial random seed every time to make debugging code a far easier task. To avoid this behaviour use randomize at the start of your game.

(Esta función retorna el mismo valor cuando el juego es ejecutado, esto se debe a que Game Maker Studio genera la misma semilla inicial para hacer la tarea de depurar el código mas fácil. Para evitar este comportamiento utiliza la función randomize al inicio de tu juego.)
95
General / Re:¿que estudiamos o de que trabajamos?
Septiembre 08, 2015, 04:20:56 PM
Trabajo como backend developer, trabajé durante año y medio en 2 empresas de juegos de mi ciudad pero como la industria es tan pequeña aquí no me sentí a gusto, espero poder trabajar en una empresa de juegos mas grande en el futuro.

Estoy estudiando ing de sistemas pero ahora ando tomando un descanso del estudio así que por ahora solo trabajando.
96
Preguntas y respuestas / Re:Como narrar con texto?
Agosto 26, 2015, 05:34:11 AM
Hola,

Una forma de lograrlo es tener 2 variables: texto y texto a mostrar y lo que haces es copiar el contenido de texto letra por letra a la otra variable, algo así:

[gml]
// EV_CREATE
texto = "Prueba de copiado de texto";
textoRender = "";
alarm[0] = 3;
[/gml]

vamos a colocar el código de copiar letra por letra en una alarma para poder controlarla con una velocidad (3):

[gml]
// EV_ALARM[0]
// Ejecutar siempre que los textos sean diferentes
if (textoRender != texto){
    // string_length nos dice cuantos caracteres tiene un string que a la vez nos indica hasta que posición debemos copiar
    var ind = string_length(textoRender);
    textoRender = string_copy(texto, 1, ind + 1);

    // Llamamos nuevamente a la alarma para copiar el siguiente caracter
    alarm[0] = 3;
}
[/gml]

Y ya lo único que resta es dibujar el textoRender.

Saludos 8)
97
Hola a todos, por aquí con un problema que no me quiere dejar avanzar :-[

Básicamente tengo el siguiente script para obtener un arma de una lista global:
[gml]
if (ds_list_empty(global.P_ITEMS)) return undefined;

var len = ds_list_size(global.P_ITEMS);
var i;

for (i=0;i<len;i+=1){
    var item = ds_list_find_value(global.P_ITEMS, i);
   
    if (!is_undefined(item)){
        if (item[WP_TYPE] == WEAPON && item[WP_EQUIPED]){
            return item;
        }
    }
}

return undefined;
[/gml]

Me esta tirando este error cuando intento ejecutarlo:


DoSet :: Invalid comparison type
at gml_Script_scr_PlayerGetWeapon (line 1) - if (ds_list_empty(global.P_ITEMS)) return undefined;


Pensé que era algún problema por el undefined, pero hago un script solo con esa linea y funciona bien, también lo probé con solo retornar el ds_list_find_value y también funcionó...

Creo que el error se debe a la combinación de lineas que tiene este script, pero no logro ver en que esta mal  :-\

Saludos 8)

EDIT:

Si modifico la linea:

[gml]var item = ds_list_find_value(global.P_ITEMS, i);[/gml]

por

[gml]return ds_list_find_value(global.P_ITEMS, i);[/gml]

funciona, al parecer el problema esta al intentar asignar ese valor (array) a esa variable, pero... por que?

EDIT 2:

Ya encontré el error :-[ el problema era la comparación de: (item[WP_TYPE] == WEAPON) ya que item[WP_TYPE] era string y WEAPON era un entero, jeje en fin, gracias por su atención
98
Preguntas y respuestas / Re:dot_product/normalized
Agosto 21, 2015, 02:14:34 PM
Tu ejemplo esta bien, trabajemos con el :)

dot_product(2,4,5,7) significa que tienes 2 vectores [2, 4] y [5, 7] el producto punto es tal cual dijiste: 2*5+4*7 = 10+28 = 38, ahora bien, vamos a normalizarlos, primero tenemos que hallar la longitud de ambos vectores:


A = [2, 4]
B = [5, 7]

// La longitud es la raiz cuadrada de la suma de cada uno de sus componentes al cuadrado y siempre será  mayor a el valor de cada uno de sus componentes
|A| = sqrt(2*2 + 4*4) = 4.4721...
|B| = sqrt(5*5 + 7*7) = 8.6023...


Y ahora normalizamos los vectores dividiendo cada uno de sus componentes por sus longitudes:


An = A/|A| = [2, 4] / 4.4721 = [2 / 4.4721, 4 / 4.4721] = [0.44, 0.89]
Bn = B/|B| = [5, 7] / 8.6023 = [5 / 8.6023, 7 / 8.6023] = [0.58, 0.81]

// Algo extra: si intentas obtener la longitud de un vector normalizado, el resultado será 1
|An| = sqrt(0.44*0.44 + 0.89*0.89) = 0.9928...
(Como eliminamos algunos decimales en los pasos previos el resultado no es 1)


Ahora, con los nuevos vectores obtenidos, hagamos el producto punto:


An = [0.44, 0.89]
Bn = [0.58, 0.81]

An · Bn = 0.44*0.58 + 0.89*0.81 = 0.2552 + 0.7209 = 0.9761


Obtuvimos un valor diferente (entre -1 y 1) al normalizar los vectores.

Ahora bien, aquí se pone interesante la cosa, para que sirve todo esto?? hay varios usos, como por ejemplo saber si un personaje esta siendo visto por otro, pero te daré uno de mis favoritos, como saber si una superficie debe ser iluminada por una luz:



en esta imagen tenemos 2 vectores: el vector normal (que expresa en que dirección esta la superficie mirando) y el vector de la dirección de la luz, para efectos de estos cálculos necesitamos invertir la dirección de la luz.

Ahora bien, debes entender como funciona el coseno ya que el producto punto es el coseno entre el angulo de ambos vectores y va de -1 a 1:



Ahora, si sacamos el producto punto entre el vector normal y la dirección inversa de la luz vamos a obtener algo similar a esto:



Suponiendo que ambos vectores están normalizados, esta operación nos retornara algún valor entre -1 y 1 y si lo comparamos con la grafica de coseno entonces podemos deducir que, si el angulo entre ambos vectores es mayor a 0 y menor a 90, entonces el producto punto nos retornara algo entre 0 y 1, y si es mayor a 90 nos retornara algo entre 0 y -1.

es decir, si el angulo entre ambos vectores es menor a 90 (valores 0-1) la superficie esta iluminada (y multiplicamos ese valor de 0-1 por la intensidad de la luz) y es mayor a 90 (valores 0-(-1)) la superficie no esta iluminada (e ignoramos el caso).

El resultado de esto?



Ya se que es un ejemplo super complejo (puede que no me haya expresado tampoco tan bien, la verdad tengo poco tiempo ahora  :-[ ) pero, este es un ejemplo del mundo real, y a partir de esto salen muchos mas efectos (mas complejos) para lograr cosas mas interesantes.

La verdad, este tipo de operaciones solo las he usado para 3D, así que lo mas probable es que no las tengas que usar mucho (a menos que te guste esta área)

Bueno, ahora si...

Saludos  8)
99
Preguntas y respuestas / Re:no volver hacia atras
Agosto 21, 2015, 01:28:41 PM
Podrías hacerlo así:

Haz que la view no siga al personaje y en cambio coloca esto en el evento create del personaje:

[gml]
// EV_CREATE:
view_max_x = view_xview[0];
[/gml]

y en el step

[gml]
// EV_STEP:
var xx = x - view_wview[0] / 2; // Considerando que quieras que el personaje este en el centro de la view
view_max_x = max(xx, view_max_x);
view_xview[0] = view_max_x;
[/gml]

Esto hará que la view solo se mueva a la derecha, si quieres detener al personaje para que no avance hacia la izquierda (y se salga de la view) puedes poner un solido o controlarlo por código, depende de como estes trabajando las colisiones

Saludos 8)

EDIT: Gracias penumbra, error de tipeo, ya quedó corregido
100
Preguntas y respuestas / Re:dot_product/normalized
Agosto 21, 2015, 01:10:44 PM
Hola,

Pues así mismo como dice el manual, la diferencia esta entre que el normalized retorna valores entre -1 y 1. El producto punto de dos vectores es el coseno del angulo resultante entre ambos vectores y esta expresado como:

[x1,y1] · [x2,y2] = x1*x2 + y1*y2

Sin embargo, en la mayoría de ocasiones cuando se esta trabajando con vectores se requieren que los vectores estén normalizados, esto facilita hacer varios cálculos como cuando se esta trabajando con luces, normalizar un vector significa dividir cada uno de sus componentes por su longitud, y de este modo el vector queda expresado en valores de -1 a 1


vector = [x1, y1];
length = sqrt(x1 * x1 + y1 * y1); // Teorema de pitagoras

normalized = [x1 / length, y1 / length]; // Siempre serán entre -1 y 1


Si luego haces el producto punto entre 2 vectores que están normalizados (osea que solo haces multiplicaciones con valores de -1 y 1) entonces obtendrás valores entre -1 y 1.

Saludos 8)
101
Juegos en desarrollo / Re:Maganics War
Agosto 20, 2015, 06:24:58 AM
Hola,

Me ha gustado bastante el juego, aunque no lo he podido jugar mucho por ahora :-[ , en lo que he visto hasta el momento me ha gustado casi todo, tal vez sería algo bueno añadir algún tipo de leyenda o mensaje a las cartas (un poco de lore) y tal vez algún modo tutorial donde te expliquen alguna estrategia básica.

Te aconsejaría que le prestaras un poco de atención a la parte gráfica para tratar de lograr una consistencia entre todos los elementos, hay sprites que se ven borrosos o la escala de pixeles es diferente al de los personajes, también tratar de usar una fuente mas pixelada y menos comic sans (creo yo, jeje).

Luego continuo jugandolo y tal vez te de mas feedback, pero por ahora me interesó la idea.

Saludos.
102
Preguntas y respuestas / Re:Problema con las Views
Agosto 18, 2015, 09:23:37 PM
Hola,

No se si hay alguna función o algo hecho  :-[ , pero puedes lograrlo de forma manual, seteando la view para que no siga al jugador, y luego en el evento step chequeas si la posición del jugador es mayor o igual al borde derecho (o izquierdo) de la view, y si es así, puedes hacer un efecto de scroll o mover la view instantáneamente, dependiendo del efecto que quieras.

Saludos.
103
Preguntas y respuestas / Re:Problema con los mensajes
Agosto 18, 2015, 07:06:45 PM
Hola,

Podrías colocarlo con una alarma que se dispare a los 2 segundos (creo que algo como room_speed * 2 sirve, pero no recuerdo bien) y que luego desaparezca el texto.

Saludos.
104
Preguntas y respuestas / Re:Enemigo ataca
Noviembre 27, 2014, 09:17:33 PM
Bueno tu mismo tienes la idea de como hacerlo, con una alarma y que dentro de ese tiempo no se pueda hacer mas daño, por ejemplo supon que añades una variable al objeto del jugador

[gml]invulnerable = false;[/gml]

luego en el evento de colisión contra el enemigo (en el objeto del jugador) añades esto:

[gml]
// Que solo haga daño si no es invulnerable
if (invulnerable == false){
    // Aquí iría tu código de hacer daño
    invulnerable = true;
    alarm[0] = 30; // 1 Segundo si tu habitación corre a 30fps
}
[/gml]

De este modo solo hará daño una vez, que sería cuando toque al personaje, luego ya sería cuestión de restablecerlo en el evento de la alarma

[gml]
invulnerable = false; // Puede volver a recibir daño.
[/gml]
105
Hola,

Game Maker Language es en verdad un lenguaje potente pero no tiene el modo de clases, interfaces, herencias, etc que trae otros lenguajes de programación, sin embargo no significa que no se puedan hacer herencias y jerarquías entre objetos, hay una propiedad que tienen los objetos que se llama "parent" que es básicamente lo mismo, hereda las acciones y reacciones de algún objeto mientras añades cualidades especificas a este objeto.

Saludos