Problemas con Region + scroll + out_region

Started by Arcontus, January 09, 2018, 02:41:57 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Hola chicos,

estoy experimentando un problema de lo más extraño. Es bastante simple viendolo pero un poco abstracto de explicar, voy a intentarlo:
Tengo un proceso circulo() de lo mas simple que me dice si esta dentro de la region o no, esta en un scroll y se controla el movimiento con el mouse:


process circulo()
PRIVATE
    int tamano, radio, txtid[3], indice;
    string txt[10];
END
BEGIN
    radio = 1;
    ctype=c_scroll;
    tamano = radio*2;
    region = 1;
    graph = new_map(tamano+1, tamano+1, 32);
    drawing_map(0,graph);
    drawing_color(rgba(255,255,255,175));
    draw_fcircle(radio, radio, radio);
    txtid[0] = write_string(0,200,200,0,&txt[0]);
    txtid[1] = write_string(0,200,220,0,&txt[1]);
    txtid[2] = write_string(0,200,240,0,&txt[2]);
    while(!(key(_esc)))
        x = mouse.x;
        y = mouse.y;
        if (out_region(ID, 1) == 0)
            txt[0] = "en la region";
        else
            txt[0] = "fuera de la region";
        END
        txt[1] = "x: " +x;
        txt[2] = "y: " +y;
        FRAME;
    END
OnExit:
    map_unload(0,graph);
    for(indice=0;indice<3;indice++)
        delete_text(txtid[indice]);
    END
    delete_text(txtid[0]);
END


Tengo un proceso cam() que mueve el scroll con las flechas.


PROCESS cam()
private
    int DEFAULT_MOVIMIENTO_CAMARA, fondoFPG;
end
begin
    fondoFPG = load_fpg("FPG/Fondos.fpg");
    Start_scroll( 0, fondoFPG, 3, 0, 1, 15);
    x = 250;
    y = 250;
    DEFAULT_MOVIMIENTO_CAMARA = 10;
    ctype=c_scroll;
    scroll[0].camera=id;
    while(!(key(_esc)))
        if (key (_up)) y = y - DEFAULT_MOVIMIENTO_CAMARA;END
        if (key (_down)) y = y + DEFAULT_MOVIMIENTO_CAMARA;END
        if (key (_left)) x = x - DEFAULT_MOVIMIENTO_CAMARA;END
        if (key (_right)) x = x + DEFAULT_MOVIMIENTO_CAMARA;END
        FRAME;
    END
OnExit
    stop_scroll(0);
end


Y por último un proceso main() que define una region y una resolucion inicial:

Process Main()
Begin
    scale_resolution = 19201080;
    set_mode(1024,768,32, mode_window);
    region_define ( 1 , 200 , 0, 500 , 500);
    cam();
    circulo();
    while(!(key(_ESC)))
        FRAME;
    END
END


El problema, es que circulo() a veces dice que esta fuera de la region sin estarlo, y otras veces que esta dentro siendo falso. De hecho, lo que está sucediendo es que la region comienza en x=200, asi que los graficos que estan dentro del scroll devuelven out_region true hasta que no superan esa marca, (suponiendo que la esquina superior izquierda este en el punto 0,0).

Alguien ha tenido antes este problema o se le ocurre una solucion al mismo??
Dejo el codigo, lo unico que tenéis que hacer es poner un fpg valido y un id de grafico valido para que inicialice el scroll


import "mod_key"
import "mod_video"
import "mod_text"
import "mod_map"
import "mod_mouse"
import "mod_draw"
import "mod_screen"
import "mod_scroll"


process circulo()
PRIVATE
    int tamano, radio, txtid[3], indice;
    string txt[10];
END
BEGIN
    radio = 1;
    ctype=c_scroll;
    tamano = radio*2;
    region = 1;
    graph = new_map(tamano+1, tamano+1, 32);
    drawing_map(0,graph);
    drawing_color(rgba(255,255,255,175));
    draw_fcircle(radio, radio, radio);
    txtid[0] = write_string(0,200,200,0,&txt[0]);
    txtid[1] = write_string(0,200,220,0,&txt[1]);
    txtid[2] = write_string(0,200,240,0,&txt[2]);
    while(!(key(_esc)))
        x = mouse.x;
        y = mouse.y;
        if (out_region(ID, 1) == 0)
            txt[0] = "en la region";
        else
            txt[0] = "fuera de la region";
        END
        txt[1] = "x: " +x;
        txt[2] = "y: " +y;
        FRAME;
    END
OnExit:
    map_unload(0,graph);
    for(indice=0;indice<3;indice++)
        delete_text(txtid[indice]);
    END
    delete_text(txtid[0]);
END


PROCESS cam()
private
    int DEFAULT_MOVIMIENTO_CAMARA, fondoFPG;
end
begin
    fondoFPG = load_fpg("FPG/Fondos.fpg");
    Start_scroll( 0, fondoFPG, 3, 0, 1, 15);
    x = 250;
    y = 250;
    DEFAULT_MOVIMIENTO_CAMARA = 10;
    ctype=c_scroll;
    scroll[0].camera=id;
    while(!(key(_esc)))
        if (key (_up)) y = y - DEFAULT_MOVIMIENTO_CAMARA;END
        if (key (_down)) y = y + DEFAULT_MOVIMIENTO_CAMARA;END
        if (key (_left)) x = x - DEFAULT_MOVIMIENTO_CAMARA;END
        if (key (_right)) x = x + DEFAULT_MOVIMIENTO_CAMARA;END
        FRAME;
    END
OnExit
    stop_scroll(0);
end


Process Main()
Begin
    scale_resolution = 19201080;
    set_mode(1024,768,32, mode_window);
    region_define ( 1 , 200 , 0, 500 , 500);
    cam();
    circulo();
    while(!(key(_ESC)))
        FRAME;
    END
END
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

podrias hacerlo mas facil y colgar un proyecto compilable?

pero no se si intentas usar region con respecto a la pantalla o al scroll? cuando esta en un scroll creo recordar que es con respecto al mismo... pero no me acuerdo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Quote from: SplinterGU on January 11, 2018, 09:27:20 PM
podrias hacerlo mas facil y colgar un proyecto compilable?

pero no se si intentas usar region con respecto a la pantalla o al scroll? cuando esta en un scroll creo recordar que es con respecto al mismo... pero no me acuerdo...

Hola Splinter, está el código del proyecto compilable en el último bloque, solo necesita un FPG con una imagen valida para inicializar el scroll, pero cualquier imagen sirve.

Un saludo!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

ok, luego con tiempo armo algo y le echo un ojo, es que ahora ando con poco tiempo, mas facil era un zip con todo lo necesario (sin binarios bennugd)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No me hagais mucho caso, pero hubo un tiempo en que un proceso, aun dentro de un scroll, usaba los valores de pantalla para el cálculo de OUT_REGION, y había que hacer el cálculo manualmente. No sé si me he explicado.
Por ejemplo: si un proceso lo ponemos como target del scroll para que el scroll lo siga siempre, si la pantalla es de 640x480 y el gráfico mide 10x10, cuando la X del proceso llegaba a 650, empezaba a mandar Out_region == true, pese a estar en el centro de la pantalla.

Lo que ya no me acuerdo es de si eso llegó a cambiarse o no.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

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

Arcontus

Pues creo que está relacionado con lo que dice Drumpi.  :'(
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

aun no logro tiempo para hacerme de un fpg, tocar el codigo y demas... cuando pueda lo hago... quizas son 2 minutos, pero si no lo son pierdo mucho tiempo... por eso decia colgar un zip con todos los fuentes y graficos listos para compilar y probar.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

puf, lo intente, pero vaya a saber donde tengo un fpg con fondos, y que sean de las dimensiones que tu pruebas para no tener diferencias en el test.

por favor, cuelga algo completo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Hola SplinterGU, aquí tienes el ejemplo completo, gracias por la ayuda.

Un saludo!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

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

SplinterGU

el fpg esta mal, no corresponde el nombre ni muestra el grafico renombrandolo...

como sea, yo lo veo bien, tu defines una region de 200,0 con un tamaño de 500 x 500, o sea, desde 200,0 a 700, 500...

con lo que esta bien, a mi me da valores correctos

por otro lado, te falta cnumber en los procesos, aunque al ser scroll 0, no afecta
Download Lastest BennuGD Release: http://www.bennugd.org/node/2