Movimiento de objetos con el ratón

Started by DCelso, February 05, 2009, 10:01:50 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

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.
Monstruos Diabólicos

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

laghengar

yo lo veo mejor como "buscar el hueco libre que queda más cerca"
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

Prg

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 :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

DCelso

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.
Monstruos Diabólicos

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