Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Yawin on December 03, 2010, 11:04:38 AM

Title: Cuadro de selección
Post by: Yawin on December 03, 2010, 11:04:38 AM
Mientras mi marcianitos pasa unos días de tests no puedo aguantarme estar sin codificar. Asi que he empezado un pequeño proyecto, èro me asalta una duda enorme. Este juego, tiene la enorme esperanza de acabar siendo un juego de estrategia en tiempo real. El primer problema que me ocurre, es: El cuadro de selección. La teoría es:

-Una imagen de un cuadrado, con un alpha que permita ver a través de el sin problemas.que su (x,y) esté en el punto medio entre las cohordenadas en las que se ha clicado y en las que está actualmente. Con un size proporcional a la distancia entre esos dos puntos.

Problema nº1: No se como calcular el punto medio entre las dos cohordenadas.
Problema nº2: Si intento acceder a Size.x y a Size.y, el programa entero casca (pero el compilador no me dice que no se pueda hacer.

Problema nº3: Tendría que meter las IDs de toooooooodas las cosas seleccionables. He pensado dividirlas, de momento en 4 grupos: Unidades tuyas, edificios tuyos, unidades no-tuyas y edificios no-tuyos. Ahí tengo una pequeña duda. ¿Se pueden redimensionar las arrays como en C? Es decir, recuerdo que en C podías coger una array, empezar a matarle cosas, y cuando se te acababa decirle: pos ahora, en vez de 4 slots tienes 10. Y que no se borrase todo lo anterior.

_________________________________________________________________________

Edit 1:
Me acabe de surgir otro problema. Si hago el main en un .prg y la unidad genérica en otro .prg ¿dónde tengo que declarar las globales para que los dos puedan acceder a ellas? ¿Hay que hacerlo de alguna forma especial?
Title: Re: Cuadro de selección
Post by: DjSonyk on December 03, 2010, 02:15:46 PM
Buenas ,respuestas posibles... :P

1º No entiendo muy bien a que es lo que te refieres ,con el punto medio de las coordenadas pero tenemos creo que se llama PATH_FIND que busca las mejores rutas de un destino a otro,por ejemplo Mover tu unidad a el punto que haces click.
Si te refieres el medio de las dos algo chapuzero seria comprobar las coordenadas de los 2 restarlas ,dividirlas entre 2 y sumarlas al la coordenada mas cerca del 0....
2º size.x se escribe size_x y size.y se escribe size_y ,hay que mirar en la wiki.
3º Podrias allocar memoria para hacer lo que quieres,pero creo recordad que una vez lei en otro hilo que en windows es un lio , creo que no se podia agrandar sin perder datos o algo asi,si veo el link del hilo te lo pego.
4º Los datos grobales siempre se declaran despues de PROGRAM indistintamente en el prg que los introduzcas y siempre que introduzcas el include correspondiente,ademas te aconsejo que sea el primer include .
Title: Re: Cuadro de selección
Post by: Yawin on December 03, 2010, 02:25:42 PM
Gracias por las respuestas. A ver si puedo explicar mejor la pregunta 1:

A ver, si habéis jugado a algún juego de estrategia, sabréis que si haces click izquierdo y arrastras sale un rectángulo que cuando sueltas se seleccionan todas las unidades propias que estén dentro. Bien, el tema es que donde pinchas, está el vértice superior si vas para abajo, y el vértice superior si vas para arriba. Pero siemre es un vertice.

Aquí que ocurre? que si envio las coordenadas de inicio al proceso cuadro_selección, eso se convierte en su punto medio, no en un vertice suyo, asi que necesito recolocar el proceso todo el rato, para dar el efecto que yo quiero.

Para recolocar el centro, necesito calcular la x y la y que están entre el punto inicial y el punto actual del puntero. Y no se cómo hacerlo xD

Y... ¿cómo se usa el "path_find()"? Esque he mirado en la wiki, pero no hay artículo.
Title: Re: Cuadro de selección
Post by: DjSonyk on December 03, 2010, 02:29:21 PM
Dicho link http://forum.bennugd.org/index.php?topic=988.15
Title: Re: Cuadro de selección
Post by: Yawin on December 03, 2010, 03:10:43 PM
Me lo he leido entero, pero no me he enterado de nada xD
Pero bueno, hasta que llegue a esa parte, todavía hay tiempo.

Demomento, ese asunto en particular, no tiene prisa.
Title: Re: Cuadro de selección
Post by: DjSonyk on December 03, 2010, 03:18:49 PM
Aqui tienes un ejemplo de path_find del "maestro" de prg xP ,http://forum.bennugd.org/index.php?topic=392.0 ,aun asi en bennupack hay otro ejemplo muy chulo ,donde haces click y el proceso busca el camino desde donde esta el hacia el click por un laberinto no recuerdo el nombre el programa pero si que esta en el directorio de los ejemplos.
Title: Re: Cuadro de selección
Post by: DjSonyk on December 03, 2010, 03:42:39 PM
Quote from: yawin on December 03, 2010, 02:25:42 PM

Aquí que ocurre? que si envio las coordenadas de inicio al proceso cuadro_selección, eso se convierte en su punto medio, no en un vertice suyo, asi que necesito recolocar el proceso todo el rato, para dar el efecto que yo quiero.

Para recolocar el centro, necesito calcular la x y la y que están entre el punto inicial y el punto actual del puntero. Y no se cómo hacerlo xD

:o ¿Mande? ,o sigo sin entenderlo o chico no se que pretendes hacer...
Lo de hacer un cuadro de selección lo entiendo bastante bien,es mas me estoy currando yo uno para mi editor,pero lo que quieres hacer no te entiendo.
Yo voy hacer algo asi, boton izquierdo pulsado guarda x,y cuando sueltes boton izquierdo recoge las coordenadas y luego aplico las mates y ya esta.
Title: Re: Cuadro de selección
Post by: Yawin on December 03, 2010, 04:00:26 PM
A ver si esto lo explica mejor:
http://pensarescompartir.com/explicacion.png
Title: Re: Cuadro de selección
Post by: DjSonyk on December 03, 2010, 05:10:13 PM
Quote from: yawin on December 03, 2010, 04:00:26 PM
A ver si esto lo explica mejor:
http://pensarescompartir.com/explicacion.png
^^ ....
La verdad no entiendo lo que quieres conseguir con eso,pero bueno una solución ya te conte como.

Suponiendo que el recuadro lo haces como en el ejemplo . Cuadro de izquierda a derecha y de arriba a abajo.
Entre dos porque queremos la mitad/centro entre las dos distancias.
X final - X inicial / 2 + X inicial =  100 ( x final ) - 10 (x inicial ) = 90/2 =45 + 10 (x inicial )=55 centro de las dos X
Y final - Y inicial / 2 - Y inicial =   350 ( y final ) - 150 (y inicial ) = 200/2 =100 + 150 (x inicial )=250 centro de las dos Y

luego el centro del cuadro_selección estaria en 55,250.Sino me equivoco....
Title: Re: Cuadro de selección
Post by: Yawin on December 03, 2010, 05:19:27 PM
Vale, lo he hecho asi, y la verdad es que me funciona bien.
process cuadro_sel(int x_in, int y_in)
begin
file=fpgs[0];
z=-1;
graph=2;
repeat
x=puntomedio(x_in,ppunt.x)-6;
y=puntomedio(y_in,ppunt.y)-6;
size_x=ppunt.x-x_in;
size_y=ppunt.y-y_in;
frame;
until(!mouse.left);
end
function puntomedio(int a, int b)
private
int resul;
end
begin
resul=(a+b)/2;
return resul;
end

Excepto por un detalle. Sólo veo el rectángulo si las 2 sizes son positivas. ¿Hay alguna función para pasar un número a su absoluto?
Title: Re: Cuadro de selección
Post by: DjSonyk on December 03, 2010, 05:31:48 PM
Si , ABS().
Title: Re: Cuadro de selección
Post by: Yawin on December 03, 2010, 05:32:59 PM
Gracias
Title: Re: Cuadro de selección
Post by: DjSonyk on December 03, 2010, 05:35:11 PM
Quote from: yawin on December 03, 2010, 05:32:59 PM
Gracias
De gracias nada,son al menos 1 karma.... xD
Title: Re: Cuadro de selección
Post by: Drumpi on December 03, 2010, 05:56:18 PM
El tema de los arrays te lo respondo yo:

Los arrays son de un tamaño definido, no se puede cambiar.
Pero en cambio puedes usar punteros como si fueran arrays, y para ello ya lo expliqué en este hilo:
http://forum.bennugd.org/index.php?topic=988.0

Y en cuanto a lo de tener varios ficheros con código, puedes poner las globales donde quieras, pero siempre después del program. Usar "import" para indicarle al programa que debe leer de otro fichero es como hacer literalmente un "copia y pega" del contenido en ese punto exacto del programa, por lo que podemos tener un fichero aparte para la declaración de las GLOBALS, para diversas funciones auxiliares, o incluso para un trozo de código que se repite en varios puntos y no queremos volver a escribirlo (sí, no hace falta que esté en una función aparte, ni en un proceso ni nada, sólo el código).
Mi recomendación: crea dos ficheros por cada código que vayas a separar, en uno (yo le pongo la extensión .h) la declaración de las variables globales, locales o de los propios procesos que se vayan a usar en el otro (que suelo poner la extensión .inc) que sólo contiene las diversas funciones. De esta manera, en el prg principal, primero "incluyes" todos los .h y después los .inc, te evitará más de un problema con el orden de declaración, porque los "includes" sí necesitan que las variables/funciones/procesos que se usen en ellos estén escritos ANTES de usarlos.
Title: Re: Cuadro de selección
Post by: Futu-block on December 03, 2010, 07:37:14 PM
lo que quieres es una rectangulo como se hace con el paint ¿no?
Title: Re: Cuadro de selección
Post by: Yawin on December 03, 2010, 08:00:06 PM
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
Title: Re: Cuadro de selección
Post by: Yawin on December 03, 2010, 11:20:00 PM
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").
Title: Re: Cuadro de selección
Post by: Drumpi on December 04, 2010, 12:31:17 AM
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).
Title: Re: Cuadro de selección
Post by: DjSonyk on December 04, 2010, 01:59:59 AM
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 ....
Title: Re: Cuadro de selección
Post by: Yawin on December 04, 2010, 10:10:54 AM
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.
Title: Re: Cuadro de selección
Post by: DCelso on December 04, 2010, 01:58:06 PM
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;
Title: Re: Cuadro de selección
Post by: Yawin on December 04, 2010, 02:48:15 PM
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.
Title: Re: Cuadro de selección
Post by: DjSonyk on December 04, 2010, 03:20:27 PM
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.
Title: Re: Cuadro de selección
Post by: Yawin on December 04, 2010, 04:06:33 PM
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?
Title: Re: Cuadro de selección
Post by: DjSonyk on December 04, 2010, 04:43:31 PM
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......
Title: Re: Cuadro de selección
Post by: DCelso on December 04, 2010, 06:10:49 PM
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
Title: Re: Cuadro de selección
Post by: 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;
Title: Re: Cuadro de selección
Post by: DCelso on December 05, 2010, 05:15:27 AM
po si. ;D
Title: Re: Cuadro de selección
Post by: Yawin on December 05, 2010, 09:26:50 AM
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.
Title: Re: Cuadro de selección
Post by: DCelso on December 05, 2010, 02:31:57 PM
¿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.
Title: Re: Cuadro de selección
Post by: Yawin on December 05, 2010, 02:55:57 PM
En ese caso, tengo un problema. Porque la unidad accede a ppunt.x y ppunt.y muchas veces. Y puntero accede a obj.faction muchas veces. Asiq ue siempre me va a saltar error, porque siempre va a haber una antes que la otra.
Title: Re: Cuadro de selección
Post by: DCelso on December 05, 2010, 03:07:04 PM
umn, deberías cambiar entonces la lógica de uno de ellos para que no pase, no es lógico, pero tiene solución,
tienes que usar declare, hablé de ello en otro post, a ver si te lo encuentro.
Title: Re: Cuadro de selección
Post by: DCelso on December 05, 2010, 03:10:43 PM
http://forum.bennugd.org/index.php?topic=1810.0http://forum.bennugd.org/index.php?topic=1810.0
Title: Re: Cuadro de selección
Post by: Yawin on December 05, 2010, 10:25:43 PM
Y si hago una fución para sacar la facción, que la llame desde el puntero, que lo incluyo antes que la unidad, pero incluyendo la función más tarde??

Es decir, el orden de include es:
puntero.prg
unidades.prg
funciones.prg

Y la faction la saco desde la función, pero llamandola desde el puntero.

¿Funcionaría? (esque ahora no puedo probarlo xD)
Title: Re: Cuadro de selección
Post by: DCelso on December 05, 2010, 11:22:43 PM
ni idea, habría que verlo.
Pero deja todo como lo tienes ahora y prueba a poner esto antes del proceso puntero

declare process unidad(int grafin, int veloc, int aux, int aux2, int aux3, int fact)
end
Title: Re: Cuadro de selección
Post by: Yawin on December 08, 2010, 07:54:59 PM
Nada, sigue sin ir. He puesto el declare de arriba y no va. He hecho una función aparte y no va. Os agradecería mil y una veces que le echaseis un vistazo a los códigos y me dijeseis qué tengo que hacer y por qué, porque por más que miro, no entiendo qué falla.

http://pensarescompartir.com/lahsoft/lahsoftcorp/?direc=fenix/&id=AOY.rar
Title: Re: Cuadro de selección
Post by: DCelso on December 09, 2010, 03:24:57 PM
a ver,
Title: Re: Cuadro de selección
Post by: DCelso on December 09, 2010, 04:58:06 PM
pues problema gordo, usas un nombre de variable reservado, es decir, no puedes usar "id" como nombre de variable ya que es una variable existente en todos los procesos que devuelve el id del proceso, así que tenías problemas de ámbito en.

function sacarfaction(guerrero id)

begin

return id.faction;
[b]aqui estabas intentando acceder al id del proceso que llamó a esta funcion (que si no recuerdo mal es puntero, así que aquí id vale el valor del identificador del proceso puntero) en vez de a tu variable de entrada que llamaste id[/b]
end

Para Splinter: no se por qué esto no da fallo, osea el sistema no te debería de dejar poner este nombre de variable de entrada ya que no hay forma de usarla, o bien debería de ocultar a la variable real id en este ámbito y usar el parámetro de entrada.

prueba con esto y verás que compila

function sacarfaction(guerrero id1)

begin

return id1.faction;

end

Title: Re: Cuadro de selección
Post by: Yawin on December 09, 2010, 05:42:26 PM
vale, por fin, ya no me da errores de compilación.
A ver si consigo acabar eso.

edit:
Ahora, lo que ocurre, es que el guerrero tiene este código:
Estoy comprobando que, efectivamente, el obj del puntero!=-1. Pero aun asi, la nave no se pone en estado=2.

Tambien he comprobado que "guerrero" ve bien el valor.


Vale, nada. Soy tonto del culo xD Me lo estaba cojiendo bien.
p.d.: Siento estar tan plasta ^__^
Title: Re: Cuadro de selección
Post by: Yawin on December 09, 2010, 10:56:08 PM
Bueno, yo sigo aquí, con mis problemas.

Esta vez, estoy haciendo una especie de bd de edificios. La idea es crear una array global de una estructura determinada. Esta:
struct edif[2]
string nombre;
int vida;
int graf;
int tipo;
int producs[2];
int tmppr;
int limitp;
end


Bien, el edificio es este (con su menú desplegable):
process edificio(int prodn,x,y,int fact)
public
int faction;
int menu,i;
bool mein=false;
bool activ=false;
end
private
cola colprod;

int limcol;
int tmprod;

end
begin
faction=fact;
limcol=edif[prodn].limitp;
tmprod=edif[prodn].tmppr;
file=fpgs[faction];
graph=edif[prodn].graf;
size=50;
ctype=C_SCROLL;
if(faction==faction_jug)
colprod=cola(limcol);
end

loop
if(collision(type puntero))
if(mouse.right && faction==faction_jug && activ!=false)
while(mouse.right)
frame;
end
menu=mdepl(prodn);
mein=true;
end
if(mouse.left && faction==faction_jug)
activ=true;
end
else
if(mouse.left && faction==faction_jug)
activ=false;
mein=false;
end
end

if(activ==true && auxiliared.tipo!=0)
for(i=0;i<limcol;i++)
if(colprod.producto[i].oc!=true)
colprod.producto[i].tipo=auxiliared.tipo;
colprod.producto[i].prod=auxiliared.prod;
colprod.producto[i].xp=x+20;
colprod.producto[i].yp=y;
colprod.producto[i].tmpP=tmprod;
colprod.producto[i].oc=true;
break;
end
end
auxiliared.tipo=0;
auxiliared.prod=0;
end
frame;
end
end


function mdepl(int ed)
private
int i,prods[10],tipo;
string cosas[10];
end
begin
x=ppunt.x;
y=ppunt.y;

tipo=edif[ed].tipo;
for(i=0;i<10;i++)
if(edif[ed].producs[i]!=-1)
cosas[i]=guer[edif[ed].producs[i]].nombre;
prods[i]=edif[ed].producs[i];
else
cosas[i]=-1;
end
end

for(i=0;i<10;i++)
if(cosas[i]!=-1)
casilla(x,y,cosas[i],prods[i],int tipo);
y+=25;
end
end
end

process casilla(x,y,string escribir,int prod,int tipo)
begin
file=fpgs[0];
graph=5;
size_x=50;
size_y=95;

write_var(0,x,y,1,escribir);
loop
if(collision(type puntero))
graph=6;
else
graph=5;
end
if(mouse.left)
if(graph==6)
auxiliared.prod=prod;
auxiliared.tipo=tipo;
end
break;
end
if(mouse.right)
break;
end
frame;
end
delete_text(0);
end


Al compilar, me sale esto:
QuoteBGDC 1.0.0 (Nov 21 2010 18:03:52)
Copyright � 2006-2010 SplinterGU (Fenix/BennuGD)
Copyright � 2002-2006 Fenix Team (Fenix)
Copyright � 1999-2002 Jos� Luis Cebri�n Pag�e (Fenix)
Bennu Game Development comes with ABSOLUTELY NO WARRANTY;
see COPYING for details

/home/yawin/Escritorio/Age of Yawin/librender:0: warning: Variable redeclared ("ALPHA_STEPS")
/home/yawin/Escritorio/Age of Yawin/libscroll:0: warning: Variable redeclared ("CTYPE")
/home/yawin/Escritorio/Age of Yawin/libscroll:0: warning: Variable redeclared ("CNUMBER")
/home/yawin/Escritorio/Age of Yawin/dll/edificios.prg:1: error: Data types not compatible with operation (1)

¿Qué hago mal?
Title: Re: Cuadro de selección
Post by: DCelso on December 10, 2010, 12:22:36 AM
umn, nose,prueba con esto

process edificio(x,y,int prodn,int fact)
Title: Re: Cuadro de selección
Post by: Yawin on December 10, 2010, 08:21:35 AM
No va. Me estoy empezando a desesperar con estos errores que me salen.
Title: Re: Cuadro de selección
Post by: Drumpi on December 11, 2010, 02:25:57 AM
No recordaba que existiesen datos de tipo bool. Prueba a ponerlos de tipo int o byte, si así deja de fallar es posible que el prblema sea con "activ!=false" (que se podría haber puesto directamente "activ" y listo).
Title: Re: Cuadro de selección
Post by: SplinterGU on December 11, 2010, 03:52:49 AM
no lo recordabas porque no existen... si pones bool, el compilador piensa que va a exitir un tipo de proceso bool, por consiguiente lo define como tal.
Title: Re: Cuadro de selección
Post by: Noivern on December 11, 2010, 04:14:12 AM
byte es el tipo más pequeño en bennu right?
Title: Re: Cuadro de selección
Post by: SplinterGU on December 11, 2010, 04:57:31 AM
Quote from: Noivern on December 11, 2010, 04:14:12 AM
byte es el tipo más pequeño en bennu right?

si, pero los datos mas pequeños no son los mas rapidos... es mas rapido usar int...
Title: Re: Cuadro de selección
Post by: Noivern on December 11, 2010, 05:03:21 AM
eso no lo sabía :o
gracias por la aclaración
Title: Re: Cuadro de selección
Post by: Yawin on December 11, 2010, 10:15:36 AM
Quote from: Drumpi on December 11, 2010, 02:25:57 AM
No recordaba que existiesen datos de tipo bool. Prueba a ponerlos de tipo int o byte, si así deja de fallar es posible que el prblema sea con "activ!=false" (que se podría haber puesto directamente "activ" y listo).
No es el bool activ. El proceso guerrero también gasta de eso, y me compila bien si no incluyo el proceso edificio en la compilación.
Title: Re: Cuadro de selección
Post by: DCelso on December 11, 2010, 10:36:29 AM
¿Qué es esto?

if(activ==true && auxiliared.tipo!=0)
<b>for(i=0;i</b>
if(colprod.producto[i].oc!=true)
colprod.producto[i].tipo=auxiliared.tipo;
colprod.producto[i].prod=auxiliared.prod;
colprod.producto[i].xp=x+20;
colprod.producto[i].yp=y;
colprod.producto[i].tmpP=tmprod;
colprod.producto[i].oc=true;
break;
end
end
auxiliared.tipo=0;
auxiliared.prod=0;
end
Title: Re: Cuadro de selección
Post by: Yawin on December 11, 2010, 10:41:58 AM
Es raro, igual me comi algo, aqui lo tengo bien escrito:
for(i=0;i<limcol;i++)
if(colprod.producto[i].oc!=true)
colprod.producto[i].tipo=auxiliared.tipo;
colprod.producto[i].prod=auxiliared.prod;
colprod.producto[i].xp=x+20;
colprod.producto[i].yp=y;
colprod.producto[i].tmpP=tmprod;
colprod.producto[i].oc=true;
break;
end
end


Creo que me lo comi aqui al quitarle tabulaciones.

Sirve para comprobar si la cola de producción está llena, y si no lo está, meterlo en la primera casilla libre.
Title: Re: Cuadro de selección
Post by: DCelso on December 11, 2010, 10:48:48 AM
Gracias por ponerlo exactamente igual, ;D. sigo sin saber como continúa el for for(i=0;i

Otro fallo:


for(i=0;i<10;i++)
if(cosas[i]!=-1)
casilla(x,y,cosas[i],prods[i],<b>int </b>tipo);
y+=25;
end


el int  que está en negrita sobra.
Independientemente de esos fallillos, creo que he encontrado tu problema

string cosas[10];

Estás creando un array de 10 strings y luego haces comparaciones con un entero del tipo cosas!=-1 y ese es el error que te suelta el compilador. Si quieres ver si no está vacía una cadena tendrías que hacer cosas !=""

Mira tu código megaparcheado para que compile es el siguiente:

import "mod_grproc"
import "mod_scroll"
import "mod_key"
import "mod_text"
Global
struct edif[2]
string nombre;
int vida;
int graf;
int tipo;
int producs[2];
int tmppr;
int limitp;
end
fpgs[3];
faction_jug;
struct auxiliared
tipo;
prod;
xp;
yp;
tmpP;
oc;
end
struct ppunt
x;
y;
end
struct guer[2]
nombre;
end

end
process puntero()
begin
end

process cola(int val)
public

struct producto[4]
tipo;
prod;
xp;
yp;
tmpP;
oc;
end

begin
end
process edificio(int prodn,x,y,int fact)
public
int faction;
int menu,i;
bool mein=false;
bool activ=false;
end
private
cola colprod;

int limcol;
int tmprod;

end
begin
faction=fact;
limcol=edif[prodn].limitp;
tmprod=edif[prodn].tmppr;
file=fpgs[faction];
graph=edif[prodn].graf;
size=50;
ctype=C_SCROLL;
if(faction==faction_jug)
colprod=cola(limcol);
end

loop
if(collision(type puntero))
if(mouse.right && faction==faction_jug && activ!=false)
while(mouse.right)
frame;
end
menu=mdepl(prodn);
mein=true;
end
if(mouse.left && faction==faction_jug)
activ=true;
end
else
if(mouse.left && faction==faction_jug)
activ=false;
mein=false;
end
end

if(activ==true && auxiliared.tipo!=0)
for(i=0;i<10;i++)
if(colprod.producto[i].oc!=true)
colprod.producto[i].tipo=auxiliared.tipo;
colprod.producto[i].prod=auxiliared.prod;
colprod.producto[i].xp=x+20;
colprod.producto[i].yp=y;
colprod.producto[i].tmpP=tmprod;
colprod.producto[i].oc=true;
break;
end
end
auxiliared.tipo=0;
auxiliared.prod=0;
end
frame;
end
end


function mdepl(int ed)
private
int i,prods[10],tipo;
string cosas[10];
end
begin
x=ppunt.x;
y=ppunt.y;

tipo=edif[ed].tipo;
for(i=0;i<10;i++)
if(edif[ed].producs[i]!=-1)
cosas[i]=guer[edif[ed].producs[i]].nombre;
prods[i]=edif[ed].producs[i];
else
cosas[i]="";
end
end

for(i=0;i<10;i++)
if(cosas[i]!="")
casilla(x,y,cosas[i],prods[i],tipo);
y+=25;
end
end
end

process casilla(x,y,string escribir,int prod,int tipo)
begin
file=fpgs[0];
graph=5;
size_x=50;
size_y=95;

write_var(0,x,y,1,escribir);
loop
if(collision(type puntero))
graph=6;
else
graph=5;
end
if(mouse.left)
if(graph==6)
auxiliared.prod=prod;
auxiliared.tipo=tipo;
end
break;
end
if(mouse.right)
break;
end
frame;
end
delete_text(0);
end
begin
while(!key(_esc))
frame;
end
end


Por cierto, si algo no te compila no tienes por qué desesperar, tienes que relajarte y leer más detenidamente tu código e intentar aislar, porque muchas veces será por error de sintasis y releyendo el ćodigo te puedes dar rápidamente cuenta de algo que estás haciendo mal.
Title: Re: Cuadro de selección
Post by: Yawin on December 11, 2010, 10:53:13 AM
for(i=0;i < limcol ; i + + )
a ver si ahora se muestra bien cawen zotz... (está con separaciones, porque si no el foro lo muestra mal)

Lo otro, ahora lo miro. Y si la cosa es que me he releido mi código millares de veces, pero... no se, me paso por alto esas cosas xD

edit: O.O

(http://i216.photobucket.com/albums/cc100/mcristian/reverencia.gif)
Te daría todos mis karmas si pudiese. Yo ya estaba pensando que nunca encontraría el error.

(me anoto que me tengo que fijar siempre en las llamadas y que no compare nunca un string con un int.
Title: Re: Cuadro de selección
Post by: DCelso on December 11, 2010, 11:12:28 AM
:D, darme tus karmas no puedes, pero poder darme uno todos los dias durante diez dias sí que podrías y serian justo los 10 que tienes :D.
Title: Re: Cuadro de selección
Post by: DCelso on December 11, 2010, 11:16:55 AM
Por cierto, ahora que estás empezando y viendo errores típicos con sus soluciones, estaría bien que hicieras una recopilación de éstos y nos los fueras poniendo en un post (por ejemplo en documentación) llamado FAQ o así :D
Title: Re: Cuadro de selección
Post by: Yawin on December 11, 2010, 12:18:21 PM
Cómo?? Ir poniendo los errores que me salen y con qué códigos??
Title: Re: Cuadro de selección
Post by: DCelso on December 11, 2010, 03:02:32 PM
pues no, sino algo como Si te da este error al compilar puede que sea por esto, si te da este problema al ejecutar puede que sea por esto otro, vamos un FAQ (http://es.wikipedia.org/wiki/Preguntas_frecuentes) de desarrollo para programadores, tipo los que hay en la red de otros programas.

Title: Re: Cuadro de selección
Post by: Yawin on December 11, 2010, 10:32:00 PM
Puff, no me veo muy capaz, porque entre que este lenguaje apenas lo domino, y que generalmente cuando me salta un error no me paro a pensar por qué es, lo resuelvo y punto, pues como que.... prefiero seguir aprendiendo y cuando sepa suficiente, hacer algo de eso.