The noob questions strikes again

Started by CarniceroIberico, November 23, 2010, 07:54:14 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

CarniceroIberico

Bueno, ya que me he unido a la comunidad de bennu, voy a dar un poco mas de follon, jaja, ahora tengo otra duda con la que llevo toda la tarde comiendome la cabeza y probando cosas y nada de nada, es con el "angle=get_angle".

El caso es el siguiente, tengo un personaje el cual puede moverse con "W A S" (vista desde arriba) pero cuando pulsas "Shift" deja de moverse, saca una pistola y apunta para disparar, y me gustaria que el personaje girara, dependiendo de la posición del ratón, entonces buscando por la bennu wiki y tal y cual, no he conseguido nada, asi que acudo a vosotros, el caso, es que si declaro a un "zombie" el angulo del prota, si va, pero si declaro al prota el angulo del raton, no, asi que me puedo imaginar, que es que me falta algo por poner en el Process Raton()

Bueno, sin mas royo, aqui os suelto el codigo:

QuoteImport "mod_video";
Import "mod_map";
Import "mod_key";
Import "mod_screen";
Import "mod_wm";
Import "mod_grproc";
Import "mod_proc";
Import "mod_rand";
Import "mod_text";
Import "mod_draw";
Import "mod_sound";
import "mod_time";
Import "mod_sound";
Import "mod_mouse";
Global
   int centesimas=0;
   int segundos=0;
   int minutos=0;
   int im1;
   int vidapersonaje=100;
   int cancion;
   int ID_raton;
   int ID_protagonista;
end

Process Main()
begin
   resolution = 100;
   set_mode(800,600,32);
   set_title("El hedor de la muerte");
   im1=load_fpg("graficos.fpg");
   cancion=load_wav("cancion.wav");   
      loop
      principio();
         if (key(_enter)) break; end
      frame;
      end   
   ID_protagonista=personaje();
   ID_raton=raton();   
   raton();
   clock();
   arbol();
   personaje();
   zombie1();
end   

Process Principio()
begin
   graph=12;x=400;y=300;z=1; //Pantalla de introduccion
   frame;
      if(key(_ESC) || exit_status) let_me_alone(); end
end         
Process Raton() //aquí está el ratón en cuestión
Begin
   mouse.graph = 13;
   frame;
end

Process clock()//Contador
Private
   int ft1;
end
Begin   
   set_fps(60,1);
   ft1=load_fnt("contador.fnt");
      while(minutos<10);
      centesimas++;
      delete_text(0);
      write(ft1,675,25,2,minutos +":");
      write(ft1,705,25,2,segundos +":");
      write(ft1,730,25,2,centesimas);
         IF(centesimas==60);
         segundos++;
         centesimas=0;
            IF(segundos==60);
            minutos++;
            segundos=0;                    
            END
         END
      frame;
      END
END  

Process arbol()
Begin
   put_screen(im1,1);
   x=400;y=300;graph=2;z=4;
   play_wav(cancion,0);
      loop
      frame;
      end
end

Process personaje()
private
   int animap;
   int animalop;
end   
begin
   graph=3;
   x=400;
   y=300;
   z=5;
   size=100;
      loop
         while (KEY(_L_SHIFT)); repeat
         graph=14;
         angle=get_angle(ID_raton); //Y aquí está el get angle
         frame;
         until (!KEY(_L_SHIFT));
         graph=3;
         end
       if (KEY(_w)) advance(3);
          loop
             animap=get_timer()-animalop;
                if(animap>100)
                Animalop=get_timer();
                   if (graph==8)
                   graph=3;
                      else
                      graph++;
                   end
                 end
          frame;
          break;
          end
       else
       graph=3;   
       end                         
       if (KEY(_s)) advance(-1);   end                            
       if (KEY(_d)) angle=(angle-5000)%360000; end
       if (KEY(_a)) angle=(angle+5000)%360000; end
       if (x>800) x=800; end
       if(x<0) x=0; end
       if(y<0) y=0; end
       if(y>600) y=600; end
       if(KEY(_ESC) || exit_status) let_me_alone(); break; end
      frame;
      end
end
process zombie1()
private
   int anima;
   int animalo;
   int cont;
end   
begin
   graph=9;
   x=100;
   y=300;
   z=5;
   size=100;
      loop
      angle=get_angle(ID_protagonista);
      cont++;
         if(cont==2);
         advance(2);
         cont=0;
         end
      Anima=get_timer()-Animalo;
              if (Anima>500)
             Animalo=get_timer();
                if (graph==11)
               graph=10;
                else
               graph++;
               end
            end
         frame;
         end    
end

Se que habré metido la gamba en muchos sitios y se podrá hacer mucho más rapido y con menos codigo, pero no se aprende en dos dias : (

He marcado los sitios en donde está, muchisimas gracias de antemano 8)

Yawin

PROCESS raton()
begin
                graph = 13;
x=mouse.x;
y=mouse.y;
loop
frame;
end
end


Luego lo llamas como:
ID_raton=raton();

Siendo puntero:
int ID_raton;

Llamas al get_angle:
angle=get_angle(ID_raton);

Así debería de funcionarte.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

CarniceroIberico

#2
Muchisimas gracias por tu respuesta "Yawin", he hecho lo que me has dicho, pero ahora el grafico del raton se queda en el sitio y no sigue el movimiento del raton : (

De todos modos +karma por la ayuda

EDIT: Lo he puesto de este modo:

Process Raton()
begin      
      loop
        graph = 13;
      x=mouse.x;
      y=mouse.y;
      
                      frame;
      end
   end

Y funciona bien, pero por alguna extraña razón si juego un poco con el, terminan apareciendo dos protas

Yawin

mmm, pues no lo se. No entiendo porqué tiene que estar graph dentro del loop si sólo necesitas asignarle el valor una vez.

La idea es que creas un proceso que se pone en las coordenadas del raton.
Este es un proyecto que tengo abandonado: http://www.pensarescompartir.com/lahsoft/lahsoftcorp/?direc=fenix/&id=zombies%20vs%20plants.rar

Échale un vistazo, si quieres, por si te sirve de ayuda. Es la única vez que usé el ratón.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

DCelso

Cosas que le veo al código:
1 ejecutas dos veces el proceso del ratón, así que, aunque aparentemente en la pantalla solo se ve un ratón, en realidad en tu aplicación hay dos:
ID_raton=raton();   
   raton();
elimina la segunda invocación ya que la primera es con la que guardas el id.

2 No usas de forma correcta el proceso pincipio, porque lo destruyes y lo creas constantemente
Process Principio()
begin
   graph=12;x=400;y=300;z=1; //Pantalla de introduccion
   frame;
      if(key(_ESC) || exit_status) let_me_alone(); end
end   
si sigues la lógica de principio se dibuja, espera un frame y si pulsaste justo después de ese frame (cosa dificilisima de consegur) entonces llama a let_me_alone para matar a los demás procesos , finalmente se termina su ejecucion
lo lógico sería poner lo siguiente

Process Principio()
begin
   graph=12;x=400;y=300;z=1; //Pantalla de introduccion
   loop   
    frame;
   end
end   


y luego usarlo así en el main

      ....
      principio();
     loop
         if (key(_enter)) break; end
         frame;
     end
     let_me_alone()
     ...

3 el proceso ratón, pues lo que te comentaron, quedaría tal que así

PROCESS raton()
       graph = 13;
begin
       x=mouse.x;
y=mouse.y;
loop
frame;
end
end


4 no es lógico usar set_fps en clock, esta función se suele poner justo después o antes de set_mode y solo una vez durante todo tu código, en un juego no se suele estar cambiando constantemente este valor, auque teóricamente sí pudieras. Mi recomendación pues eso, ponla solo después de set_mode en tu proceso main.

5 no entiendo para qué vale el proceso clock, por lo que leo lo único que hace es mostrar en pantalla durante 10 minutos el tiempo de ejecución, finalmente a los 10 minutos se cierra el proceso dejando el texto de diez minutos y no hace nada más.

6 vamos ahora con el proceso arbol, a put_screen le pasa algo parecido a lo que te conté de set_fps, no es correcto que valla aquí, debería ir también en el proceso main, si te das cuenta  un proceso solo debe de gestionar los recursos que él mismo necesite para su funcionamiento aislando así los problemas a él mismo, si te das cuenta no es lógico que un arbol pinte un escenario y luego se posicione él en éste, ya que si quiseramos poner dos procesos árboles entonces el segundo volvería a pintar el escenario, cosa innecesaria.
Lo del play_wav ya no se yo, depende de si es un sonido que va a estar durante todo el juego (que si es así mismo proceso, ponerlo en main) o es un ruido que produce el arbol como que se está agitando o algo, que entonces sí podría ir aqui, siempre y cuando lo finalizáramos antes de terminar el proceso arbol.

7 proceso personaje.
no se que prentendes con esto:
  until (!KEY(_L_SHIFT));
          graph=3;
          end
pero es lo mismo que esto
  graph=3;
  until (!KEY(_L_SHIFT));
  end
ya que estás haciendo la misma asignacion todo el rato hasta que no se pulse el shift izquierdo, así que son innecesarias.
8 con respeto a cuando pulsas w, también mal

loop
              animap=get_timer()-animalop;
                 if(animap>100)
                 Animalop=get_timer();
                    if (graph==8)
                    graph=3;
                       else
                       graph++;
                    end
                  end
           frame;
           break;
           end

aqui no hay bucle ni nada, tienes un break que siempre rompe el loop, así que este código es exactamente igual a este otro

              animap=get_timer()-animalop;
                 if(animap>100)
                 Animalop=get_timer();
                    if (graph==8)
                    graph=3;
                       else
                       graph++;
                    end
                  end
           frame;

esto no hace mas que que un frame, ya que animap valdrá siempre get_timer porque animalop es siempre 0 ya que no le estableces nunca antes un valor y por consiguiente será menor a 100 por lo que no entrara en el if. así que puedes eliminar completamente todo el código que tu aplicación funcionará igual que hasta ahora.

Por lo general está muy mal programado todo, lo siento, pero lo digo para que aprendas :D y no me extraña que no responda a lo que tu esperas conforme está ahora :D, quizas solventando todo esto, el programa se parezca más a lo que deseas y se te solucione el problema, porque con respecto a lo que preguntabas del ángulo, curiosamente esta parte la veo muy bien :D, no se por qué no debería ir una vez solventados los demás problemas.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

Una cosa más :D.
el cerrar de la aplicación ahora mismo lo haces desde el prota con esta línea
   if(KEY(_ESC) || exit_status) let_me_alone(); break; end
No debería ir ahí tampoco, ya que no es cosa del prota cerrar la aplicación,lógicamente hablando, deberías de eliminar esta línea y meterla en el proceso main al final, es decir, algo como

...
  raton();
   clock();
   arbol();
   personaje();
   zombie1();
   loop
        if(KEY(_ESC) || exit_status) let_me_alone(); break; end
   end

Así será el proceso main el que se quedará solo y cerrará la aplicación al tocar la tecla escape
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

FreeYourMind

Quote from: DCelso on November 23, 2010, 11:40:20 PM
Una cosa más :D.
el cerrar de la aplicación ahora mismo lo haces desde el prota con esta línea
   if(KEY(_ESC) || exit_status) let_me_alone(); break; end
No debería ir ahí tampoco, ya que no es cosa del prota cerrar la aplicación,lógicamente hablando, deberías de eliminar esta línea y meterla en el proceso main al final, es decir, algo como

...
  raton();
   clock();
   arbol();
   personaje();
   zombie1();
   loop
        if(KEY(_ESC) || exit_status) let_me_alone(); break; end
   end

Así será el proceso main el que se quedará solo y cerrará la aplicación al tocar la tecla escape


...
  raton();
   clock();
   arbol();
   personaje();
   zombie1();
   loop
        if(KEY(_ESC) || exit_status) exit(); end
   end

DjSonyk

#7
QuoteImport "mod_video";

Process clock()//Contador
Private
  int ft1;
end
Begin  
  set_fps(60,1);
  ft1=load_fnt("contador.fnt");
     while(minutos<10);
     centesimas++;
     delete_text(0);
     write(ft1,675,25,2,minutos +":");
     write(ft1,705,25,2,segundos +":");
     write(ft1,730,25,2,centesimas);
        IF(centesimas==60);
        segundos++;
        centesimas=0;
           IF(segundos==60);
           minutos++;
           segundos=0;                    
           END
        END
     frame;
     END
END  

cambialo por esto otro y tendras un contador de tiempo "real".


Process clock()//Contador
Private
   int ft1;
            int startime;
end
Begin   
   set_fps(60,1);
   ft1=load_fnt("contador.fnt");
            write_int(ft1,675,25,2,minutos);
             write(ft1,695,25,4,":");
            write_int(ft1,705,25,2,segundos);
            startime=get_timer();
   while(minutos<10);
      segundos=get_timer()-startime;
      minutos=segundos/60000;
      segundos=(segundos/1000)-(minutos*60);                
      frame;
   END
END  
[/quote]
Un truquillo para tener un contador de tiempo real sin tantos IF ^^.Saludos.

CarniceroIberico

#8
Hm, bueno, voy a responder a todo lo que me habeis puesto, en primer lugar, voy a responder a "DCelso", ya que pienso que se ha tomado demasiadas molestias por ayudarme, muchas gracias por todos esos consejos, voy a borrar todo eso, y a "rehacerlo", no es bueno aprender con malas costumbres, y ya, se que el codigo entero es un desastre, y la verdad que al principio me daba un poco de verguenza ponerlo aqui, pero bueno, guardandome los errores para mi solo no voy a aprender, muchisisimas gracias por todas tus criticas y consejos.

Bueno, respecto a lo que decia "DCelso" y "Freeyourmind" de cerrar el programa con exit, de hecho, en un principio lo tenía ahi, y por alguna extraña razon lo cambie de sitio, hay tantas cosas que he hecho que no se porque : (, pero bueno, este "minijuego" que estoy haciendo es justamente para aprencer a mejorar todas esas cosas

Muchas gracias "yawin" por tu ayuda tambien, he bajado tu archivo y le voy a echar un vistazo, quizas, ver el codigo de otro juego me ayude un poco a saber organizarme más

Probaré tu codigo DjSonyk, pero antes de probarlo, tengo que leerlo entero y aprenderme de cabo a rabo como funciona, gracias!

Gracias y mil gracias por toda vuestra ayuda, creo que dejare de postear haciendo preguntas hasta que mejore mucho mi forma de programar, aun me falta aprender mucho.

Un saludo!!


EDIT:
Quote7 proceso personaje.
no se que prentendes con esto:
 until (!KEY(_L_SHIFT));
         graph=3;
         end
pero es lo mismo que esto
 graph=3;
 until (!KEY(_L_SHIFT));
 end

No entiendo que me quieres decir ahi, mi codigo es este:

while (KEY(_L_SHIFT)); repeat
     graph=14;
     angle=get_angle(ID_raton);
     frame;
        until (!KEY(_L_SHIFT));
        graph=3;
end

Creo que te refieres a que ese graph=3; ahí sobra, pero en el caso de que lo quite de ahi, al soltar shift mientras mantienes pulsado W, el personaje no se ve hasta que se suelta W

O quizas no te refieras a eso y esté metiendo la gamba :D

NesKy

Quote from: CarniceroIberico on November 23, 2010, 07:54:14 PM
Quote
Process clock()//Contador
Private
   int ft1;
end
Begin   
   set_fps(60,1);
   ft1=load_fnt("contador.fnt");
      while(minutos<10);
      centesimas++;
      delete_text(0);
      write(ft1,675,25,2,minutos +":");
      write(ft1,705,25,2,segundos +":");
      write(ft1,730,25,2,centesimas);
         IF(centesimas==60);
         segundos++;
         centesimas=0;
            IF(segundos==60);
            minutos++;
            segundos=0;                    
            END
         END
      frame;
      END
END  
No te puedo ayudar en lo que pides pero me he fijado en que has puesto que salte un segundo cada 60 centésimas. Creo que deberia ser cada 100, ya que 1 segundo=100 centésimas.

Yawin

Nesky, él le ha llamado centésimas, pero en realidad no son centésimas, sino frames. El va a 60 frames por segundo, es decir, 60 vueltas en ese bucle equivale a un segundo.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

NesKy

Ok, me retiro con la cola entre las piernas...:P

Yawin

Claro que yo, personalmente lo habría hecho asi:

repeat
   for(centesimas=0;centesimas<60;centesimas++)
      frame;
   end
   segundos++;
until(segundos>=600)


Lo cual ahorra muchas líneas y deja, en mi opinión, una estructura más organizada.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

CarniceroIberico

Puse de nombre centesimas, por ponerle algo,xD y se que se puede hacer con mucho menos codigo, pero estaba haciendo el tutorial y conforme aprendi lo del IF dije, voy a probar y bueno, hice eso, y apartir de ahi me puse a hacer todo,xD por eso es tan desastroso, es como un campo de pruebas, gracias por vuestros comentarios y consejos de todos modos : )

Yawin

yayaya, sí, conozco los campos de pruebas. Los mios son iguales. De hecho, la versión survival de mi marcianitos es realmente caótico. xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end