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
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]
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
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 :)
oh, fantástico, funciona. No entiendo muy bien su lógica pero va, ¿Puedes explicarme eso de la variable selección?
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 ;)
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.
como hacia yo en la GUI...