Cuadro de selección

Started by Yawin, December 03, 2010, 11:04:38 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Yawin

Quote from: Futublock on December 03, 2010, 07:37:14 PM
lo que quieres es una rectangulo como se hace con el paint ¿no?

Lo que quiero hacer (y ya he conseguido hacer) es un cuadr de selección. Sólo que, tu creas un proceso y le asignas un gráfico, y el gráfico se pinta con la x y la y como centro. Por tanto, lo que necesito es calcular toooooodo el rato, cual tiene que ser el centro, size_x y size_y  para que un vértice del cuadro sea donde he clickado y el opuesto sea donde tengo el ratón xD

Por suerte, lo he conseguido con un codigo que he peusto hace algunos posts.


Gracias Drumpi por las respuestas. Todavía no he pensado bien qué haré. No me he metido todavía con punteros, y espero tardar en hacerlo xD

En cuanto a lo de las globales, lo que he hecho ha sido crear un archivo "globales.prg" y otro llamado "constantes.prg". La cosa es que no se que pasaba en mi arcade, que no me iba con la misma estructura xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Yawin

Continuando con mis dudas...
Esta vez no es el cuadro de selección. Veréis, durante esta tarde he codificado esto:
http://www.pensarescompartir.com/lahsoft/lahsoftcorp/?direc=fenix/&id=Age_of_Yawin.rar

Es un intento de estrategia en tiempo real. Las partes que lo componen son:

Main (proceso principal del programa).
Inic_fpgs (proceso que carga los fpg.
Control (para poder salir de alguna forma xD).
Import (los imports).
Include (los includes).
Globales (las globales).
Constantes (las constantes).

Puntero (el ratón).
Panel_abajo(El panel donde irán las opciones de cada unidad/edificio).

Guerrero (unidades de tipo guerrero).
Cuadro_sel (cuadro de selección).

Funciones.prg (este archivo guarda todas las funciones que vaya haciendo).


He conseguido que cada unidad creada pueda ser seleccionada por separado y por conjunto. Que las unidades se dividan por facciones; de forma que sólo puedas seleccionar y controlar a las unidades que tengan tu misma "faction".

Cosas que me fallan:
-Cuando dos unidades están una encima de la otra y hago click para seleccionar una, se seleccionan las dos.

-No se me ocurre cómo hacer para que teniendo una o más unidades seleccionadas, al hacer click derecho encima de una unidad de otra "faction", la seleccionen como objetivo (todas las unidades tienen una variable pública llamada "objetivo").
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Lo del rectángulo podrías haber usado primitivas gráficas (DRAW_RECT, DRAW_BOX) o haber hecho un cuadrado con el centro en la esquina inicial, en lugar de tener que ir recalculando... o no, a lo mejor se me escapa algo ^^U

Respecto al uso del ratón: lo de que se te seleccionan las dos, supongo que será porque las unidades detectan colisiones con el ratón, al igual que al seleccionar unidades enemigas. No estoy seguro si lo que te voy a decir es lo más conveniente, pero creo que deberías pensar en hacer las selecciones al revés, que sea el ratón (o un proceso de 1 pixel situado siempre bajo este) el que detecte contra quien colisiona, y después ver la facción, si hay alguno superpuesto y demás y reaccionar como se deba.

Te digo que no lo sé porque puede haber algún inconveninete a la hora de dar órdenes a los procesos, o que te pase como con los IDE, que deben ser los propios botones y demás elementos los que reaccionen a los clics del ratón para simplificar el código.

Creo que en DIV había un juego de estrategia en tiempo real que puede servir de guía... Aunque siempre he pensado que la mejor manera de aprender es intentarlo tú mismo (es más lento, pero aprendes mucho mejor).
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)

DjSonyk

Quote from: yawin on December 03, 2010, 11:20:00 PM
Cosas que me fallan:
-Cuando dos unidades están una encima de la otra y hago click para seleccionar una, se seleccionan las dos.
Deverias ir pensando en que no se puedan poner encima unos de otros...
Primero porque te solucionaria lo del click.Segundo eso hoy en dia queda fatal.Tercero seguiras teniendo problemas aun solucionandolo con lo que te comento Drumpi,y no es porque no sea la solución que es la solución,valgase,pero luego tendras problemas con los disparos,y demas...
Quote from: yawin on December 03, 2010, 11:20:00 PM
-No se me ocurre cómo hacer para que teniendo una o más unidades seleccionadas, al hacer click derecho encima de una unidad de otra "faction", la seleccionen como objetivo (todas las unidades tienen una variable pública llamada "objetivo").
Una solución a eso seria,las unidades que estuvieran selecionadas que estuvieran en alerta al siguiente/s acciones del raton ,y si se seleciona una unidad/edificio enemigo,que se dirijieran a ella,algo asi como un flag,ejemplo: soy una unidad y estoy selecionada si el ratón me señala un objetivo enemigo me lo cargo ... ;P
EDIT:Lo de hacer un juego de estratejia esta en mi lista y es lo siguiente ....

Yawin

#19
Esta noche, la almohada me ha estado susurrando sobre seleccionar objetivos:
Las unidades, cuando están en estado activo, están a la espera de un click derecho (o izquierdo). Pues puedo hacer una variable pública en el raton que detecte con quién ha hecho click. Es decir, si hago click con algo de otra facción (ya sea unidad, edificio, o lo que sea) recogerá su ID y la guardará en la variable pública "obj". Si al hacer click, no chocaba con nada, pondrá un -1.

Luego, todas las unidades que estén activas, comprobarán si hay contenido en esa variable publica "ppunt.obj". Si encuentran algo superior a 0, es que hay un id. Asi que se ponen en estado Combate. Si no, se ponen en estado movimiento.

¿Que os parece?¿Funcionará?
Ahora me voy a por un café. Luego lo codifico.
_________________________________________________

edit:
He empezado a codificar, pero me salta un error:
process puntero()
public
bool puas=false;
int obj=-1;
end
private
int cont=0;
end
begin
file=fpgs[0];
graph=1;
z=-5;

mouse.x=resol_x/2;
mouse.y=resol_y/2;

loop
if(key(_p))
while(key(_p))
frame;
end
if(puas!=true)
signal(puni[0], s_freeze);
puas=true;
else
signal(puni[0],s_wakeup);
puas=false;
end
end
x=mouse.x;
y=mouse.y;

if(mouse.left)
cont++;
if(cont>5)
cont=0;
cuadro_sel(x,y);
repeat
x=mouse.x;
y=mouse.y;
frame;
until(!mouse.left);
end
else
cont=0;
end
if(mouse.right)
if(obj=collision(type unidad))
if(obj.faction==faction_jug) <-Me dice: Unknown identifier ("FACTION")
obj=-1;
end
else
obj=-1;
end
end
frame;
end
end

La cosa es que "FACTION" es una variable pública. Si quito faction y pongo X entonces me dice que el unknown identifier es obj, pero está declarado en la zona de públicas.

No se si esque estoy espeso o que, pero no encuentro el problema real.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

DCelso

Umn, problema de principiante

int obj=-1;
...
if(obj.faction==faction_jug) <-Me dice: Unknown identifier ("FACTION")
obj=-1;
end

para poder acceder a variables personalizadas de un proceso  a través de su identificador debes definirlo con el tipo de proceso que es y no con int.

unidad obj = -1;
Monstruos Diabólicos

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

Yawin

#21
pero...
obj es un int, no es una variable de tipo unidad...
No lo entiendo.

Lo que quiero es sacar la id del proceso objetivo y gcomprobar que su variable pública faction es la del jugador.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

DjSonyk

En Bennu no hay variables publicas como tal,son globales,es un tipo de variable que se puede leer y modificar en cualquier proceso/s y es la misma para todo el programa,locales son variables que las pueden tener en comun todos los procesos como puede ser x,y,size,ect y privados que son de uso exclusivo del proceso.Me imagino yawin que lo sabes pero lo aclaro para los mas nuevos,entoces...
          Leer                          /   Modificar
Dato Global:
if (puntos==30000) ...            /   puntos+=250;
Dato Local
if (nave_protagonista.x==150) /   nave_protagonista.y=15;
Dato privado solo puede ser leido desde el mismo proceso ,y se haria igual que un dato global o sea nombre.
if (mi_dato_privado).......       /    mi_dato_privado=5;
Si intentas acceder a un dato privado desde fuera del proceso que le creo aun cuando sea con el identificador del proceso como lo podrias hacer con el ejemplo del dato local te dara ese error "Unknown identifier ".
Ademas los tipos de datos locales tienen que estar declarados despues de los globales.

Yawin

entonces cómo puedo hacer para acceder a esa variable que yo he declarado dentro de la zona PUBLIC del proceso desde otro proceso que no sea el que lo ha llamado?
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

DjSonyk

#24
Al igual que si fuera local , id del proceso punto nombre de la variable.
id.faction_jug;

Edit: Acabo de hecharle un ojo a tu codigo ,normal que no te diga  Unknown identifier ("FACTION") puesto que faction pertenece a la llamada del proceso y no es una variable valida fuera de ese proceso es como si fuera una variable privada. Prueba a ponerla como local si la van a utilizar todos tus procesos,aunque variables locales no merecen la pena......

DCelso

umn, no me hiciste ni caso eh.

Tu problema sigue siendo que tienes que definir obj como unidad no como entero. Si no entiendes el motivo, es fácil, los procesos devuelven un identificador (algo como un HASH) este si declaras una variable de tipo proceso como hice yo (unidad es un proceso) entonces Bennu entenderá que es un identificador para controlar un proceso del tipo especificado (en tu caso proceso de tipo unidad) y así sabrá acceder a sus variables públicas y locales.
Como tu defines un int, pues un entero no tiene campos porque no es una estructura así que te peta, (pero bennu intenta asumir que es de tipo proceso general y sí podrías acceder a las variables comunes a todos los procesos como son x,y,z,size,graph).

A ver si te queda más claro con un ejemplo, básicamente me he basado en tu código eliminando lo que no entendía y añadiendo gráficos cuadrados creados en runtime.

import "mod_map"
import "mod_video"
import "mod_grproc"
import "mod_proc"
import "mod_key"
import "mod_mouse"

global
resol_x = 800;
resol_y= 600;
faction_jug = 0;
faction_comp = 1;
end


process unidad(x,y,faction_in)
public
faction;
selected =0;
graph_player,graph_playerSel,graph_enemy;
begin
faction =faction_in;
graph_player = map_new(20,20,32);
map_clear(0,graph_player,RGB(200,200,200));
graph_playerSel = map_new(20,20,32);
map_clear(0,graph_playerSel,RGB(0,255,0));
graph_enemy = map_new(20,20,32);
map_clear(0,graph_enemy,RGB(0,255,255));
loop
   if(faction == faction_jug)
if (selected)
graph = graph_playerSel;
else
graph = graph_player;
end
   else
graph = graph_enemy;
   end
   frame;
end
unload_map(0,graph_player);
unload_map(0,graph_playerSel);
unload_map(0,graph_enemy);
end

process puntero()
public
bool puas=false;
unidad obj=-1; //[b] esta linea es la que tienes mal, si pruebas este ejemplo con int obj, verás que da el mismo erro que te da a tí.[/b]
end
begin
graph=map_new(4,4,32);
map_clear(0,graph,RGB(0,0,255));
z=-5;

loop
x=mouse.x;
y=mouse.y;
if(key(_p))
while(key(_p))
frame;
end/*
if(puas!=true)
signal(puni[0], s_freeze);
puas=true;
else
signal(puni[0],s_wakeup);
puas=false;
end*/
end
if(mouse.right)
if(obj=collision(type unidad))
if(obj.faction==faction_jug) //Me dice: Unknown identifier ("FACTION")
obj.selected = !obj.selected;
end
end
while (mouse.right) frame;end;
end
frame;
end
unload_map(0,graph);
end

process main()
begin
set_mode(resol_x,resol_y,32);
unidad(20,20,faction_jug);
unidad(40,40,faction_comp);
unidad(60,20,faction_comp);
unidad(80,4,faction_jug);
puntero();
while (!key(_esc))
frame;
end
let_me_alone();
end
Monstruos Diabólicos

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

DjSonyk

#26
Lo que le pasaba mas bien esque queria acceder a una variable declarada en la llamada ,esta es la linea suya.

process guerrero(int grafin, int veloc, int aux, int aux2, int aux3, int faction)

y queria acceder a faction y claro eso no puede ser.
Veo que se lo has correjido y asi si que puede acceder a faction  correctamente. :P
process unidad(x,y,faction_in)
public
   faction;
....
begin
   faction =faction_in;

DCelso

Monstruos Diabólicos

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

Yawin

#28
Quote from: DjSonyk on December 04, 2010, 06:20:51 PM
Lo que le pasaba mas bien esque queria acceder a una variable declarada en la llamada ,esta es la linea suya.

process guerrero(int grafin, int veloc, int aux, int aux2, int aux3, int faction)

y queria acceder a faction y claro eso no puede ser.
Veo que se lo has correjido y asi si que puede acceder a faction  correctamente. :P
process unidad(x,y,faction_in)
public
   faction;
....
begin
   faction =faction_in;

No, la variable que tu dices, cuando empecé a coder esto pasó a llamarse fact. Y dentro de la unidad hay una linea que die fation=fact. Y ese faction es público.

Veré si me funciona lo que dices dcelso. Creo que lo he entendido.
_____________________________________________________________

Edit:
Sigue sin irme. He hecho lo que me dijiste DCelso.
process puntero()
public
bool puas=false;
unidad obj;
end
private
int cont=0;
end
begin
file=fpgs[0];
graph=1;
z=-5;

mouse.x=resol_x/2;
mouse.y=resol_y/2;

loop
if(key(_p))
while(key(_p))
frame;
end
if(puas!=true)
signal(puni[0], s_freeze);
puas=true;
else
signal(puni[0],s_wakeup);
puas=false;
end
end
x=mouse.x;
y=mouse.y;

if(mouse.left)
cont++;
if(cont>5)
cont=0;
cuadro_sel(x,y);
repeat
x=mouse.x;
y=mouse.y;
frame;
until(!mouse.left);
end
else
cont=0;
end
if(mouse.right)
if(obj=collision(type unidad))
if(obj.faction==faction_jug)
obj=-1;
end
else
obj=-1;
end
end
frame;
end
end


La unidad, es esta:
process unidad(int grafin, int veloc, int aux, int aux2, int aux3, int fact)
public
int vida;
bool activ;
int estado;
int objetivo;
int faction;
end
private
int dest_x;
int dest_y;
int id_aux;
bool met=false;
begin
file=fpgs[faction];
size=50;
faction=fact;

///////////////////////////
angle=0+aux3;
x=50+aux2;
y=50+aux;
write_var(0,x+51,y+50,1,dest_x);
write_var(0,x+51,y+65,1,dest_y);
write_var(0,x+86,y+50,3,x);
write_var(0,x+86,y+65,3,y);
write_var(0,x+86,y+32,3,angle);
write_var(0,x+51,y+32,3,graph);
write_var(0,x+51,y+15,3,activ);
///////////////////////////

loop
graph=grafin+control_anim(angle);
if(collision(type puntero))
// Mostraremos la barra de vida
if(mouse.left && faction==faction_jug)
activ=true;
end
else
// Ocultaremos su vida
if(mouse.left && faction==faction_jug)
activ=false;
end
end
if(exists(type cuadro_sel) && faction==faction_jug)
if(collision(type cuadro_sel))
activ=true;
else
activ=false;
end
end
if(activ==true)
// Mostramos su vida
if(mouse.right)
dest_x=ppunt.x;
dest_y=ppunt.y;
met=false;
if(ppunt.obj!=-1)
estado=2;
else
estado=1;
end
end
end
switch(estado)
case 1: //Movimiento
met=meta(dest_x,dest_y,x,y);
if(met!=true)
xadvance(fget_angle(x,y,dest_x,dest_y),veloc);
end
end
end
frame;
end
end


Me da el mismo error, en el mismo sitio.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

DCelso

¿has definido unidad antes que puntero?
Si no es así hazlo, el orden es importante en Bennu.
Tienes que definir primero unidad para que cuando la uses en puntero ya sepa puntero qué variables locales y públicas contiene.
Monstruos Diabólicos

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