Angle no me funciona como deberia

Started by Abram, March 31, 2011, 08:24:29 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Abram



Bueno, las lineas son rectas, pero el angulo falla, van todos al mismo punto xD

mz

#16
Quote from: Abram on March 31, 2011, 01:41:56 PM
Splinter me encataria usarla de verdad xD para darle mas precision al movimiento, pero no se como incluirla en el codigo :S si pongo por ejemplo, Resolution=10; y multiplico x e y por resolution me salen disparates xD te pongo el codigo del proceso a ver si me iluminas :P

[code language="bennu"]
process prota(x,y,e)
private
   int xi, yi;
end
begin
graph=new_map(5,5,32);map_clear(0,graph,rgb(255,255,255));
//x=630;y=470;      
      
      if(exists(objetivo[e])==true)
         
         dist=get_dist(objetivo[e]);

         while( x!=objetivo[e].x)               
               angle=get_angle(objetivo[e]);
               advance(2);
               put_pixel(x,y,rgb(255,255,0));
               frame;
         end
         signal(objetivo[e],s_kill);

      end
      
loop
frame;
end //loop
end
[/code]

EDIT
objetivo[e] es un vector donde guardo los enemigos que estan a menos de X pixeles, que son a los que iran dirigidas las rayas ^^

Podría ser algo así:
[code language="bennu"]process prota(x,y,e)
private
   int xi, yi;
end
begin
resolution = 100;
x = x*resolution;
y = y*resolution;
graph=new_map(5,5,32);map_clear(0,graph,rgb(255,255,255));
//x=630;y=470;      

      if(exists(objetivo[e])==true)

         dist=get_dist(objetivo[e])/resolution;

         while(get_dist(objetivo[e])>resolution)               
               angle=get_angle(objetivo[e]);
               advance(2*resolution);
               put_pixel(x/resolution,y/resolution,rgb(255,255,0));
               frame;
         end
         signal(objetivo[e],s_kill);

      end

loop
frame;
end //loop
end[/code]

Puedes cambiar el valor de resolution para mayor o menor precisión.

Abram

Quote from: Abram on March 31, 2011, 02:21:26 PM


Bueno, las lineas son rectas, pero el angulo falla, van todos al mismo punto xD

Gracias a ambos, me quoteo para que veais que ocurre con resolution al 100 xD.. el angle se le va la pinza y todos los procesos prota van en esa direccion :S

mz

Quote from: Abram on March 31, 2011, 03:56:52 PMGracias a ambos, me quoteo para que veais que ocurre con resolution al 100 xD.. el angle se le va la pinza y todos los procesos prota van en esa direccion :S
Entonces el error está en otra parte (pasa el código completo para poder ayudarte mejor :P).

A mi función la probé acá y funcionó bien. ;D

Abram

Esto es simplemente un esbozo, no lloreis por lo mal estructurado que esta todo xD se supone que deben aparecer 80 "enemigos" y la funcion busca los que estan mas cerca de 150 pixeles del centro, entonces crea tantos protas como enemigos haya cerca, y estos procesos protas se limitan a ir hacia el dejando un rastro mandandole un signal al chocar:

[code language="bennu"]
global
   int idenemigo[79];
   int i;
   int a;
   int objetivo[79];
   int distaux, distminima, dist;
end
process main()

begin
   set_mode(640,480,32);
   set_fps(30,0);
   for(i=0;i<80;i++)
      idenemigo=enemigo(rand(10,600),rand(10,400));
   end
   distancia();

   a=0;
   while(objetivo[a]!=0)
      prota(320,240,a);
      a++;
   end
   while(!key(_esc))
      frame;   
   end
   exit();
end


process prota(x,y,e)
private
   int xi, yi, iddraw;
end
begin
graph=new_map(5,5,32);map_clear(0,graph,rgb(255,255,255));

resolution=100;
x *=100;
y *=100;
if(exists(objetivo[e])==true)
   dist=get_dist(objetivo[e]);
   while( x!=objetivo[e].x)
   angle=get_angle(objetivo[e]);
   advance(100);
   put_pixel(x/resolution,y/resolution,rgb(255,255,0));
   frame;
end
signal(objetivo[e],s_kill);
end
      
loop
frame;
end //loop
end


process enemigo(x,y)
begin
   graph=new_map(5,5,32);map_clear(0,graph,rgb(0,255,0));
   loop
      frame;
   end
end


function distancia()
begin
   x=320;
   y=240;
   distminima=150;
   
   for(i=0;i<80;i++)
      distaux=get_dist(idenemigo);
      if(distaux<=distminima and distaux>0)
         objetivo[a]=idenemigo;
         a++;
      end
   end
end
[/code]

mz

Parece que hacía falta cambiar el resolution de enemigo también. :P

[code language="bennu"]
global
   int idenemigo[79];
   int i;
   int a;
   int objetivo[79];
   int distaux, distminima, dist;
end
process main()

begin
   set_mode(640,480,32);
   set_fps(30,0);
   for(i=0;i<80;i++)
      idenemigo=enemigo(rand(10,600),rand(10,400));
   end
   distancia();

   a=0;
   while(objetivo[a]!=0)
      prota(320,240,a);
      a++;
   end
   while(!key(_esc))
      frame;   
   end
   exit();
end


process prota(x,y,e)
private
   int xi, yi, iddraw;
end
begin
graph=new_map(5,5,32);map_clear(0,graph,rgb(255,255,255));

resolution=100;
x *=100;
y *=100;
if(exists(objetivo[e])==true)
   dist=get_dist(objetivo[e]);
   while(get_dist(objetivo[e])>resolution)
   angle=get_angle(objetivo[e]);
   advance(100);
   put_pixel(x/resolution,y/resolution,rgb(255,255,0));
   frame;
end
signal(objetivo[e],s_kill);
end

loop
frame;
end //loop
end


process enemigo(x,y)
begin
   resolution=100;
   x *=100;
   y *=100;
   graph=new_map(5,5,32);map_clear(0,graph,rgb(0,255,0));
   loop
      frame;
   end
end


function distancia()
begin
   x=320;
   y=240;
   distminima=150;

   for(i=0;i<80;i++)
      distaux=get_dist(idenemigo);
      if(distaux<=distminima and distaux>0)
         objetivo[a]=idenemigo;
         a++;
      end
   end
end
[/code]

Creo que funciona correctamente.  ;D

SplinterGU

bueno, eso no es correcto, si llega a la x no significa que va a llegar a la y... pensa por ejemplo un caso donde la linea sea una linea de 90 grados... ahi el cambio esta en la Y, y X permanece desde el origen hasta el final igual... lo mismo en angulo cercanos a 90, llegara mas rapido a X antes de llegar a destino final.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

posiblemente tambien hacia falta cambiar resolution de enemivo, eso depende de tus necesidades o transformar en los procesos los datos desde/para procesos con resolution.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

ese while(get_dist(objetivo[e])>resolution) no me parece correcto... es mas diria que no uses get_dist, que directamente hagas un while hasta que las coordenadas sean las del enemigo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

mz

Quote from: SplinterGU on March 31, 2011, 04:31:02 PM
ese while(get_dist(objetivo[e])>resolution) no me parece correcto... es mas diria que no uses get_dist, que directamente hagas un while hasta que las coordenadas sean las del enemigo.
Eso sería correcto si fuera un movimiento pixel a pixel... Pero al tener una velocidad de avance mayor, hace que muchas veces sea imposible que vayan a poder tener las mismas coordenadas del enemigo, al menos usando sólo get_angle() y advance().

Abram

#25
Vaya, muchas gracias por el curro a ambos, gracias cracks, tengo que pulir muchas cosas aun pero el esqueleto funciona y todo gracias a vosotros, karma++, os seguire atormentando con mis dudas jaja ^^

EDIT
al final la condicion la he dejado como while( !collision(type enemigo)) y tambien tira bien, gracias ^^

SplinterGU

Quote from: mz on March 31, 2011, 04:38:59 PM
Quote from: SplinterGU on March 31, 2011, 04:31:02 PM
ese while(get_dist(objetivo[e])>resolution) no me parece correcto... es mas diria que no uses get_dist, que directamente hagas un while hasta que las coordenadas sean las del enemigo.
Eso sería correcto si fuera un movimiento pixel a pixel... Pero al tener una velocidad de avance mayor, hace que muchas veces sea imposible que vayan a poder tener las mismas coordenadas del enemigo, al menos usando sólo get_angle() y advance().

repito, en angulos rectos donde la x del origen y del destino son iguales de partida, en esos casos X0 valdra Xn desde el inicio, y en casos de poca diferencia tambien llegara antes de tiempo.

como sea, si hay 1 sola posiblidad de que eso pase, entonces esta mal dejarlo asi.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

Quote from: Abram on March 31, 2011, 04:41:29 PM
Vaya, muchas gracias por el curro a ambos, gracias cracks, tengo que pulir muchas cosas aun pero el esqueleto funciona y todo gracias a vosotros, karma++, os seguire atormentando con mis dudas jaja ^^

EDIT
al final la condicion la he dejado como while( !collision(type enemigo)) y tambien tira bien, gracias ^^

si, esa es la mejor, aunque consuma un poco mas de CPU.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Abram

Buenas, no quiero abusar de vuestro conocimiento xD no tiene gracia si me haceis el juego completo jaja, pero al menos alguna idea de por donde van los tiros, bien, tal cual esta ahora desde el centro de la pantalla surjen tantos protas como enemigos haya a menos de 150 pixeles, la chicha del juego esta en que cada vez que un prota alcanza un enemigo se llame a la funcion que calcula la distancia DESDE donde murio el enemigo, y si desde ahi hay enemigos a menos de 150pixeles se vuelvan a llamar tantos protas como se necesiten, un pequeño esbozo de como se monta este percal? jajaja y eso que el minijuego es sencillo madre mia! xD

Windgate

Me gusta como pinta tu juego, ¿Lo compartirás?

Karma spree!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es