Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Futu-block on July 29, 2011, 09:36:07 PM

Title: pasemos a las funciones...
Post by: Futu-block on July 29, 2011, 09:36:07 PM
En mis ultimos juegos he usado varios procesos que no tenian graficos y principalmente lo que hacian era una operacion matematica...

Para comprender mejor lo que es una función vamos a desglosarla (crap, esto esta sonando a tuto en vez de consulta)

1· En vez de proceso le llamariamo funtion ejemplo(), (creo) pero ¿se guardaria como .prg??

2· A la hora de importarlo en el main, ¿seria include "ejemplo.prg"??

3· Para llamar a la funcion, ¿como es la sintaxis exacta??
para un ejemplo pongo que dividimos la pantalla en dos partes y al hacer click con el raton nos indique el mouse.x si está en la mitad de la derecha o de la izquierda...


[code language="bennu"]
funtion ejemplo()
    if (mouse.x > 160)
        return true;
    else
        return false;
   end
[/code]

no se, aqui hay mucho espacio en blanco; a lo que me lleva a la cuarta

4· El return que te devuelve donde vá?? y si tiene que ser[code language="bennu" options="singleline"] return = false;[/code]

yo que se, ni idea ninguna, y del manual no creais que me entero de mucho, yo soy mas de comprender, no de copiar :D
Title: Re: pasemos a las funciones...
Post by: Rein (K´)ah Al-Ghul on July 29, 2011, 10:28:45 PM
1. en un PRG (el archivo de texto). puedes tener varias funciones y/o procesos...
2. al incluirlo en el PRG principal, lo haces con include <ruta del archivo prg>

3.

a grandes rasgos es:
FUNCTION name( <parametros>)
BEGIN
    <sentencias>
END

en caso de retornar un valor se usa la sentencia return(<valor de retorno>), con lo cual se sale de la funcion...

para la sintaxis completa esta en la wiki:
http://wiki.bennugd.org/index.php?title=Function (http://wiki.bennugd.org/index.php?title=Function)

un ejemplo rapido
FUNCTION sumarDosNumeros( int operando1, int operando2)
PRIVATE
int resultado = 0;
END

BEGIN
resultado = operando1 + operando2;
return( resultado )
END


ahora al usarla

Quote
BEGIN
//...
variableAleatorio = sumarDosNumeros(2,4);
variableAleatorio = sumarDosNumeros(cualquierVariableEntera, OtraVariableEntera);
//...
END
Title: Re: pasemos a las funciones...
Post by: KeoH on July 30, 2011, 02:30:58 AM
hazle caso a Rein (K´)ah Al-Ghul q lo ha dicho perfectamente xD   el funcionamiento es igual a un proceso salvo en q no tiene grafico y q no tienes q pasarle en ningun momento por un Frame;.

Title: Re: pasemos a las funciones...
Post by: Futu-block on July 30, 2011, 07:34:53 AM
vamos a ver si lo hago bien


FUNCTION la_x_del_raton()
PRIVATE
int cuarta_parte;
END

BEGIN
    switch (mouse.x)
        case 1..80: cuarta_parte = 1;
        case 81..160: cuarta_parte = 2;
        case 161..240: cuarta_parte = 3;
        case 241..320: cuarta_parte = 4;
    end
    return (cuarta_parte)   // aqui no termina con el punto y coma por lo que veo, ¿no?
END


y ahora cada vez que dé al click del raton, que es para lo que lo quiero usar...


BEGIN
//...
mouse.left = la_x_del_raton();
//...
END


creo que estoy en lo cierto ¿no?
Title: Re: pasemos a las funciones...
Post by: Mr Matsusaka on July 30, 2011, 08:44:58 AM
Solo le veo un problema.
mouse.left es una variable reservada del programa utilizada para indicar si se ha clickeado el raton o no.
No te conviene sobreescribirlo, deberias crear una variable distinta que coja el valor del return.

Ademas, por si acaso yo pondria algo asi

[code language="bennu"]FUNCTION la_x_del_raton()
PRIVATE
int cuarta_parte;
END

BEGIN
   if (mouse.left == false)
      return (0);
   else
      switch (mouse.x)
          case 1..80: cuarta_parte = 1;
          case 81..160: cuarta_parte = 2;
          case 161..240: cuarta_parte = 3;
          case 241..320: cuarta_parte = 4;
      end
      return (cuarta_parte);
  end
END[/code]
Title: Re: pasemos a las funciones...
Post by: laghengar on July 30, 2011, 10:27:27 AM
Amigo futublog, te recomiendo que nos comentes que quieres llegar a hacer, te diremos como hacerlo y porqué ha de hacerse así.

Sencillamente es que:

BEGIN
//...
mouse.left = la_x_del_raton();
//...
END

no tiene ningún sentido, con todos los respetos XD.

la_x_del_raton(); te va a dar un valor al igual que te lo da un proceso como en id=proceso; y ese valor va determinado por el return que hay dentro de la función. Por lo que le estás diciendo que mouse.left tome como valor lo que le asigne return de la función la_x_del_raton().

Un saludo XD.
Title: Re: pasemos a las funciones...
Post by: Futu-block on July 30, 2011, 10:49:51 AM
por lo pront lo que quiero es hacer bien el uso de las funciones
Title: Re: pasemos a las funciones...
Post by: Rein (K´)ah Al-Ghul on July 30, 2011, 05:10:57 PM
return si va con ; descuido mio :P
Title: Re: pasemos a las funciones...
Post by: SplinterGU on July 30, 2011, 07:48:39 PM
Quote from: KeoH on July 30, 2011, 02:30:58 AM
hazle caso a Rein (K´)ah Al-Ghul q lo ha dicho perfectamente xD   el funcionamiento es igual a un proceso salvo en q no tiene grafico y q no tienes q pasarle en ningun momento por un Frame;.



no, no... creo que hay una terrible confusion...

el uso de FRAME y graph, no dependen de si se lo usa en un PROCESS o en una FUNCTION... ambos pueden usar FRAME y graph... y es totalmente permitido.

la diferencia entre un PROCESS y una FUNCTION esta en que:
- un PROCESS retorna (a quien llamo) mediante la instruccion FRAME (con lo que devuelve el ID de proceso que es) o mediante un RETURN (con lo que devuelve el valor de retorno y finaliza su ejecucion).
- una FUNCTION solo retorna (a quien llamo) con la instruccion RETURN, si se ejecuta un FRAME, no retorna a quien llamo, pero si da paso a que otro proceso se ejecute, el padre (quien llamo) se queda congelado hasta que la funcion muera o haga un RETURN. Por consiguiente, se puede hacer una funcion que tenga un grafico y este se este moviendo y ejecutando FRAMEs como cualquier PROCESO, salvo que el padre no podra seguir su ejecucion hasta que la funcion retorne con un RETURN.
Title: Re: pasemos a las funciones...
Post by: Futu-block on August 07, 2011, 05:06:11 PM
es como lo de los numeros al azar que propuse, como en la siguiente casilla el numero al azar no salia por el random se llevaba asi ifinito de tiempo ¿no?

<->


bien, por fin de tanta prueba he sacado algo razonable ¿quien quiere karma??
Title: Re: pasemos a las funciones...
Post by: Futu-block on October 10, 2011, 02:36:08 PM
¿puede una funcion retornar dos valores??

return(tal, cual);
Title: Re: pasemos a las funciones...
Post by: SplinterGU on October 10, 2011, 03:47:26 PM
no, no puede
Title: Re: pasemos a las funciones...
Post by: Yawin on October 10, 2011, 05:11:57 PM
Futublock, yo cree que para eso se inventaron los punteros xDD Si quieres retornar dos valores, uno de ellos (al menos) cambialo con un puntero.
Title: Re: pasemos a las funciones...
Post by: Drumpi on October 10, 2011, 06:55:34 PM
O si no, usa un tipo personalizado con los datos que necesites devolver, pero por lo general, el uso de punteros es lo suyo.
Title: Re: pasemos a las funciones...
Post by: Futu-block on October 10, 2011, 07:48:00 PM
Pasemos a los punteros pues...
¿que es un puntero???

jijiji
Title: Re: pasemos a las funciones...
Post by: KeoH on October 10, 2011, 08:08:19 PM
buena pregunta .... algo parecido a vectores no? XDD ni idea
Title: Re: pasemos a las funciones...
Post by: Rein (K´)ah Al-Ghul on October 10, 2011, 08:32:00 PM
Haganle caso a drumpi, lo mas facil es armar un tipo de dato...
Crear el dato (typedef)
Declarar el nuevo tipo de dato
en la funcion retornas el nuevo tipo de dato


sobre los punteros:

http://es.wikipedia.org/wiki/Puntero_(informática) (http://es.wikipedia.org/wiki/Puntero_(inform%C3%A1tica))

en resumen es una variable que contiene una direccion de memoria...
osea es algo que apunta a, por ejemplo otra variable...
Title: Re: pasemos a las funciones...
Post by: Yawin on October 13, 2011, 08:05:00 AM
Personalmente, discrepo. El uso de los punteros, al principio parece lioso. Pero es más fácil que comerse una piruleta.
Title: Re: pasemos a las funciones...
Post by: Drumpi on October 19, 2011, 10:34:31 PM
Rein lo ha dicho perfecto: son variables que señalan a otras variables o a zonas de memoria de tamaño variable.
Su uso principal es el de, por ejemplo, pasarle a una función el sitio donde debe leer/guardar valores, por ejemplo, una variable. Si hacemos:


  int mi_variable = 5;
  mi_función(mi_variable);
  (...)

function mi_función (int valor)
begin
  valor++;
  say(valor);
end


Valor valdrá uno más de lo que valía cuando se llamó a la función, seis (y se verá en el say), sin embargo, mi_variable sigue valiendo 5. Es lo que se llama "paso por valor", la función usa una copia para trabajar.
Sin embargo:


  int mi_variable = 5;
  mi_función(offset mi_variable);
  (...)

function mi_función (int pointer valor)
begin
  *valor++;
  say(*valor);
end


Valor valdrá uno más de lo que valía cuando se llamó a la función, seis (y se verá en el say), sin embargo, mi_variable ahora también valdrá 6 ¿Por qué? porque ya no trabajamos con una copia, se está usando la posición de memoria donde se guarda el valor de mi_variable (de ahí que se le pase a la función el OFFSET de la variable, no su contenido. La función recibe un puntero a un entero a la que llamamos valor. Ahora valor no contiene 5, sino una dirección de memoria, por lo que no podemos hacerle valor++, porque entonces estamos diciendo que apunte a la siguiente posición de memoria, por eso se pone un asterisco antes, para decirle "modifica el valor al que puntas".
Es lo que se llama "paso por referencia", porque se le indica una referencia a dónde debe mirar para obtener el valor.

El otro uso es el de almacenar datos en memoria, con una cantidad modificable, de manera que siempre usemos la menos posible. Eso ya lo expliqué hace tiempo en el hilo de arrays con memoria dinámica para novatos, como un ejemplo. Luego ya están las listas enlazadas, los árboles, las estructuras complejas y demás, pero eso mejor dejarlo para los libros de C.
Title: Re: pasemos a las funciones...
Post by: KeoH on October 20, 2011, 12:18:35 AM
Pues este post ayuda tela xD porq hacia tiempo q queria saber a manejar punteros xD pero no tenia idea xD esto ayuda xD. Se puede hacer q el puntero sea una tabla? algo asi como esto:


int mi_tabla[2];
asigna_valores(offset mi_tabla);
.
.
.
function asigna_valores(int pointer tabla)

begin
    *tabla[0]=1;
    *tabla[1]=2;
    *tabla[2]=3;
end



Este codigo seria válido? o es una parida? xDDD
Title: Re: pasemos a las funciones...
Post by: HaCkZJuaNN on October 20, 2011, 06:31:00 PM
Que yo sepa, los arrays son punteros de por sí (al menos creo recordar que en Bennu funcionaban igual que lo hacen en C, aún estoy en proceso de reconciliación) . Cuando defines una tabla como

int mi_tabla[2];

mi_tabla es un puntero constante que señala al inicio de la tabla. Cuando haces mi_tabla[0] estás diciendo que acceda a la primera posición, y mi_tabla[1] a la segunda.

Por tanto, tu código está casi bien, pero te sobran los asteriscos(dereferencias) y el offset. Sería:

(No sé cómo insertar un bloque de código)

int mi_tabla[2];
asigna_valores(mi_tabla);
...
function asigna_valores(int pointer tabla)

begin

tabla[0] = 1;
tabla[1] = 2;
tabla[2] = 3;

end

Por si quieres ir un poco más allá, y siempre y cuando no me equivoque y los punteros se manejan igual que en C; la expresión mi_tabla[j] es absolutamente equivalente a escribir *(mi_tabla+j); donde la suma significa "coger la posición de memoria a que apunta mi_tabla y desplazarme i lugares de tamaño el tipo de mi_tabla hacia delante". Esto en Bennu es poco útil saberlo y utilizarlo, de todas formas; al menos que yo sepa.

Ruego si me equivoco y algo de lo que he dicho es mentira me lo indiquéis para que pueda borrarlo y evitar confusiones.[/i]
Title: Re: pasemos a las funciones...
Post by: SplinterGU on October 20, 2011, 06:42:56 PM
es correcto juan como has dicho...
Title: Re: pasemos a las funciones...
Post by: HaCkZJuaNN on October 20, 2011, 06:52:27 PM
Quote from: SplinterGU on October 20, 2011, 06:42:56 PM
es correcto juan como has dicho... por lo menos la primera parte... lo de mi_tabla[ i][j] que es equivalente a *(mi_tabla+j) no es correcto...

mi_tabla[ i][j] es equivalente a mi_tabla[i*cantidad de columnas+j]...

pero entiendo que has querido explicar que *var[] es un array de punteros, lo cual es correcto.

Nono, lo que pasa es que la [ i ] me lo ha sustituido por uan cursiva, que no he sabido quitar, y luego le he añadido la j.

Lo que quería decir es que mi_tabla[ j ] = *(mi_tabla+j)
Title: Re: pasemos a las funciones...
Post by: SplinterGU on October 20, 2011, 07:35:50 PM
ah, eso es correcto.

edita el mensaje, quita la italica... y yo tacho mi mensaje...
Title: Re: pasemos a las funciones...
Post by: Drumpi on October 20, 2011, 07:46:57 PM
El día en que se sepan manejar los punteros, las llamadas a funciones con punteros a punteros, y todo tipo de listas y árboles enlazados con punteros, es cuando sabrás que sabes programar.



...Al menos, lo más básico para cualquier lenguaje ;D
Title: Re: pasemos a las funciones...
Post by: KeoH on October 20, 2011, 08:06:52 PM
pues esto es muy util, por ejemplo cuando tienes una funcion q calcula varias cosas y para tener organizados los datos usas la tabla xD gracias! xD
Title: Re: pasemos a las funciones...
Post by: HaCkZJuaNN on October 22, 2011, 01:43:19 PM
Quote from: SplinterGU on October 20, 2011, 07:35:50 PM
ah, eso es correcto.

edita el mensaje, quita la italica... y yo tacho mi mensaje...

Done.