ayuda con collision

Started by crashon182, July 12, 2011, 02:03:11 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

crashon182

Hola compañeros, me encuentro realizando un sencillo juego de disparos. El jugador cuenta con una mira y le van apareciendo personajes en la pantalla a los que les tiene que disparar. el problema es cuando trato de hacer colisionar la mira con el proceso que maneja al enemigo, sencillamente no reconoce la colisión. les muestro el código tal cual lo tengo hasta ahora... para ver si me pueden ayudar.

[code language="bennu"]
import "mod_map";
import "mod_video";
import "mod_key";
import "mod_screen";
import "mod_rand";
import "mod_text";
import "mod_proc";
import "mod_grproc"
import "mod_mouse";

global
   int fichero;
   
   
process main()   
begin
set_fps(27,1);
set_mode(800,600,32);
fichero=load_fpg("graficos.fpg");
put_screen(fichero,1);
vaquero(150,250);
mira();
end


process vaquero(x,y)
begin
file = fichero;
graph=2;
loop
if (mouse.left and collision(TYPE mira))
   signal(ID,S_KILL);
   write(0,0,10,0,"collisiono!!");
end   
   frame;
end   
end;

process mira()

begin
file = fichero;
mouse.graph = 3;
loop
     x=mouse.x;
     y=mouse.y;
     write_var(0,0,100,0,x);
     frame;
end
end

[/code]

Desde ya les agradezco su ayuda!!

saludos!!
www.elbooz.com.ar - Cursos online Gratuitos!

KeoH

pos yo el primer problema q veo es q el proceso mira no tiene grafico. Porque le estas poniendo grafico al mouse .. pero no al proceso mira. Prueba a ver si es eso xD

KeoH

Y ya que mira() solo hay una .. puedes usar directamente su identificador en el collision en vez de un "type mira".

crashon182

ahi funciono bien.... que tontera que era... pero gracias porque aprendí algo nuevo.!

saludos!! ;D
www.elbooz.com.ar - Cursos online Gratuitos!

Futu-block

si, siempre las pamplinitas esas son las que mas dolor de cabeza nos dan

crashon182

una nueva duda...  ahora quiero comprobar si la persona le erra al personaje al que tiene que matar, nuevamente tengo problemas con las colisiones, ya que no importa si le doy o no al personaje igual me descuenta una vida.

[code language="bennu"]
process mira()
local
   bloqueo=0;
begin
file = fichero;
graph = 3;
loop
   x=mouse.x;
   y=mouse.y;
if ((mouse.left and !collision(TYPE vaquero)))
   if (bloqueo==0)   
      vida = vida-1;
      bloqueo=1;
   end   
   else
      bloqueo=0;
   end
   if (vida==0)
      write(0,340,500,0,"GAME OVER");
   end      
   frame;
end

end
[/code]

puse solo el proceso mira, ya que el programa se mantiene como postee al principio

bueno muchas gracias por la ayuda...!!
saludos!!

PD: Lo mas raro que logicamente me parece que esta bien  :(
www.elbooz.com.ar - Cursos online Gratuitos!

KeoH

en vez de !collision, prueba con collision(type vaquero)==0 ... a ver q tal

FreeYourMind


process mira()
local 
  bloqueo=0;

begin

file = fichero;
graph = 3;
loop
x=mouse.x;
y=mouse.y;

  if (mouse.left)
        if (collision(TYPE vaquero)) // Quita vida al pinchar en el mouse estando encima de vaquero
if (bloqueo==0)
                 vida = vida-1;
     bloqueo=1;
else
     bloqueo=0;
end
        end
  end

  if (vida <= 0)
     write(0,340,500,0,"GAME OVER");
     break;
  end

  frame;
 
end



Trecek

A ver si lo he entendido bien:
Tienes un proceso por ahi llamado vaquero, si le aciertas al disparar (colision con proceso mira y boton izq pulsado) no pierdes vida, pero si fallas el tiro si la pierdes, correcto?

Si no me equivoco el proceso vaquero desaparece instantaneamente en cuanto le disparas, y tal y como tienes escrito el codigo (corregirme si me equivoco pls) el programa no detecta que ya ha ejecutado la parte correspondiente a ese disparo, dado que el programa tarda menos en "matar" al vaquero y quitarlo de la pantalla que tu en soltar el boton del raton, asi que considera que el disparo ha fallado (aunque un instante antes hubieses acertado) ya que en realidad aun estas disparando. No se si me explico.

Una forma sencilla para evitar que una sola pulsacion de teclas o botones del raton se tome en cuenta como varias podria ser esta:

if (mouse.left)
while(mouse.left)
frame; //mientras estas pulsando el boton no hace nada
end
/*sentencias que deseas que realice al pulsar el boton, ten en cuenta que en
        realidad las realiza cuando sueltas el boton, no cuando lo aprietas*/
end


La verdad es que esto lo veo mas interesante para pulsaciones de teclas que para el raton, ya que a ti te interesara (supongo) que dispare cuando pulsas el boton, no cuando lo sueltas. Para esto se me ocurre poner algo como:

process mira()
local
   bloqueo=0;
begin
   file = fichero;
   graph = 3;
   loop
      x=mouse.x;
      y=mouse.y;
      if ((mouse.left and !collision(TYPE vaquero) and bloqueo==0))
         vida = vida-1;
         bloqueo=1;
      else
         if (!mouse.left)
            bloqueo=0;
         end
      end
      if (vida==0)
         write(0,340,500,0,"GAME OVER");
      end
      frame;
   end
end


Algo asi, no se si lo he puesto correctamente ya que no lo he probado, pero creo que la idea esta clara, en definitiva se trata de que el boton este "libre" como condicion para poder disparar, es decir, asegurarnos de que se haya soltado el boton previamente al disparo.

Espero que te sirva, y perdona si he dicho algo incorrecto, aun soy novato en esto :)

crashon182

hola compañeros, en realidad lo que necesito es que cuando el usuario erra su disparo, es decir que no le pega al vaquero le descuente una vida. en mi caso (y modificando mi código con el código posteado por ustedes) no funciona siempre le pegue o no al vaquero le descuenta una unidad a la vida. Adjunto el link con el código y los gráficos completos para que lo puedan probar .

http://www.4shared.com/file/r3dfeu52/juego_Disparo.html
saludos y muchas gracias!
www.elbooz.com.ar - Cursos online Gratuitos!

Trecek

Me he bajado tu programa y lo he probado, te pongo aqui el programa de nuevo con las modificaciones pertinentes (basicamente he cambiado la variable bloqueo de local a global).
No entiendo muy bien porque fallaba antes si usaste el codigo que te pase en el anterior post, supongo que habra alguna cosa que no tuve en cuenta :-\
Ahora va como tu querias, al fallar los tiros descuenta una vida y al acertar suma puntos pero no quita vidas.

import "mod_map";
import "mod_video";
import "mod_key";
import "mod_screen";
import "mod_rand";
import "mod_text";
import "mod_proc";
import "mod_grproc"
import "mod_mouse";
import "mod_timers";

global
int fichero;
int tiempo;
int idv;
int idv1;
int puntaje;
int vida=3;
int bloqueo=0;   //ahora la variable bloqueo es global

process main()
begin
        set_fps(27,1);
        set_mode(800,600,32);
        fichero=load_fpg("graficos.fpg");
        put_screen(fichero,1);
        controlTiempo();
        idv=vaquero(150,250);
        idv1=vaquero(rand(50,700),rand(250,550));
        mira();
        write_var(0,400,40,0,puntaje);
        write_var(0,400,100,0,vida);
end

process vaquero(x,y)
begin
        file = fichero;
        graph=2;
        loop
             if (mouse.left and collision(TYPE mira))
           puntaje=puntaje + 10;
           bloqueo=1; //he añadido esta linea
           signal(ID,S_KILL);
             end
     frame;
        end
end;

process mira()
local
        //he quitado la variable bloqueo de aqui
begin
        file = fichero;
        graph = 3;
        loop
      x=mouse.x;
      y=mouse.y;
              if ((mouse.left and !collision(TYPE vaquero) and bloqueo==0))
vida = vida-1;
bloqueo=1;
      else
        if (!mouse.left)
      bloqueo=0;
        end
      end
      if (vida<=0)
         write(0,340,500,0,"GAME OVER");
      end
      frame;
        end
end

process controlTiempo()
private
        int tiempoDificultad=4;
end
begin
        timer[0] = 0;
        write_var(0,100,100,4,tiempo);
        loop
             tiempo = tiempoDificultad - (timer[0] / 100);
             if (tiempo==0)
            signal(idv,S_KILL);
            signal(idv1,S_KILL);
            idv=vaquero(rand(100,700),rand(50,590));
            idv1=vaquero(rand(100,700),rand(50,590));
            timer[0] = 0;
             end
             if (puntaje==100)
             tiempoDificultad=3;
             end
             if (puntaje==200)
             tiempoDificultad=2;
             end
             if (puntaje==300)
                     tiempoDificultad=1;
             end
             frame;
        end
end


Espero que te sirva  ;)

KeoH

yo tambien he provado el codigo y haciendole cambios funciona xD


[code language="bennu"]import "mod_map";
import "mod_video";
import "mod_key";
import "mod_screen";
import "mod_rand";
import "mod_text";
import "mod_proc";
import "mod_grproc"
import "mod_mouse";
import "mod_timers";

global
   int fichero;
   int tiempo;
   int idv;
   int idv1;
   int id_mira;
   int puntaje;
   int vida=3;
end

process main()   
begin
set_fps(27,1);
set_mode(800,600,32);
fichero=load_fpg("graficos.fpg");
put_screen(fichero,1);
controlTiempo();
idv=vaquero(150,250);

idv1=vaquero(rand(50,700),rand(250,550));
id_mira=mira();
write_var(0,400,40,0,puntaje);
write_var(0,400,100,0,vida);
end


process vaquero(x,y)
begin
file = fichero;
graph=2;
loop

   frame;
end   
end;

process mira()

private
   int id_vaquero_obj;
end

begin
file = fichero;
graph = 3;
loop
   x=mouse.x;
   y=mouse.y;

   if(mouse.left)
      while(mouse.left) frame; end
      if(id_vaquero_obj=collision(type vaquero))

         puntaje=puntaje+10;
         signal(id_vaquero_obj,s_kill);
      elseif
         vida--;
   
      end
   end

   
   if (vida<=0)
      write(0,340,500,0,"GAME OVER");
   end      
   frame;
end

end

process controlTiempo()
private
int tiempoDificultad=4;
end
begin
timer[0] = 0;
write_var(0,100,100,4,tiempo);
loop
tiempo = tiempoDificultad - (timer[0] / 100);
if (tiempo==0)
   signal(idv,S_KILL);
   signal(idv1,S_KILL);
   idv=vaquero(rand(100,700),rand(50,590));
   idv1=vaquero(rand(100,700),rand(50,590));
   timer[0] = 0;
end   

   
if (puntaje==100)
   tiempoDificultad=3;
end   

if (puntaje==200)
   tiempoDificultad=2;
end

if (puntaje==300)
   tiempoDificultad=1;
end
frame;
end
end[/code]

Trecek

#12
Jejejeee, esto parece una competicion keoh.
No he mirado tu codigo a fondo, pero parece una solucion mas elegante, claro que has cambiado el codigo bastante mas que yo, que solamente he optado por una solucion rapida (si, lo admito, soy un vago XD ) me gusta como has enfocado el proceso mira, le da mas logica a todo en mi opinion.

Edito: solo una pregunta, al poner el while (mouse.left) en el proceso mira... matas los vaqueros al pulsar el boton o al soltarlo?

Re-Edito: lo acabo de probar, es al soltar el boton. Ya no me gusta tanto :D

KeoH

no, solo lo matas cuando sueltas el boton, si no pones eso y dejas presionado el boton, en el primero fotograma matas el vaquero .. pero en los siguientes estas disparando al aire y te quedas sin vida xD

He cambiado mas cosas si... no se .. veia q la condicion de colision estaba en dos procesos distintos y eso tiene q dar dolores de cabeza si o si xD

Lo que si me he dao cuenta .. q en mi codigo ... como no modifiques el elseif, en cuanto se meta otro tipo de proceso enemigo distito de vaquero(), pos te quitará una vida al no darle al vaquero y si al nuevo xD pero eso se arregla facil. Y había otra cosa más que no me acuerdo ahora ... xD

xD La competencia es buena ... fomenta la innovación, el aprendizaje y el desarrollo .. aunq las empresas no lo entiendan y quieran cargarse a sus competidores xD

crashon182

hola amigos gracias por ayudar tan rápido!! :) probé la solución de Trecek y funciono correctamente como necesitaba. luego voy a probar tu solución KeoH a ver que tal .. muchas gracias por todo!!
saludos!!

haa no me funcionaba porque no había puesto bloqueo=1; en el proceso vaquero.

www.elbooz.com.ar - Cursos online Gratuitos!