Noviembre 06, 2009, 04:39:32 PM Ultima modificación: Noviembre 06, 2009, 05:05:12 PM por Megisto
Hola, aqu? de nuevo, tengo otra duda.
En mi juego 2d shooter, con visi?n desde arriba, he creado enemigos que se desplazan en una secuencia y al estar a determinada distancia de mi personaje-jugador lo persiguen. Lo malo es que si el personaje se aleja a la distancia que prefij?, estos nuevamente adoptan el movimiento inicial (es como si se resignaran a seguir a mi h?roe, ajjaa)
El otro problema al respecto que tengo es hacer que estos al estar en l?nea recta, vertical, horizontal o diagonal y s?lo si est?n de frente al personaje le disparen. (Para crear el efecto de que si lo "ven venir" le disparen y tambi?n se le acerquen)
Gracias

El enemigo:

if direction+5 > direction_point(x,y,jugador.x,jugador.y)
&& direction-5 < direction_point(x,y,jugador.x,jugador.y)
{
dispara = true;
}

algo asi es.. no lo fije.. no tengo el GM ahorita.. nos vemos

Bueno, eso ocurre por el el comandi seguir se desactiva cuando la condicion no se cumple. En tu caso haria esto:
en create pondira esta variable:

perseguir=false.

y en step
if( direction_point(x,y,jugador.x,jugador.y)< XX or perseguir==true)
{
perseguir=true;
{move_towards_point(personaje.x,personaje.y,5);}
}

aun que igual no tengo el GM para asegurarte nada, pero no veo el por q no ha de servir.

No consigo lo siguiente.
Que los enemigos se acerquen lo logr?, gracias, pero esto necesito hacer.

Si el enemigo se mueve hacia una direcci?n, ya sea N,S,E,O como NE, NO, SO y SE y s?lo delante de ?l est? el personaje, le dispare.


Por lo que he podido entender,  es que t? quieres que el enemigo le dispare a tu personaje s?lo cuando lo est? mirando. Asumo, que si el enemigo est? de espaldas, no disparar?.

Utiliza en el evento STEP de tu enemigo la funci?n collision_line(). Est? funci?n detecta la colisi?n de un objeto (en este caso tu h?roe) y una l?nea definida. el uso es as?:

collision_line(x, y, x + <distancia>, y + <distancia>, ob_heroe, 1, 1);

Los dos primeros par?metros son el punto de partida. Los otros dos siguientes, el punto de llegada de la l?nea.

X,Y son las coordenadas del enemigo. Distancia, es la distancia en la que detectar? al h?roe. De tal manera tienes una l?nea que parte desde el centro del enemigo hacia delante de ?l a cierta distancia (esa l?nea no se dibuja). Cuando esa l?nea choque con el personaje, el enemigo disparar? (debes crear un c?digo para esto).

Ahora, obviamente, t? esperas que esa l?nea se cree en las direcciones N S E O y combinaciones entre ellas. Ah? tendr?s que aplicar un poco de geometr?a y trigonometr?a... A qu? programador no le gusta las matem?ticas?

Aqu? dejo un ejemplo colgado de c?mo conseguir que un objeto gire alrededor de otro. De este ejemplo, puedes extraer las funciones matem?ticas que servir?n para definir la l?nea de visi?n.

Suerte!

en realidad no s? nada de trignonometr?a.
si alguien puede ayudarme con m?s especificidad le estar?a m?s agradecido.

Espec?ficamente? Jeje. No creo que se pueda, a menos que quieras que el juego lo hagan otros.

No te desanimes, no es algo complicado, al final todo termina siendo repetitivo y los c?lculos los terminas haciendo una sola vez.

Por cierto, no encuentro esa DLL llamada "superglu". ?Qu? hace espec?ficamente?

No es que pretenda que otros hagan mi juego por m?, yo pido ayuda en cosas espec?ficas.
Sobre c?lculos, no s? ni como hacerlo porque siempre fui un queso en matem?tica y no s? nada de trigonometr?a, no s? que es un seno, coseno ni tangente ni nada de eso y estoy bastante viejo para entenderlo ahora.
Por supuesto que termina siendo repetitivo, pero no todos los programadores se saben de a la A a la Z la creaci?n de c?lculos avanzados.

Con respecto al comando collision_line

collision_line(x, y, x + <distancia>, y + <distancia>, ob_heroe, 1, 1);

?c?mo se aplica esto?
?es un bloque if?
?que son los 1,1 del final?


Por favor, si alguien me puede ayudar de verdad y decirme c?mo lo aplico, estar? atento, pero para mandar mensajes a medias o criticandome por no saber trigonometr?a ya tuve suficientes.
Gracias

#8 Diciembre 01, 2009, 03:35:27 AM Ultima modificación: Diciembre 01, 2009, 12:01:59 PM por metalfox6383
En el archivo de ayuda da de forma detallada la explicaci?n de esta funci?n, el pen?ltimo par?metro es para saber si la colisi?n ser? precisa con respecto al sprite del objeto con el que colisionar?. Es decir, si te has dado cuenta, hay un color que se toma como el color transparente y no se pinta, entonces, si la colisi?n es precisa, no se tomar? en cuenta estos pixeles transparentes

Imagina un c?rculo, pero el sprite que lo contiene es un cuadrado, cierto, El c?rculo es rojo y el fondo blanco. Cuando usas ese sprite en un juego, el blanco no se pinta, lo toma como el color transparente (eso si en el sprite, esa propiedad est? marcada). Si la colisi?n no es precisa, los pixeles transparentes tambi?n forman parte de la colisi?n, pero si es precisa, no ser?n tomando en cuenta, sino, s?lo aquellos pixeles que s? se pintan.

El ?ltimo par?metro indica si es necesario que esa propiedad de precisi?n de colisi?n est? marcada en el sprite. Ponlo siempre en 1, y con ello, en el sprite que usas, marcas la propiedad "Precise collision cheking".

Sin embargo, puedes probar tambi?n poni?ndolos a 0, y notar?s los cambios haciendo pruebas.

Con respecto a la l?nea de colisi?n, eso tienes que ponerlo en el evento STEP de tu enemigo, as?:

if collision_line(x , y, x + 100*sin(degtorad(direction)), y + 100*cos(degtorad(direction)), ob_heroe, 1, 1) {
<colocar el c?digo que usar?s para disparar al personaje>
};

El XY con las coordenadas de posici?n del enemigo, "direction" es el ?ngulo al que el enemigo se est? dirigiendo. Si el angulo es 0, apunta hacia abajo, 90 apunta a la derecha, 180 hacia arriba y 270 a la izquierda.

Si no estas usando la propiedad "direction". Tendr?as que colocar esta condicional cuatro veces, una para cada direcci?n, pero tienes que usar algo como referencia que te diga exactamente hacia d?nde estas apuntando. Suponiendo que tienes 4 sprites, una para cada direccion, y el sprite 0 es abajo, 1 es derecha, 2 es arriba y 3 es izquierda:

if (sprite_index=0 and collision_line(x,y,x,100+y,ob_heroe,1,1)) {
C?DIGO DE DISPARO
};
if (sprite_index=1 and collision_line(x,y,x+100,y,ob_heroe,1,1)) {
C?DIGO DE DISPARO
};
if (sprite_index=2 and collision_line(x,y,x,y-100,ob_heroe,1,1)) {
C?DIGO DE DISPARO
};
if (sprite_index=3 and collision_line(x,y,x-100,y,ob_heroe,1,1)) {
C?DIGO DE DISPARO
};

Sin trigonometr?a  8)! Jeje. Como ir en bicicleta sin manos.

El usar las funciones amplias hace que tu c?digo sea m?s peque?o y m?s f?cil de corregir. Aunque no puedo negar que cualquiera se enreda. Por otro lado, estoy seguro que este c?digo se puede reemplazar con las herramientas correspondientes ubicadas en la derecha.

Lo que t? buscas hacer es una Inteligencia Artificial, que el objeto act?e de acuerdo a su entorno. Algo muy muy b?sico, claro, pero por lo que veo, no quieres que tu enem?go sea mon?tono, que se mueva de un lado a otro, sino que quieres que persiga, observe, que est? descuidado, etc. M?s caracter?sticas, m?s complejo es el c?digo. Eso est? bien, aumentar las necesidades.

Y no te fastidies por los comentarios, al final todos tratamos de ayudarnos. Aunque ser?a interesante hacer algunas DLL con estas funciones, no?

Por otro lado, sigon sin encontrar el Superglu.