Bennu Game Development

Foros en Español => Mesa de Ayuda => Mensaje iniciado por: chuflun en Julio 26, 2010, 09:01:27 pm

Título: ayuda con durezas
Publicado por: chuflun en Julio 26, 2010, 09:01:27 pm
hola a todos
no se que hago mal pero las durezas no me funcionan,
cuando hago esto...
Código: [Seleccionar]
IF ( map_get_pixel ( fpg_fondo , 7 , x , y ) != colores [_AZUL] )
advance(-10);
END
siempre esta avanzando -10, mi personaje es un tanque y avanza 8 cuando pulso (up)
en global tengo esto...
Código: [Seleccionar]
int colores[6];
y en constante esto...
Código: [Seleccionar]
_ROJO = 1;
_VERDE = 2;
_AZUL = 3;
_AMARILLO = 4;
_ROSA = 5;
_CELESTE = 6;
y cuando ejecuto el juego llamo a un proceso que recoge los colores que hay en una imagen que tengo con 6 colores, que son con los que pinto las durezas
Código: [Seleccionar]
PROCESS inicia_durezas()

BEGIN

colores[_ROJO] = map_get_pixel (fpg_fondo,999,1,1);
colores[_VERDE] = map_get_pixel (fpg_fondo,999,2,1);
colores[_AZUL] = map_get_pixel (fpg_fondo,999,3,1);
colores[_AMARILLO] = map_get_pixel (fpg_fondo,999,4,1);
colores[_ROSA] = map_get_pixel (fpg_fondo,999,5,1);
colores[_CELESTE] = map_get_pixel (fpg_fondo,999,6,1);
END
bueno a ver si me podeis ayudar porque se que estoy haciendo algo mal (de echo no hace lo que quiero) pero no se el que
lo que quiero es que no atraviese las zonas que he pintado de color x, sobraba decirlo pero ahi queda
gracias a todos
Título: Re: ayuda con durezas
Publicado por: FreeYourMind en Julio 26, 2010, 09:13:44 pm
utiliza say para ver que color estas obteniendo para comprobar que la igualdad del if se cumple

color = map_get_pixel ( fpg_fondo , 7 , x , y );
say(color);
say(colores [_AZUL]);
Título: Re: ayuda con durezas
Publicado por: DjSonyk en Julio 26, 2010, 09:42:23 pm
utiliza say para ver que color estas obteniendo para comprobar que la igualdad del if se cumple

color = map_get_pixel ( fpg_fondo , 7 , x , y );
say(color);
say(colores [_AZUL]);
Vaya veo que le vas hacer caso a Splynter ,lo digo por los Say ,Free... ;P

Te recomiendo lo mismo que Free ,que compruebes que valores obtienes para ver si es porque no son los mismos...
Título: Re: ayuda con durezas
Publicado por: SplinterGU en Julio 26, 2010, 09:44:18 pm
utiliza say para ver que color estas obteniendo para comprobar que la igualdad del if se cumple

color = map_get_pixel ( fpg_fondo , 7 , x , y );
say(color);
say(colores [_AZUL]);

;) muy bien, muy bien... me gusta ver que uno no habla al pedo y la gente toma los consejos... gracias... :)

me alegraste, te voy a dar 1 karma.
Título: Re: ayuda con durezas
Publicado por: FreeYourMind en Julio 26, 2010, 09:48:25 pm
Vaya....
Pues os cuento un secreto, el say ya lo llevo usando hace tiempo (por lo menos en este proyecto es una constante, por los codigos de colores y demas cosillas ya que tambien uso mapas de durezas y he definido varios colores como aqui nuestro amigo).
Mi duda de ayer fue una idiotez, en la cual no se me paso por la cabeza utilizarlo en el case 0...
 ;D ;D
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 26, 2010, 10:35:37 pm
lo del say no lo entiendo muy bien
pero aparte yo en el if pongo x e y al pasarle las coordenadas pero
que tengo que poner para anticiparme un poco?
quiero decir que si mi protagonista se moviera en el eje x, pondria en el if x + 10
pero al moverse con advance como lo hago
Título: Re: ayuda con durezas
Publicado por: DjSonyk en Julio 26, 2010, 10:45:56 pm
Lo de say deves incluirle en el juego , import "mod_say" , luego haces como te explico Free y en la consola te pone los valores que vas recogiendo, lo de avance simplemente le tienes que poner el valor que quieres que avance en el angulo que tenga por ejemplo avance(10), lo que es un poco mas "complicadillo" en hacer que el personaje este en el angulo que deseas ,podrias hacerlo algo asi if ( key(_left) ) angle+=90000; end ...
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 26, 2010, 10:47:50 pm
vale ya he hecho say y los colores del scroll los pilla bien pero (_AZUL) o cualquier otro color me devuelven 1
que esta pasando

huy iva a guardar este post con ctr+s, bufff...
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 27, 2010, 01:31:21 am
ya esta,
el problema es que al comprobar el color de mi grafico ponia como (y) un 1 pensando en el pixel 1, y es el (0)

a ver si me podeis resolver lo de advance
Título: Re: ayuda con durezas
Publicado por: Drumpi en Julio 27, 2010, 04:38:29 am
Me temo que advance actúa sobre X e Y, así que 1 de dos:
-O creas una funcion en la misma posición y ángulo, y haces que avance lo que sea y devuelva el color de dicha posición.
-O tiras de trigonometría básica: sabes la distancia, el ángulo y el punto de origen. Con el seno averiguas el avance en Y y con el coseno en X:
new_x=x+avanzar*cos(angle);
new_y=y+avanzar*sin(angle);
Espero no equivocarme, es un poco tarde :P
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 27, 2010, 06:18:55 pm
pero aun asi solo calculo si hay obstaculo justo delante de mi protagonista
que pasa si un objeto me da de lado?
tendria que calcular si hay obstaculo dentro de un radio determinado
he encontrado esto...

Código: [Seleccionar]
WHILE ( map_get_pixel ( fpg_fondo , 7 , x+radio , y ) == obstaculo ) x--; END
WHILE ( map_get_pixel ( fpg_fondo , 7 , x-radio , y ) == obstaculo ) x++; END
WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y+radio ) == obstaculo ) y++; END
WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y-radio ) == obstaculo ) y--; END

y esto funcionaria bien si mi personaje fuera un circulo pero es un rectangulo
aun asi me hace cosas raras

aqui os dejo mi juego completo para que probeis si os apetece
http://www.mediafire.com/?q3cy45r29vm2m9x (http://www.mediafire.com/?q3cy45r29vm2m9x)
hay que encontrar otra solucion
Título: Re: ayuda con durezas
Publicado por: FreeYourMind en Julio 27, 2010, 06:42:19 pm
Tienes que poner un color distinto para cada esquina del rectangulo.
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 27, 2010, 07:06:34 pm
las durezas estan en el scroll con forma de arboles, o lo que sea
el rectangulo es mi personaje
Título: Re: ayuda con durezas
Publicado por: FreeYourMind en Julio 27, 2010, 08:14:23 pm
Lo mismo.
Título: Re: ayuda con durezas
Publicado por: Drumpi en Julio 28, 2010, 12:15:53 am
Si tu personaje es un rectángulo tendrás que hacer la operación que te dije 4 veces, una por cada esquina, por lo que primero tendrás que determinar la posición de cada esquina (puedes hacerlo por trigonometría o usando puntos de control).

Sé que puedes pensar que los obstáculos se pueden colar por  entre medias, pero entonces tendrías que hacer una comprobación por cada pixel del contorno para que fuese perfecto y ya no se si compensa tanta perfección por el trabajo que lleva.
Aprenderás que, en ocasiones, no hay que ser tan perfeccionista y concederse algunas "facilidades". Si es tu primer mapa de durezas, a menos que tu personaje sea gigante, puedes comprobar sólo el centro, y si no, pues con 4 esquinas vale (aunque sea un círculo).
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 28, 2010, 12:36:02 am
vale gracias por las respuestas
voy a trabajar en ello y ya os contare
Título: Re: ayuda con durezas
Publicado por: gecko en Julio 28, 2010, 02:28:27 am
no se si con el advance funcionará, pero si son coordenadas comunes, lo que podes hacer es comprobarlas de a 1 en 1 dentro de un bucle, for por ejemplo, y luego avanzar todas juntas hasta donde se haya comprobado.

No se si se entiende, pero seria como:
Si queres avanzar 5, pregunta primero si podes avanzar 1, despues 2... y asi hasta el 5, y recien ahi avanza los 5 o lo que puedas.
Título: Re: ayuda con durezas
Publicado por: DjSonyk en Julio 28, 2010, 11:36:54 am
El tema de las durezas siempres es peliagudo, he visto tu mapa de durezas y te recomendaria que en vez de la dureza fuera el contorno, lo hagas como un cuadrado tendras menos posibilidades que se te "cuele" el tanque,ya que asi corres el riesgo que te valla sorteando el tanque los pixeles correctos y te encuentres con el tanque encima del arbusto...no se si me explicado...
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 28, 2010, 09:16:17 pm
puede que funciones un poco mejor pero aun asi me hce cosas raras, creo que es porque las durezas son muy pequeñas
Título: Re: ayuda con durezas
Publicado por: Prg en Julio 28, 2010, 10:04:20 pm
mm, cuando usas durezas necesitas asegurarte que siempre se van a poder detectar. si las durezas son de un pixel, y usas un gr[afico de durezas 5 veces más pequeño que el scroll, entonces tienes que revisar cada 5 pixels de movimiento de scroll en tu mapa de durezas.

esto ya no debe darte problemas

[code language="bennu"]for (rd=radio-v;rd<radio;rd++)
          for (ang=0;ang<360000; ang+=30000)
                 if (map_get_pixel ( fpg_fondo , 7 , x+get_distx(ang,rd) , y+get_disty(ang,rd) ) == obstaculo )
                        x-=get_distx(ang,radio-rd); y-=get_disty(ang,radio-rd);
                      END
                    end
      end
[/code]

el protagonista te quedaría así:

[code language="bennu"]PROCESS protagonista()

PRIVATE
   int latencia=2;
   midolor;
   id_texto_mivida;
   freno=0;
   rato;
   radio=80;
   rd;
   ang;
   
PUBLIC
   
   
   vidaprota=1000;

BEGIN

   ctype = C_scroll;
   file = fpg_fondo;
   graph = 1;         
   size = 100;
   
   x=400;                  
   y = 400;               
   Z = -1;
   
   
   
   
   
   LOOP
                        
      latencia--;
      
      
      IF ( key ( _up ) )
         v = v + 0.1;
         IF ( v > 8 );
            v = 8;
         END
         freno=1;
      
      
         
      
      ELSEIF ( key ( _down ) and freno==1 )
         v = v - 0.2;
         IF ( v < 0 );
            v = 0;
            freno=0;
            rato=0;
         END
               
      ELSEIF ( key ( _down ) and freno==0 and rato > 10 )
         
            v = v - 0.1;
            IF ( v < -6 );
               v = -6;
            END         
         
               
      ELSE
      freno=0;
         IF ( v < 0 );
            v=v+0.1;
         END
         IF ( v > 0 );
            v=v-0.1;
            freno=1;
         END
         
      END
      rato++;
      advance(v);
      
      IF ( key ( _left ) )
         angle = angle + 3000;
      ELSEIF ( key ( _right ) )
         angle = angle - 3000;
      END
      
      
      

      //WHILE ( map_get_pixel ( fpg_fondo , 7 , x+radio , y ) == obstaculo ) x--; END
      //WHILE ( map_get_pixel ( fpg_fondo , 7 , x-radio , y ) == obstaculo ) x++; END
      //WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y+radio ) == obstaculo ) y++; END
      //WHILE ( map_get_pixel ( fpg_fondo , 7 , x , y-radio ) == obstaculo ) y--; END

   
   


      
      
      //ponemos los limites para que el protagonista no salga de la pantalla   
      IF ( x > scroll
         x = scroll[0].x0 + C_RESOLUCIONX-10;
      END
      
      IF (x < scroll[0].x0 + 10 )
         x = scroll[0].x0 + 10;
      END
      
      IF ( y > scroll
         y = scroll[0].y0 + C_RESOLUCIONY-10;
      END
      
      IF (y < scroll[0].y0 + 10  )
         y = scroll[0].y0 + 10;
      END


      
            
         
      
      IF ( rand ( 1 , 50 ) == 1 )
         enemigo();
      END
   
   
   
      IF ( midolor = collision ( type disparomalo ) )
         vidaprota = vidaprota - 1;
         signal ( midolor , S_KILL );
      END
      
      
      id_texto_mivida = write ( 0 , x-scroll[0].x0 , ( y - scroll[0].y0 ) + 40 , 4 , "vida:" + vidaprota );
      
      
      for (rd=radio-v;rd<radio;rd++)
          for (ang=0;ang<360000; ang+=30000)
                 if (map_get_pixel ( fpg_fondo , 7 , x+get_distx(ang,rd) , y+get_disty(ang,rd) ) == obstaculo )
                        x-=get_distx(ang,radio-rd); y-=get_disty(ang,radio-rd);
                      END
                    end
      end

      FRAME;
      delete_text ( id_texto_mivida );
   END

END
[/code]

solo que debes encoger el radio, que la verdad lo he probado acá (no se cuánto tienes de radio), pero no pasaba entre los arbustos. saludos
Título: Re: ayuda con durezas
Publicado por: chuflun en Julio 29, 2010, 11:25:41 am
si señor, muchas gracias, funciona de lujo
en serio, muchas gracias y hasta otra