Tontadas y pamplinas + Otras dudas

Started by Futu-block, August 19, 2016, 01:28:24 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Futu-block

Otra:

si estoy pulsando el raton (mouse.left) y aprovecho y muevo lo que sea, ese proceso adopta la x,y del raton y toa la pesca, pero cuando sale de un area o de una determinada coordenada debe de pasar como si se soltara el raton (!mouse.left) pero no puedo dar esa orden...

¿como hago para que cuando necesite forzar el soltar el click deje de actuar el raton?

Drumpi

Cambiar el punto de control es útil para eso, simplificarte la vida. Por ejemplo, en los juegos de plataformas, es más conveniente tener el punto de control centrado en la parte de abajo a la altura de los pies, porque por lo general, vas a hacer comprobaciones de dureza con el suelo, y es más simple si el punto de control está directamente en contacto con él... aunque ya no podrías usar las rotaciones ^^U
Otro ejemplo: crear una ventana o una imágen de muestra. Para colocarla en una posición puede ser interesante que el punto de control, en lugar de estar en el centro y luego tener que consultar cuál es la mitad del tamaño de la imagen para poder alinearla, puedes necesitarla en la esquina superior izquierda, para eso usas
SET_CENTER(file, graph, x, y);
y listo. También puedes usar SET_POINT con el punto 0... o con cualquiera si necesitas tener otros puntos de referencia, aunque se escale, rote, etc...

Para el tema del ratón depende de cómo hayas hecho el código.
Yo le crearía al proceso varios estados, para no tener al proceso atrapado en un bucle secundario hasta que volviera a su estado de reposo.
Los estados serían algo como "en reposo", "agarrado", "seleccionado"... En tu caso tendría los dos primeros (ponle los valores 0 y 1, o usa constantes, que para esto es muy útil).

Tras la inicialización del proceso (ponerlo en un sitio, setear file y graph, etc) y entrar en su bucle principal (tienes que tener un bucle para llamar a frame y mantener al proceso vivo ¿no?) tendría un switch que miraría su estado actual.
En el estado "reposo" comprobaría si se ha hecho clic sobre él (ya sabes: si antes mouse.left no estaba pulsado, ahora sí, y sus coordenadas son las del proceso) y cambiaría de estado.
En el estado "agarrado" haría lo que tiene que hacer: moverse, animarse o lo que sea. Pero también comprobaría si se da alguna de las condiciones para volver al estado "reposo", en tu caso, si se ha soltado el ratón o si las coordenadas están fuera de un rango.

Algo así

process vetana (file, graph, x, y)
private
    int estado;
    int ant_raton;
begin
    loop
        switch (estado)
        case 0: //reposo
            if (!ant_raton && mouse.left && collision(type mouse))
                estado = 1;
            end
        end
        case 1:
            x = mouse.x;
            y = mouse.y;
            if (!mouse.left || (x < 0) || (x > 100) || (y < 0) || (y > 80))
                estado = 0;
            end
        end
        end //switch

        ant_raton = mouse.left;
        frame;
    end
end


Incluso puedes tener un tercer estado para que mientras se siga pulsando el ratón y esté fuera de la zona que quieres siga "agarrado" pero no se mueva hasta que vuelva a entrar en la zona que quieres, momento en el que vuelve al auténtico estado "agarrado", pero que si se suelta el ratón vuelva al estado reposo.
Esto es lo que se llama una "máquina de estados". Échale un vistazo al tema y a cómo se dibuja. Básicamente son círculos con estados, que se unen con lineas cuando se puede pasar de uno a otro y bajo qué condiciones. Son muy úitles y se utiliza para todo: desde los estados de los botones en un IDE, hasta en inteligencia artificial.
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)

Futu-block

Es muy interesante, y era lo que precisamente andaba buscando, gracias

Futu-block

Otra no tan tonta:

a un proceso le asigno un grafico que consulto con map_info, luego le modifico el size_x/y pero los resultados sigue siendo los mismos, a pesar que los meto dentro del loop:


...
private
int alto,ancho;

    begin
    write_var(0,10, 20,1,alto);
    write_var(0,10, 30,1,ancho); 
    loop
        alto = map_info(0, graph, g_height);
        ancho = map_info(0, graph, g_width);
...


Otra:

para que un grafico no se salga de la pantalla o area visible, ya que lo muevo con los cursores, lo suyo es una colisión con un grafico ''tope'' que anule la pulsación de la tecla, una dureza, vamos; pero sirve si le aumento el size_x/y ?? porque lo que he puesto antes me informa que el grafico sigue midiendo lo mismo...
O la colision es con el grafico independientemente de el tamaño o size_x/y que tenga


Otra mas:
He pensado que si el size aumenta por porcentajes, hacerlo a la cuenta de la vieja y hacer la operación por otro lado...

¿como se hace operaciones de sumas o restas de un porcentaje? (esto si que es de parvulitos, ja ja)
¿seria correcta la siguiente expresion pues?

tamaño = 564 + 12%;
equivalente a 564 altura sprite + 12 size_y = tamaño


Drumpi

MAP_INFO te devuelve la información del mapa, del gráfico, no del proceso. Por eso siempre te devuelve el mismo valor, porque no influyen las variables de ningún proceso.
Sin embargo, collision si que tiene en cuenta el tamaño, la rotación, etc del proceso, porque la colisión va asociada al proceso, mientras que MAP_INFO lo está a la imagen que has cargado.

Si quieres saber qué tamaño tiene un gráfico de un proceso, depende de si estás usando SIZE o SIZE_X y SIZE_Y

tamaño_x = (MAP_INFO(file, graph, G_WIDTH) * size) / 100;
tamaño_y = (MAP_INFO(file, graph, G_HEIGHT) * size) / 100;

o bien

tamaño_x = (MAP_INFO(file, graph, G_WIDTH) * size_x) / 100;
tamaño_y = (MAP_INFO(file, graph, G_HEIGHT) * size_y) / 100;

ya que tanto size, como size_x y size_y indican porcentajes (y son independientes unos de otros, ojo con eso). 100% debería quedarte el mismo tamaño, o sea, que debería multiplicarse por 1 = 100/100
200% debería quedarte el doble, o sea, que debería multiplicarse por 2 = 200/100.
50% debería quedarte a la mitad, o sea, que debería multiplicarse por 0'5 = 50/100 = 1/2.
Es una simple regla de proporcionalidad o "regla de tres", de las que se estudiaban en 6º o 7º :D
Eso sí, asegurate de realizar las multiplicaciones antes que las divisiones. Estamos usando enteros y en las divisiones descartamos los decimales, perdiendo precisión en el camino.
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)

Futu-block

Vale, otra:

·Quiero hacer click en una imagen y moverla; lo que hago es: al hacer click la x/y de la imagen (es un proceso con una imagen graph = tal;) pasa a formar parte del raton, con lo cual pega un salto muy grande si el raton está muy lejos del centro del grafico...
¿como se remedia?


SplinterGU

al momento del click calculas el desplazamiento/offset entre coordenadas del mouse - coordenadas del grafico... y luego vas sumando estos desplazamientos a las coordenadas del grafico mientras este se este moviendo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

¿y si le cambio el punto de control a donde clickeo?
es mas facil o no?

¿como se le cambia el centro?
creo que lo tengo en anteriores mensajes...

SplinterGU

Quote from: Futu-block on November 21, 2016, 05:58:34 PM
¿y si le cambio el punto de control a donde clickeo?
es mas facil o no?

¿como se le cambia el centro?
creo que lo tengo en anteriores mensajes...

pero estas modificando el grafico original, y tenes que calcular el offset y ademas de eso recuperar luego el centro... me parece que es mas problematico
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

bien, justo al inicio de esta pagina me lo explica drumpi, lo probaré asi a ver que problemas dá...

tambien usaré el offset ese que me dice splinter, que si lo he entendido bien no se refiere a ninguna función en especial llamada offset ni nada, sino a la diferencia entre el raton y el centro de la imagen ;)

SplinterGU

Quote from: Futu-block on November 21, 2016, 06:23:00 PM
bien, justo al inicio de esta pagina me lo explica drumpi, lo probaré asi a ver que problemas dá...

tambien usaré el offset ese que me dice splinter, que si lo he entendido bien no se refiere a ninguna función en especial llamada offset ni nada, sino a la diferencia entre el raton y el centro de la imagen ;)

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

Futu-block

bueno, o no lo estoy haciendo bien o me falla esto:


            if (mouse.x > parte[foco1])
                nueva_x = mouse.x - parte[foco1].x;
            end


hago una comprobación si la x del raton mide mas que la x del proceso, y luego le asigno la resta de ambas...

·¿acaso estoy obviando algo o haciendo algo prohibido?
·¿deberia hacer la resta sin preguntar si es payor ni nada? igual si uso datos negativos es mas facil

y para terminar, lo uso en un proceso llamado por otro, osea en un hijo y me devuelve este error solo al hacer click

ERROR: Runtime error in BOTONERA2(65539) - Process 0 not active


Drumpi

Sin leerme el código, te digo ya que estás comparando la coordenada X del ratón con lo que parece el ID de un proceso :D
También te digo que, antes de comprobar las variables locales de un proceso, te asegures:
- De que la variable NO VALE 0 (que es el error que te está dando).
- De que el proceso en cuestión existe (comando "exists").

Del resto no te puedo ayudar ahora, sorry, no estoy para leer ni mi propio código ^^U (llevo una semana que os tengo abandonados en Telegram, a ver si se acaba esta racha de trabajo, ayudo a DCelso con la IA de los enemigos y el pathfind, y empiezo el proyecto de Android, que ya va siendo hora).
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)

Futu-block


Futu-block

Otra y nueva...
¿¿
map_get_pixel y map_put_pixel no atiende a variables privadas??

Es decir, tengo dos procesos ''clon'' vamos practicamente son iguales a excepción de la numeración de los graficos
y no, no puedo simplificar mas pues son procesos independientes con comportamientos iguales... (o alguien que lo simpilfique por mi :P lol )

El caso es que le pongo variables privadas pero con el mismo nombre y le hago el map get pixel y luego el put  pixel pero al parecer esas funciones se la sudan y hace solo del primer proceso...

Al parecer lo que debo de hacer es cuando haga el map get pixel en el primer proceso, me lo haga en los dos, aunque no me interesa porque tarda mucho, debo hacerlo; y digo que tarda mucho porque son 12 graficos por cada proceso mas o menos 250.000 comprobaciones (500x500) y cambio de color multiplicado por 3 procesos...
los calculos se desbordan

·Conclusión, o estoy haciendolo mal y si atiende a variables privadas dentro de los procesos, o es como el path finder, que solo hay uno para todo