Enero 11, 2013, 01:55:46 AM Ultima modificación: Enero 13, 2013, 08:41:37 PM por francordoba
Buenas a todos.

Llevo días estrellándome con esto sin conseguirlo.

Tengo un personaje (heroe), le siguen aliados. Estos aliados pueden variar de número. Entre 1 y 4.

Lo que intento es que cuando muera uno, cambie de formación, a la formación de tres, que sería uno en la retaguardia y dos en los flancos. Que cuando añada otro por el camino, vuelvan a tener la formación de 4.

También busco que estén a 64 de distancia entre ellos, y entre el heroe.  Hasta ahora mi resultado ha sido totalmente irregular.

El personaje gira 360º para disparar, los aliados hacen lo mismo detectando enemigos (gran logro por mi parte). PERO, cuando el heroe gire sobre si mismo cambiando su ángulo, quiero que tambien la formación entera adopte ese ángulo como expreso en el dibujo de ejemplo.

Añado que estas tropas, reciben órdenes del héroe y , 1º- o bien lo siguen en formación,2º-  o bien se quedan parados vigilando. (otro logro por mi parte). Pero claro después, cuando vuelvo a llamarlos no recuperan su uniformidad.



Uploaded with ImageShack.us

Espero haber sido claro y conciso. La desesperación me puede.

Agradezco vuestra atención.

Probá con este script:
[gml]// align_allies(len, dir, cover_angle);
var len, cover_angle, dir;
len = argument0;
dir = argument1;
cover_angle = argument2;
with (objAlly) {  // Cambiá objAlly por el nombre del objeto aliado.
    x = lengthdir_x(len, other.direction + dir);
    y = lengthdir_y(len, other.direction + dir);
    dir += cover_angle / instance_number(objAlly);  // Y acá tambien.
}[/gml]

Ejecutalo así al final de step del jugador:
[gml]align_allies(64, 170, 95);[/gml]

El primer argumento (64) es la distancia entre los aliados y el jugador.
El segundo (170) es el ángulo de covertura (con 360 tratarían de cubrir todo alrededor del jugador).
El tercer argumento (95) es el ángulo del primer aliado posicionado, relativo a la dirección en la que mira el personaje (variable direction).

No van a quedar exactamente como describiste, pero no creo que te vaya a molestar.
Vim.

Lo acabo de probar con objetos totalmente sin código para evitar problemas con el mio. Los objetos se van a la esquina superior izquierda de la pantalla y pasan olímpicamente del heroe. ?¿

Problema de coordenadas relativas?¿ no creo.

Aún así gracias por la ayuda.

He seguido haciendo pruebas y los aliados toman como referencia la esquina superior izquierda de la pantalla, pero, cuando me acerco con el heroe y lo muevo, reaccionan como mas o menos se espera. Pero claro no están alrededor del heroe...

podrias hacer un scripts con variables
osea:
en el evento destroy del aliado pon: formacion=+1
haz un objeto controlador que en create sea asi:formacion=0
y pon en el objeto aliado evento destroy:if formacion=1 sehaceloquetuquieras
if formacion=2 sehaceloquetuquieras

y asi sucesivamente.... tambien para que no se vaya hasta el infinito podrias poner este code en el evento
destroy del aliado:
if formacion=unonumeromasdeltope formacion=0
;) espero que te sirva.
CREADOR DE JUEGOS GM.


- Como hacer preguntas inteligentes
- Reglamento General

HOLA COMUNIDAD,HOLA A TODOS




uso game maker 8 pro 8) y game maker studio Master Collection

#5 Enero 11, 2013, 04:37:40 AM Ultima modificación: Enero 11, 2013, 05:00:53 AM por Wadk
Cita de: francordoba en Enero 11, 2013, 02:47:10 AMProblema de coordenadas relativas?¿ no creo.
De hecho sí, entre otras cosas xD. Error mío. Cambiá el script por este:
[gml]// align_allies(len, dir, cover_angle);
var len, cover_angle, dir;
len = argument0;
dir = argument1;
cover_angle = argument2;
with (objAlly) {  // Cambiá objAlly por el nombre del objeto aliado.
    dir += cover_angle / (instance_number(objAlly) + 1);  // Y acá tambien.
    x = other.x + lengthdir_x(len, other.direction + dir);
    y = other.y + lengthdir_y(len, other.direction + dir);
}[/gml]

y llamalo así:
[gml]align_allies(64, 95, 170);[/gml]

Esta vez está probado y debería funcionar.
Vim.

Gracias! El tema es que en bruto funciona. Pero los aliados no se mueven, si no que se teleportan. No habría una manera de que se movieran? y no pegaran un salto brusco?.



De nuevo gracias por tu labor.

Añado que los aliados vuelven a su posicion original si suelto la tecla.

Intenta usando el script de wadk de este modo.
[gml]// align_allies(len, dir, cover_angle, speed);
var len, cover_angle, dir;
len = argument0;
dir = argument1;
cover_angle = argument2;
with (objAlly) {  // Cambiá objAlly por el nombre del objeto aliado.
    dir += cover_angle / (instance_number(objAlly) + 1);  // Y acá tambien.
    x += sign(  (other.x + lengthdir_x(len, other.direction + dir)) - x ) * argument3;
    y += sign(  (other.y + lengthdir_y(len, other.direction + dir)) - y ) * argument3;
}[/gml]

Con este código literalmente no se mueven, se quedan en el sitio quietos independientemente de lo que haga.

MMM añadi un argumento al código que es la velocidad de movimiento ya chacaste eso?. Si no es eso debe ser por que tus aliados tengan algun otro codigo en step que interfiere con el script.

   Saludos makero francordoba:

   Disculpa si opino, pero la intensión es ayudar.

  Opinión:  No creo que puedas solucionar todo lo que quieres lograr con los aliados con un solo código, por eso te propongo recomenzar.  :-[

Propuesta:

1-  Crea  un "script" que generen los puntos de los aliados en la formación. Cada vez que el héroe rote, este "script" calculará cada punto donde deben estar los aliados y los guardará en una array2D. Por ejemplo:

  formacion[a,b] arreglo de valores  | 

  formacion[0,0] = 3;       // esta es la cantidad de aliados en la "formación de tres aliados"
  formacion[1,0] = x1;  formacion[1,1] = y1;  formacion[1,1] = rot1;     //  las coordenadas del primer punto de la formación de tres más la dirección en debe estar mirando ese aliado
  formacion[1,0] = x2;  formacion[1,1] = y2;  formacion[1,1] = rot1;     //  las coordenadas del segundo punto de la formación de tres más la dirección en debe estar mirando ese aliado
  formacion[1,0] = x3;  formacion[1,1] = y3;  formacion[1,1] = rot1;     //  las coordenadas del tercer punto de la formación de tres más la dirección en debe estar mirando ese aliado


  Cada vez que que el héroe cambie el ángulo el "script" calculará los puntos y los ángulos y los sobre escribirá en el array formacion[].

Para ubicar cada aliado en su posición solo debes brindarle esos puntos al aliado dentro de la función "mp_linear_step" y él se moverá en esa dirección. La dirección en debe estar mirando el aliado ya tienes en el array.

En caso de cambiar de formación, se logra con un "script" distinto para cada formación. Siempre sobre escribiendo el mismo array. Es muy importante colocar el número puntos de cada formación en el array (formacion[0,0] = 3;) para poder recorrer el arreglo.

2- En caso de que en este juego el héroe no cambie de ángulo tan seguido, la generación de los puntos puede hacerse relativa a la distancia del héroe, guardarse en el "array" y no deben generarse otra vez hasta que el héroe cambie su ángulo. Por ejemplo: x1 = -10; y1 = 5;     // en este caso no se le pasan estos valores al aliado sino que se le suman cada valor a su correspondiente en las coordenadas del héroe. En este caso, si el héroe tuviera las coordenadas x= 24 y y=9  se realiza la suma x+x1, y+y1  (24 + (-10) ; 9 + 5) = (14 ; 14) y esas son las coordenadas que debe tener el aliado en la posición uno.

  En caso que el cambiar de ángulo sea muy constante en tu juego el "script" debe generar los puntos absolutos y no relativos.  Cada vez que el héroe se desplace de posición simplemente se llama al "script" y se escriben los valores en el "array" correspondiente.


  Por supuesto que esto no es código, sino un algoritmo, pero si lo revisas y logras entenderlo verás que te resuelve la situación. Solo quedaría implementarlo... 8)


brunoxzx, ¿por qué tanta complicación? con mp_potential_step es un toque.
Esto debería funcionar:
[gml]// align_allies(len, dir, cover_angle, speed);
var len, cover_angle, dir;
len = argument0;
dir = argument1;
cover_angle = argument2;
with (objAlly) {  // Cambiá objAlly por el nombre del objeto aliado.
    dir += cover_angle / (instance_number(objAlly) + 1);  // Y acá tambien.
    mp_potential_step(other.x + lengthdir_x(len, other.direction + dir),
                      other.y + lengthdir_y(len, other.direction + dir),
                      argument3, false);
}[/gml]
Eso hace que busquen el camino más corto a la posición.
Si querés que se muevan de una manera específica, lo que podés hacer es darles un par de variables, por elemplo, x_goal y y_goal y en step ponerles el código que haga que traten de llegar a la posición marcada por esas variables, y el script lo usás así:
[gml]// align_allies(len, dir, cover_angle);
var len, cover_angle, dir;
len = argument0;
dir = argument1;
cover_angle = argument2;
with (objAlly) {  // Cambiá objAlly por el nombre del objeto aliado.
    dir += cover_angle / (instance_number(objAlly) + 1);  // Y acá tambien.
    x_goal = other.x + lengthdir_x(len, other.direction + dir);
    y_goal = other.y + lengthdir_y(len, other.direction + dir);
}[/gml]
Y ahí el script lo único que hace es establecer x_goal y y_goal.
Vim.

Acabo de probar el código Wadk.

Funciona muy bien, respetan su sitio, esquivan y buscan el lugar más cercano. El único inconveniente es como antes. Empiezan a la izquierda del personaje, se mueven con el cuando pulso la tecla, pero, cuando la suelto vuelven a estar siempre a la izquierda.

Lo estoy probando con instancias sin código, para que no interfieran.

Voy a seguir estudiandolo pero creo que con esto voy a dar en el clavo.

Ferhand: voy a ponerme con lo que me has escrito cuando termine con esto, por que seguramente, me vuelva a pegar una coz mi propio código y tenga que reestructurarlo desde 0.

Agradezco toda vuestra ayuda.

Por cierto: ¿Soys programadores?, es decir, ¿vuestro alto nivel se debe al simple uso reiterado del GameMaker, o programabais de antes? A mi el código me cuesta horrores. (Soy diseñador  8))

Cita de: francordoba en Enero 11, 2013, 05:56:59 PM
Acabo de probar el código Wadk.

Funciona muy bien, respetan su sitio, esquivan y buscan el lugar más cercano. El único inconveniente es como antes. Empiezan a la izquierda del personaje, se mueven con el cuando pulso la tecla, pero, cuando la suelto vuelven a estar siempre a la izquierda.
Qué raro. ¿Podrías poner el editable que estás usando para probar?

CitarPor cierto: ¿Soys programadores?, es decir, ¿vuestro alto nivel se debe al simple uso reiterado del GameMaker, o programabais de antes? A mi el código me cuesta horrores. (Soy diseñador  8))
Yo empecé con Game Maker hace años, y después me fui moviendo a php, Python, C y C++, entre otros.
Vim.