Hola a tuti plen,
estoy realizando un juego con fichas hexagonales e intento hacer que con el ratón puedas moverlas para situarlas en cualquier parte de la pantalla pero no deje moverse por la zona donde haya puesta una ficha ya.
Actualmente tengo un programa que al acercarse a la ficha corrige mal la posición de vuelta y da un efecto como de movimiento constante. A ver si os ocurre otra forma más elegante de solucionar el problema
Program ejemp_col;
Global
depth = 32;
teoricFPS=30;
proc_mouse id_mouse;
local
int idgfx[2];
Begin
rand_seed(get_timer()+(time()%1000)*1000);
set_title("Digital Boardgame");
set_mode(800,600,depth);
set_fps(teoricFPS,0);
write(0,350,180,4,"Digital Boardgame");
write(0,350,210,4,"By DCelso");
write(0,350,240,4,"Press enter to continue");
while(!key(_enter))
frame;
end
while(key(_enter))
frame;
end
delete_text(0);
id_mouse = proc_mouse ();
idgfx[0] = load_png("resources/white.png");
idgfx[1] = load_png("resources/black.png");
movable_object2 (30,50,idgfx[0],100);
movable_object2 (770,50,idgfx[1],100);
while (!key(_esc))
if (key(_f))
if (full_screen==true)
full_screen=false;
else
full_screen=true;
end
set_mode(800,600,depth);
while (key(_f))
frame;
end;
end
frame;
end
let_me_alone();
end
process proc_mouse ()
public
int object_grasped;
private
int graphipcs[2];
int p_dimension[2];
begin
object_grasped = 0;
graphipcs[0] = load_png("resources/pointerOpen.png");
graphipcs[1] = load_png("resources/pointerClose.png");
p_dimension[0]= graphic_info(0,graphipcs[0],G_WIDTH)/2;
p_dimension[1]= graphic_info(0,graphipcs[0],G_HEIGHT)/2;
z = -100;
size = 20;
while (!key(_esc))
alpha =180;
x= mouse.x+20;
y= mouse.y-10;
graph = graphipcs[0];
if (mouse.left)
graph = graphipcs[1];
alpha =100;
end
Frame;
end
unload_map(0,graphipcs[0]);
unload_map(0,graphipcs[1]);
end
process movable_object2 (x,y,graph,int ini_size)
private
offset_x,offset_y;
begin
while (!key(_esc))
if (collision(type mouse))
if (mouse.left)
if (id_mouse.object_grasped == 0)
id_mouse.object_grasped = id;
offset_x = x -mouse.x;
offset_y = y -mouse.y;
else
if (collision(type movable_object2))
mouse.x = x;
mouse.y = y;
end
end
else
if (id_mouse.object_grasped == id)
id_mouse.object_grasped = 0;
end
end
end
if (id_mouse.object_grasped == id)
x= mouse.x+offset_x;
y= mouse.y+offset_y;
end
Frame;
end
end
Podeis usar las imágenes que querais o bien usar el archivo adjunto.
yo lo veo mejor como "buscar el hueco libre que queda más cerca"
solucionado. uso ángulos. estaba pensando en usar for y acercar x++ e y++ hasta colisionar, pero es un poco complicado. aquí abajo está solucionado el problema, sólo espero que funcione cuando tengas muchos procesos e pantalla :)
Gracias, está muy bien pensado, pero no es del todo lo que buscaba.
Si añades las lineas para que el ratón también vuelva a la posicion anterior vuelve a pasar lo mismo que me pasaba a mi, al acercarte y colisionar, se aleja la ficha. Prueba a ponerlo en tu ejemplo
if (exists(id2))
while (collision(id2))
x+=get_distx(fget_angle(x,y,id2.x,id2.y)+180000,2);
y+=get_disty(fget_angle(x,y,id2.x,id2.y)+180000,2);
mouse.x = x;
mouse.y = y;
end
En cambio si pones estas otras lineas el efecto es mas chico pero sigue estando, quiza esta sea la mayor aproximación a lo que busco.
mouse.x+=get_distx(fget_angle(mouse.x,y,id2.x,id2.y)+180000,2);
mouse.y+=get_disty(fget_angle(mouse.x,y,id2.x,id2.y)+180000,2);
Gracias.