ayuda con efecto lupa.

Started by DCelso, March 27, 2010, 02:52:39 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

Hola a todos, estaba intentando probar el efecto lupa para las cartas que comenté en otro post.
Y me he encontrado con lo siguiente.
Tengo un proceso para el ratón y otro proceso para las cartas.
En el proceso del ratón tengo un if collision type carta, y aquí hago el zoom, el problema es que se me hace zoom a dos cartas si estoy muy cerca de los bordes de ésta.
No encuentro el problema, porque yo lo que me esperaba es que solo se hizera zoom a la carta con la que colisiona el ratón más cercana.
A ver si se os ocurre como suplir que se agranden dos cartas, puede que se pueda hacer algo controlando la z pero no estoy seguro.

Os adjunto el minimotor de cartas que he realizado.

http://www.mediafire.com/?tn25inhztzy
Monstruos Diabólicos

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

BoMbErLiNk

He echo un apaño guarro sobre tu código.

[code language="bennu"]PROGRAM solitario;

import "mod_screen"
import "mod_key"
import "mod_video"
import "mod_map"
import "mod_text"
import "mod_draw"
import "mod_math"
import "mod_proc"
import "mod_say"
import "mod_grproc"

#define OROS 1
#define COPAS 2
#define ESPADAS 3
#define BASTOS 4

#define CARD_WIDTH 103
#define CARD_HEIGHT 165

#define H_SPACING 25
#define V_SPACING 50

GLOBAL
   int cartas;
   int depth =16;
   int id_cartas[48];
  int reves;
  int i;
  int step_x,step_y;
  int seleccion;
END

PROCESS carta(  in_valor, in_palo,x,y,pos_x, pos_y)
PUBLIC
   int valor;
   int palo;
   int cara;
   int small_size;
   int big_size;
   int ini_z;
BEGIN
       valor=in_valor;
       palo=in_palo;
       cara=extract_card( pos_x, pos_y, CARD_WIDTH, CARD_HEIGHT);
       graph = reves;
       small_size = 25;
       big_size = small_size*2;
       size =small_size;
       ini_z = z;
       loop
         if (key(_esc)) break; end
         IF (seleccion==0 OR size==big_size)
         if(collision(type p_mouse))
                seleccion=1;
            size =big_size;
            z = -1;
         else
                seleccion=0;
            size =small_size;
            z = ini_z;
             end
                                 end
         frame;
     end
     unload_map(0,cara);
END

PROCESS p_mouse( )
PRIVATE
   carta id_carta;
BEGIN
     z=-2;
       graph = load_png("resources/mouse.png");
       loop
                 say(seleccion);
             x=mouse.x;
             y=mouse.y;
        if (key(_esc)) break; end
        id_carta = collision(type carta);
        if ( id_carta)
               if ( mouse.right)
                  if (id_carta.graph == reves)
                     id_carta.graph = id_carta.cara;
                     else
                       id_carta.graph = reves;
                     end
                  while(mouse.right) frame;end
               end
            end

        frame;
     end
     unload_map(0,graph);
END

FUNCTION extract_card( int pos_x, int pos_y, int width, int height)
BEGIN
  graph = map_new(width,height,depth);
  map_block_copy ( 0 , graph , 0 , 0 , cartas , pos_x , pos_y , width , height, 0);
   return graph;
END

PROCESS main()
BEGIN
     full_screen=false;
       set_mode(320,240,depth);
     set_fps(60,0);

     cartas=load_png("resources/cartas.png");
     reves=load_png("resources/reves.png");
     p_mouse();

       for (i = OROS;i<=BASTOS;i++)
          x=20;
         y=50 * i;
         step_x=(9+CARD_WIDTH)*(i-1);
         step_y=(7+CARD_HEIGHT)*(i-1);
          carta(1,i,x,y,25+step_x,15);
          x+=H_SPACING;
          carta(2,i,x,y,1068,14+step_y);
          x+=H_SPACING;
          carta(3,i,x,y,624+step_x,701);
          x+=H_SPACING;
          carta(4,i,x,y,624+step_x,529);
          x+=H_SPACING;
          carta(5,i,x,y,624+step_x,357);
          x+=H_SPACING;
          carta(6,i,x,y,624+step_x,187);
          x+=H_SPACING;
          carta(7,i,x,y,624+step_x,14);
          x+=H_SPACING;
          carta(8,i,x,y,468,14+step_y);
          x+=H_SPACING;
          carta(9,i,x,y,25+step_x,702);
          x+=H_SPACING;
          carta(10,i,x,y,25+step_x,187);
          x+=H_SPACING;
          carta(11,i,x,y,25+step_x,359);
          x+=H_SPACING;
          carta(12,i,x,y,25+step_x,529);
       end
     unload_map(0,cartas);

       loop
         if (key(_esc)) break; end
         frame;
     end

     unload_map(0,reves);
     let_me_alone();
     exit(0,0);
END[/code]

Windgate

Se me ocurre hacer un WHILE collision ( ), almacenando los identificadores de proceso colisionantes en un vector. Posteriormente puede memorizarse en otro vector las distancias de separación y finalmente obtener el identificador de proceso más cercano.

No es una tarea inmediata, pero si lo separas en FUNCTIONs puede hacerse fácilmente.

Lo digo como comentario al vuelo y en plan teórico, veo por ahí mucho código de Bomber sobre el juego de cartas e imagino que habrá propuesto otra buena solución al respecto :P Creo que ya comenté que nunca he sido amigo de juegos de cartas y aunque sigo todos los hilos no estoy muy al tanto de ese :D
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

BoMbErLiNk

Bueno yo solo le he añadido un int seleccion y poco más sobre el código original, el test me ha funcionado bien :)

DCelso

oh, fantástico, funciona. No entiendo muy bien su lógica pero va, ¿Puedes explicarme eso de la variable selección?
Monstruos Diabólicos

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

BoMbErLiNk

Ah es muy simple, solo quieres una carta activa con zoom, entonces todo se reduce a 0 o 1 a nivel global.

Lo que hace seleccion es modificar directamente la logica del programa, bloqueando las colisiones de todas las cartas excepto la que ahora mismo esta con zoom, porque necesitaras saber cuando deja de tocarla para devolverle su posición neutral :

IF (seleccion==0 OR size==big_size)

Me he dejado un say(seleccion); por ahí al debugear  ;D, puedes borrarlo si no lo necesitas  ;)

DCelso

otia, qué facil, muy bien pensado. En cuanto al say ni me dí cuenta, leí el código que pusiste e implemente lo de la selección en el mío así que no copié el say :D.
Monstruos Diabólicos

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

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2