PDA

Ver la versión completa : [Fenix] Variable angle y sprites con graficos para cada angulo



Aiken
18/08/2009, 19:41
hola chicos.

Tengo unos sprites que tienen un fotograma diferente para cada angulo.
esta muy bien y comodo usar la variable angle y que el propio fenix te lo rote y tal pero.

Hay alguna forma de poder seguir aprovechando funciones como Advance() funcionen con el angle, pero que los fotogramas no los rote automaticamente?

Aiken

SplinterGU
18/08/2009, 19:45
Si, hay forma...

Luego me fijo bien y te digo como es, ahora de memoria no me acuerdo.

chipan
18/08/2009, 19:49
Si que se puede, con la funcion xadvance(angulo,distancia) es igual que advance pero le indicas el ángulo en el que quieras que se mueva el sprite sin estar rotado.

OscarBraindeaD
18/08/2009, 19:50
hola chicos.

Tengo unos sprites que tienen un fotograma diferente para cada angulo.
esta muy bien y comodo usar la variable angle y que el propio fenix te lo rote y tal pero.

Hay alguna forma de poder seguir aprovechando funciones como Advance() funcionen con el angle, pero que los fotogramas no los rote automaticamente?

Aiken

Hola, prueba con xadvance(cantidad,ángulo)... esto moverá el proceso en tantos píxeles como indique cantidad y el ángulo indicado... no sé si es eso lo que necesitas...

EDITO: Chipan se me ha adelantado :)

chipan
18/08/2009, 19:53
jajajaja por un pelo, aunque no estoy seguro si es distancia,angulo o angulo,distancia pero bueno, que pruebe aiken que no se lo vamos a dar todo hecho.

OscarBraindeaD
18/08/2009, 19:56
jajajaja por un pelo, aunque no estoy seguro si es distancia,angulo o angulo,distancia pero bueno, que pruebe aiken que no se lo vamos a dar todo hecho.
Jejeje, tienes tú razón... es ángulo y distancia...
Rápido eres, jodío! [wei]

chipan
18/08/2009, 20:09
En fenix soy muy rápido, son muchos años.

Aiken
18/08/2009, 20:15
Si que se puede, con la funcion xadvance(angulo,distancia) es igual que advance pero le indicas el ángulo en el que quieras que se mueva el sprite sin estar rotado.

pero entonces la variable angle no la uso para nada no? almaceno el angulo en una variable mia para que no lo rote no? porque si no me entero mal encuanto ponga un valor en angle lo rotara no?

Digamos que algo asi no?




process misprite
Public
int miangulo;
End
begin
miangulo=0;
angle=0;
loop
switch (miangulo)
case 0: graph = 1; end
case 45000: graph = 2; end
case 90000: graph = 3; end
end
xadvance(miangulo,2);
frame;
end
end




Ahora bien, es esto que estoy haciendo muy enrevesado? normalmente la gente usa un solo grafico que rota con angle o es normal hacer esto? supongo que en vista cenital con usar el angle mas sobrado, pero en cuanto tengas un poco de perspectiva ...

Aiken

chipan
18/08/2009, 20:28
Efectivamente, no utilices para nada la variable angle pues te rotará el personaje; tambien ten en cuenta que el swutch case dee ese ejemplo lo estás poniendo para casos concretos y si sumas ángulos de 2000 en 2000 miligrados nunca se dará el cado de 45000 por poner ejemplo; aunque todo depende de como se vaya a mover tu personaje.

Aiken
18/08/2009, 20:42
Efectivamente, no utilices para nada la variable angle pues te rotará el personaje; tambien ten en cuenta que el swutch case dee ese ejemplo lo estás poniendo para casos concretos y si sumas ángulos de 2000 en 2000 miligrados nunca se dará el cado de 45000 por poner ejemplo; aunque todo depende de como se vaya a mover tu personaje.


tengo 8 direcciones para los fotogramas, angulos de 45 grados, aunque para asegurarme de lo que dices no estaria mal decir que de 22-67 grados use el grafico de 45 grados, o algo asi.

ya vere, cuando tenga que girar los sprites vere que precision uso.
Aiken

Drumpi
18/08/2009, 21:29
Tienes que investigar más sobre los ángulos :D
En fin, ya que se me han adelantado, para seguir manteniendo mi estatus (:D), te aconsejaré que busques info sobre near_angle: te da el ángulo más cercano para tu proceso respecto a otro, sin pasar de un tope. Se suele usar para que los enemigos giren hasta mirar a un determinado objetivo, pero sin que giren en un solo frame. Es como curiosidad, más que nada.

SplinterGU
18/08/2009, 21:57
hay un metodo que usa tablas de angulos, donde dicha tabla tiene la seguidilla de graficos para cada angulo (o rango de angulo) y si bien usas la variable angle, el motor no hace ninguna rotacion, va a buscar dichos graficos... con lo que es la mejor y mas rapida opcion... a eso me referia yo, con que luego te dire como es el asunto...

Segata Sanshiro
18/08/2009, 22:11
hay un metodo que usa tablas de angulos, donde dicha tabla tiene la seguidilla de graficos para cada angulo (o rango de angulo) y si bien usas la variable angle, el motor no hace ninguna rotacion, va a buscar dichos graficos... con lo que es la mejor y mas rapida opcion... a eso me referia yo, con que luego te dire como es el asunto...

Creo que esto es lo que necesitas, Aiken.

Para ello, en DIV se usaba una variable llamada xgraph. No sé cómo será en Fenix/Bennu.

SplinterGU
18/08/2009, 22:38
eso.. eso... en fenix/bennu se llama xgraph... :D

;)

gracias.

chipan
18/08/2009, 22:48
Yo pensaba que el xgraph solo se utilizaba en modo 7 y modo 8

Drumpi
19/08/2009, 00:17
Yo también, pero mira, según la ayuda de Fenix 083b (a ver si sacamos entre todos una ayuda offline más actualizada a partir de la wiki :D)


INT XGRAPH
A esta variable se le puede asignar el OFFSET de una tabla de variables de tipo INT (entero), de manera que el efecto de la variable ANGLE no sea el de rotar el gráfico, sino el de seleccionar un elemento de esta tabla.
La tabla deberá constar de una secuencia de números, cuyo último valor debe ser obligatoriamente 0. El intérprete dividirá internamente los 360 grados que corresonden a la rotación completa del gráfico entre los gráficos disponibles de forma homogenea (angulo 0 primer gráfico y así sucesivamente), eligiendo en cada frame el gráfico de la tabla adecuado en función del valor de ANGLE.
El valor por defecto de esta variable es 0, que es el único valor válido exceptuando un OFFSET o valor de un POINTER.

VER TAMBIÉN:
GRAPH, ANGLE

SplinterGU
19/08/2009, 00:44
Xgraph funciona asi...

XGRAPH = pointer a un array de ints...

donde

xgraph[0] = cantidad de graficos a partir de xgraph[1]

xgraph[1] hasta xgraph[xgraph[0]] = ids de cada uno de los graficos a usar...

grafico a dibujar se desprende de la siguiente formula:

"grafico a dibujar" = xgraph[angulo * (xgraph[0]) / 360000] ;

si "grafico a dibujar" es negativo entonces "grafico a dibujar" = -"grafico a dibujar" y se aplica mirror horizontal.

A ver si alguien se anima y actualiza el wiki de bennu con esta info (de forma mas didactica)
http://wiki.bennugd.org/index.php?title=Bennu_Wiki

Saludos.

Segata Sanshiro
19/08/2009, 01:09
A ver si alguien se anima y actualiza el wiki de bennu con esta info (de forma mas didactica)
http://wiki.bennugd.org/index.php?title=Bennu_Wiki

Saludos.

No estaría mal una explicación currada, sencillita y con ejemplos, aunque eso lleva mucho trabajo :D ¿Quién se ha encargado del wiki de bennu? ¿Se ha aprovechado lo que había en FenixWorld? Bueno, todo esto es curiosidad inútil :D

Si se me permite la sugerencia, habría que intentar que el desarrollo de Bennu no avanzara más rápido que la documentación. Lo digo porque esto fue un problema en las últimas versiones de Fenix, se añadieron muchas funciones interesantes de las que había que buscar la info en el foro de divsite, esparcida por varios temas [wei]

Aiken
19/08/2009, 02:09
y si bien usas la variable angle, el motor no hace ninguna rotacion, va a buscar dichos graficos... con lo que es la mejor y mas rapida opcion...

atiza esa parece la forma profesional de hacerlo, jeje. pues si no es muy dificil intento usarlo.

Aiken

< - >

Si se me permite la sugerencia, habría que intentar que el desarrollo de Bennu no avanzara más rápido que la documentación.

lo que haria falta es un manual de fenix para gente que ya sabe programar.
la mayoria de los tutos y manuales te cuentan mogollon de cosas triviales de programacion.

seria interesante un manual que quitara toda esa paja, y solamente contara las cosas que un programador de una lenguaje "tradicional" tiene que aprender para sacar provecho a fenix/bennu.


Fenix hoy en dia esta "considerado" como un lenguaje para programar facil, pero la verdad es que tiene unas cuantas cosas interesantes de las que puede sacarse bastante potencial.

Aiken

< - >

Xgraph funciona asi...
XGRAPH = pointer a un array de ints...


en cuanto aprenda como se define un puntero a un array de enteros lo pruebo :D

Aiken

SplinterGU
19/08/2009, 05:30
puntero a array... por ejemplo...

int array[360] = ... ;

...

array <--- puntero a array

&array[0] <--- puntero a array

la que mas te guste

----------------------

lamentablemente no puedo frenar el desarrollo por falta de documentacion... la documentacion esta en la wiki, no esta toda, seria bueno aprovechar, actualizar y corregir la documentacion de fenixworld y meterla en la wiki de bennu... pero lamentablemente falta colaboracion y tiempo...
igual hay mucha documentacion, tanto en el foro, como en las wikis...

si me tengo que poner yo a hacerla, directamente abandono el proyecto, porque no voy a tener tiempo para una cosa u otra...

Aiken
19/08/2009, 08:28
si me tengo que poner yo a hacerla, directamente abandono el proyecto, porque no voy a tener tiempo para una cosa u otra...

no te lo estamos pidiendo a ti, es para ver si alguien se anima, incluidos nosotros ;)

Aiken

SplinterGU
19/08/2009, 13:38
:) :) :)

Drumpi
19/08/2009, 17:01
Si se me permite la sugerencia, habría que intentar que el desarrollo de Bennu no avanzara más rápido que la documentación. Lo digo porque esto fue un problema en las últimas versiones de Fenix, se añadieron muchas funciones interesantes de las que había que buscar la info en el foro de divsite, esparcida por varios temas [wei]

Habría que saber "quien" fue el responsable de ese "desarrollo desbocado" de Fenix :D:D:D:D

Por cierto, voy a buscar mi "tortuga", a ver si documento un par de funciones de ficheros.

SplinterGU
19/08/2009, 17:04
juaz!

Hokutoy
19/08/2009, 17:16
Para aprovechar el hilo que veo que está calentito... acabo de volver de mis vacaciones y he aprovechado mi eeepc para ir haciendo un juego en Fenix (a ver si llego a tiempo para el concurso del Tower defense)... cual es mi sorpresa que al llegar a casa y pasarlo a la Wiz veo que lo intenta cargar pero me vuelve al menu inicial de la Wiz. Cosa curiosa ya que en windows va de fabula.
Si partimos de la base que esta escrito y creado en fenix 0.93 y que intento cargarlo de forma correcta con el ufenix, que es una version bastante preliminar por lo que no cargo mucha cosa en memoria... hay alguna manera de que la wiz me diga porque peta? Tipo stdout?

Hay alguna funcion conocida del 0.93 que no soprte bien la wiz y yo desconozca?
Si veo que no puedo localizar lo que hace que el juego no vaya bien en la Wiz ya postearé el codigo a ver si entre todos me podeis ayudar.

Asias

Drumpi
19/08/2009, 17:36
Si, hay una funcion que no soporta del 093: el DCB compilado :D UFenix usa la version 092a de PC, no la 093.
Te debería generar un archivo llamado stdout.txt con la notificación del error, si no, escribe esto en el GPE:

./ufxi tufile.dcb 1>salida.txt 2>error.txt

En salida.txt tendrás todo lo que escribas con say y ciertos mensajes del FXI, y en error.txt los errores que te salten y por qué se vuelve al menu.

Hokutoy
19/08/2009, 18:05
Ok ahora lo pruebo... logicamente he usado la 0.92... lo de la 0.93 lo he escrito por error de memoria jejeje Ya diré lo que me sale .

Aiken
19/08/2009, 20:16
Ok ahora lo pruebo... logicamente he usado la 0.92... lo de la 0.93 lo he escrito por error de memoria jejeje Ya diré lo que me sale .

acabo de meter la primera version preliminar de mi cutre juego y me pasaba como a ti y era cosa de configurar en el gpe bien las rutas.
pero supongo que con lo que te dice drumpi te saldra el error exacto. ;)

Aiken

Hokutoy
19/08/2009, 21:41
Weno ya está arreglado... le verdad es que no me encontraba uno de los fpg aunque no se porque ya que había coincidencias en mayúsculas/minúsculas etc... Aunque al canviarlo de nombre todo perfecto.
Ahora el problema viene de que va bastante lento en la wiz... hay muchos procesos y casi todos checkean cosas constantemente... me tocará depurar a fondo el código y pasarlo a 8 bits de color.
Por cierto... a cuantos herzios va el Fenix wiz? Hay posibilidad de overclock para ganar algunos frames? Alguna idea de como se comporta la tactil? Como el mouse? y el click izquirdo/derecho? Los botones de la wiz corresponden a los "joy_button"? Hay algun lugar donde consultar todo esto (Fenix wiz) sin daros tanto la lata?

Asias!

Drumpi
20/08/2009, 00:56
Si, en el readme que lo acompaña (o debería, no se, como viene preinstalado...), pero bueno, te explico:

Hay un comando que se puede usar para cambiar la velocidad: en Fenix de GP2X es -s seguido de la velocidad en MHz, y en UFenix es --speed y la velocidad. Si no, con la aplicación esa de la velocidad...
En GP2X la velocidad por defecto es de 200MHz, supongo que en wiz lo habrán cambiado ¿600MHz?
Si no han cambiado las cosas desde GP2X, la tactil se comporta como el raton, indicando en mouse.x y mouse.y la posición y en mouse.left si está pulsada la tactil o no. No hay boton derecho.
Los botones de la WIZ, si no ha cambiado nada (me repito, pero ES QUE NO TENGO WIZ) son los cursores, ctrl, alt, z, x (como A B Y X), enter, space (como intro y ¿home?), tab y backspace (L y R... o al reves) y A y S como los del volumen. Si no, como un joystick, y para eso te remito al subforo de GP2X donde puse un código que te ayudará a saber qué botones son cual en modo Joystick (y teóricamente de los mandos USB, si finalmente hay soporte).

Ahora, si quieres mejorar en rendimiento, usa Bennu. Es igual (salvo que tienes que cargar algunas librerías antes de empezar) y va entre dos y tres veces más rápido. Prueba y ya nos dices ;)

Aiken
20/08/2009, 01:28
no se si preguntar en este mismo hilo o en uno nuevo.

Sobre funciones que devuelven tipos compuestos.



type targetpos
int targetx;
int targety;
int tangle;
end




process miproceso;
private
targetpos tpos;
end
begin
tpos = mifuncion(par1,par2,par3);
end




function mifuncion(p1,p2,p3)
private
targetpos tpos;
end
begin
tpos.targetx=0; tpos.targety=2; tpos.tangle=90000;
return(tpos);
end


El compilador me tira una error "Error in file prueba.prg at line 95: Struct required (")")" en la linea:


tpos = mifuncion(par1,par2,par3);


Debe ser que es tarde y estoy empanao pero no consigo solucionarlo, yo creo que deberia estar bien, no? :(
Aiken

SplinterGU
20/08/2009, 01:49
no se pueden devolver tipos, pueden devolver punteros

Drumpi
20/08/2009, 04:19
Traduccion: no se pueden devolver tipos compuestos, sólo enteros y/o punteros (estos últimos apuntando a lo que quieras).
Otra solución es usar variables globales, locales o publicas.

Aiken
20/08/2009, 07:15
traduccion de la traduccion



function mifuncion(p1,p2,p3,targetpos pointer tpos)
begin
tpos.targetx=0; tpos.targety=2; tpos.tangle=90000;
end




mifuncion(par1,par2,par3,&tpos);


Pero creo que aunque compila, la forma de acceder a los campos no deberia ser tpos.targetx sino otra cosa no, en otros lenguajes suele cambiar por algo como tpos->targetx o (*tpos).targetx ? o algo asi?

Pd. juer sois la caña, respondeis a las 3.00 jeje, yo ya no esperaba respuesta hasta hoy entrada la mañana :)

Aiken

SplinterGU
20/08/2009, 13:41
en fenix/bennu no existe ->, el "." sirve tanto para acceder a elementos dentro de punteros a estructuras como a estructuras...

Hokutoy
20/08/2009, 17:39
Si, en el readme que lo acompaña (o debería, no se, como viene preinstalado...), pero bueno, te explico:

Hay un comando que se puede usar para cambiar la velocidad: en Fenix de GP2X es -s seguido de la velocidad en MHz, y en UFenix es --speed y la velocidad. Si no, con la aplicación esa de la velocidad...
En GP2X la velocidad por defecto es de 200MHz, supongo que en wiz lo habrán cambiado ¿600MHz?
Si no han cambiado las cosas desde GP2X, la tactil se comporta como el raton, indicando en mouse.x y mouse.y la posición y en mouse.left si está pulsada la tactil o no. No hay boton derecho.
Los botones de la WIZ, si no ha cambiado nada (me repito, pero ES QUE NO TENGO WIZ) son los cursores, ctrl, alt, z, x (como A B Y X), enter, space (como intro y ¿home?), tab y backspace (L y R... o al reves) y A y S como los del volumen. Si no, como un joystick, y para eso te remito al subforo de GP2X donde puse un código que te ayudará a saber qué botones son cual en modo Joystick (y teóricamente de los mandos USB, si finalmente hay soporte).

Ahora, si quieres mejorar en rendimiento, usa Bennu. Es igual (salvo que tienes que cargar algunas librerías antes de empezar) y va entre dos y tres veces más rápido. Prueba y ya nos dices ;)

Gracias Drumpi he mirado el programa de los Joy Butons que hicistes y va de fabula. Lo del Mouse va como dices. Lo de la velocidad lo he probado pero la verdad es que no noto mejoría... a lo mejor lo hago mal no se...
Había pensado lo de Bennu pero la verdad es que de momento lo veo complicado hacer el cambio... ya que apenas me defiendo con Fenix y la verdad es que las pocas pruebas que hice con -bennu no me salieron muy bien la verdad.
Ademas la fecha del concurso ya está encima así que tiraré de Fenix esta vez.
Sobre el rendimiento... la verdad es que estaba abusando un poco del size y del alpha así que es nomal que la Wiz que queje un poquito.
GRACIAS!

Drumpi
20/08/2009, 18:47
traduccion de la traduccion



function mifuncion(p1,p2,p3,targetpos pointer tpos)
begin
tpos.targetx=0; tpos.targety=2; tpos.tangle=90000;
end




mifuncion(par1,par2,par3,&tpos);


Pero creo que aunque compila, la forma de acceder a los campos no deberia ser tpos.targetx sino otra cosa no, en otros lenguajes suele cambiar por algo como tpos->targetx o (*tpos).targetx ? o algo asi?

Pd. juer sois la caña, respondeis a las 3.00 jeje, yo ya no esperaba respuesta hasta hoy entrada la mañana :)

Aiken

Imsomnio que tiene uno a veces... sólo que anoche no quería ampliar la pila de proyectos XD
De todas formas, en estos casos yo usaba para acceder [tpos].targetx=3 porque en ocasiones tpos[].target=3 me daba error, y no sabía que con el . directamente iba (a decir verdad, aun me lío con los punteros, estoy acostumbrado a los de c++ y no a los de C, que son los de Fenix).


Gracias Drumpi he mirado el programa de los Joy Butons que hicistes y va de fabula. Lo del Mouse va como dices. Lo de la velocidad lo he probado pero la verdad es que no noto mejoría... a lo mejor lo hago mal no se...
Había pensado lo de Bennu pero la verdad es que de momento lo veo complicado hacer el cambio... ya que apenas me defiendo con Fenix y la verdad es que las pocas pruebas que hice con -bennu no me salieron muy bien la verdad.
Ademas la fecha del concurso ya está encima así que tiraré de Fenix esta vez.
Sobre el rendimiento... la verdad es que estaba abusando un poco del size y del alpha así que es nomal que la Wiz que queje un poquito.
GRACIAS!

¿Problemas? no debería darte, sólo que no encuentra las funciones típicas de Fenix (load_map, start_scroll...) porque no has cargado las librerías.
A pesar de eso, tienes razón con lo de los size y alphas, usando al menos uno ya baja el rendimiento. No se si el uso de varios ralentiza de más o se mantiene, pero hay que tener cuidado con eso (en el último juego que estoy haciendo, hago uso de size+flag_aditivo+alpha en un efecto y no se nota mucho... pero a veces se me cuelga al intentar generar un proceso con un gráfico relativamente grande, cosas raras).
Si no varías la transparencia, te puede salir más a cuento usar el flag=4 que es el de transparencia al 50% y es más rápido, o si no, rescatar viejas técnicas de los tiempos de 256 colores y el "dither" con los pixeles transparentes ;)