Wii...

Started by SplinterGU, December 20, 2008, 11:58:07 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Esta justo encima de ti, en la firma de josebita  :D

scuws

 :o

fallo mio ::)

josebita

#557
En mi firma tienes un enlace a la página del proyecto en Google Code.
Ahí siempre tendrás la última.

Acabo de subir la versión alpha 5. En un ratillo comento las mejoras, pero si no os da miedo leer un poco de código C, básicamente mejora bastante el tema de los controles con el Wiimote y similares. Podeis verlo aquí.

Por cierto, agradecería MUCHO y ayudaría a resolver las cosas antes si cada vez que encontrais algo de código que compila pero se rompe y está relacionado con ficheros (save/load, seeking...) que pongais ese pedazo de código -de forma que lo pueda compilar sin más- en la sección de  comentarios de aquí.

[Edito] Las constantes de la mod_wpad ya las he sacado del main_core.c. Se cargan en tiempo de ejecución. Poco a poco iré sacando todas las definiciones de constantes/locales/globales del core.

josebita

Existe un error con la versión que había subido antes con la detección del ángulo del wiimote.
He vuelto a subir el mismo binario con eso corregido (y algún pequeño cambio más, pero no debería cambiar nada de la funcionalidad).

Funciones en esta versión:

  • int WPAD_IS_READY(int chan): Para saber si el Wiimote número chan está disponible.
  • int WPAD_INFO(int chan, int code): Para obtener información del Wiimote. En particular:
    code=WPAD_BATT. Devuelve el nivel de batería del dispositivo (entre 0 y 256).
    code=WPAD_X. Devuelve la posición en X de apuntado (debería ser lo mismo que mouse.x, si sólo hay un Wiimote).
    code=WPAD_Y. Devuelve la posición en y de apuntado (debería ser lo mismo que mouse.y, si sólo hay un Wiimote).
    code=WPAD_Z. Devuelve la distancia a la pantalla.
    code=WPAD_ANGLE. Devuelve el ángulo de giro del Wiimote.
    code=WPAD_PITCH. Devuelve el ángulo de cabeceo del mando.
    code=WPAD_ROLL. Devuelve el ángulo de balance del mando.
    code=WPAD_ACCELX. Devuelve la aceleración en el eje X del mando.
    code=WPAD_ACCELY. Devuelve la aceleración en el eje Y del mando.
    code=WPAD_ACCELZ. Devuelve la aceleración en el eje Z del mando.
    code=WPAD_IS_BB. Devuelve 1 si el mando corresponde a una Wii Balance Board.
  • int wpad_info_bb(int chan, int code) Obtiene info de un mando. Sólo devuelve información útil si el mando es una Balance Board.
    code=WPAD_BATT. Devuelve el nivel de batería del dispositivo (entre 0 y 256).
    code=WPAD_X. Devuelve la posición en X de apuntado (debería ser lo mismo que mouse.x, si sólo hay un Wiimote).
    code=WPAD_Y. Devuelve la posición en y de apuntado (debería ser lo mismo que mouse.y, si sólo hay un Wiimote).
    code=WPAD_WTL. Devuelve el peso en kg en la pata superior izqda. de la tabla.
    code=WPAD_WTR. Devuelve el peso en kg en la pata superior dcha. de la tabla.
    code=WPAD_WBL. Devuelve el peso en kg en la pata inferior izqda. de la tabla.
    code=WPAD_WBR. Devuelve el peso en kg en la pata inferior dcha. de la tabla.
  • void WPAD_RUMBLE(int chan, int status). Activa o desactiva la vibración del mando chan.

Algunos valores creo que no los está dando bien, así que agradezco comentarios.
Tres pequeños ejemplos.

BoMbErLiNk

DCelso al final no voy a usar la FGFX he convertido todo el sistema a paletas 8bits (por fin) , siento el esfuerzo  :P

Dicho de paso las rotaciones de color y otras funciones de palette me han funcionado bien en el port, lo de la bateria del pad suena interesante para pausar automaticamente el juego cuando se acaben las pilas  :-X

josebita

DCelso, mándame el código del bgdrun para que le pueda echar un ojo a ver cómo es la mejor forma de integrarlo, que sólo he encontrado el binario.

DCelso

Por ahora no va a poder ser, lo tengo en un portátil al que ahora mismo no tengo acceso, no sé cuanto tardaré en en poder recuperarlo pero como mínimo un mes o dos, quizás tenga que reimplementarlo antes de que me olvide de lo que hize.
Lo siento.
Monstruos Diabólicos

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

josebita

Quote from: DCelso on April 24, 2010, 07:23:21 PM
Por ahora no va a poder ser, lo tengo en un portátil al que ahora mismo no tengo acceso, no sé cuanto tardaré en en poder recuperarlo pero como mínimo un mes o dos, quizás tenga que reimplementarlo antes de que me olvide de lo que hize.
Lo siento.
:( Pos vaya.

DCelso

debí colgar el código cuanto tuve oportunidad :(, eso me pasa por listillo :D
Monstruos Diabólicos

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

BoMbErLiNk

#564
He sacado los controles de gamecube (semillas deku a los ojos de los que hacen las wiki por no ponerlos  ;D) :

Quote
GAMECUBE
A = 0
B = 1
X = 2
Y = 3
Z = 4
R = 5
L = 6
START = 7

* Estan localizados como joystick : 4,5,6,7 (como el classic controller)
* Seta con get_joy_position 0 (horizontal), 1 (vertical)
* C amarillo con get_joy_position 2 (horizontal), 3 (vertical)
* R tiene control de sensibilidad con get_joy_position 4
* L tiene control de sensibilidad con get_joy_position 5
* La cruceta no responde a botones, por lo que se supone que es un HAT

Adjunto el código por si alguien quiere saber el de los bongos, guitarra o cualquier cosa que no este por internet, no pongo joysticks porque es mucho más evidente encontrarlos :

[code language="bennu"]
PROGRAM controls;
import "mod_video";
import "mod_joy";
import "mod_key";
import "mod_text";
import "mod_proc";

GLOBAL
buttons[7][22];

BEGIN
set_mode(320,240,16);

FROM x=0 to 22;
      write(0,40,10+(x*10),4,x+" :");
      FROM y=0 to 7;
             write_int(0,70+(y*30),10+(x*10),4,& buttons[y]
  • );
          END
    END

    LOOP

    FROM x=0 to 22;
          FROM y=0 to 7;
                 buttons[y]
  • =get_joy_button(y,x);
          END
    END

    IF (key(_esc)) exit(); END
    FRAME; END END[/code]

josebita

¡Muchas gracias, Bomber!.
Por cierto, creo que tengo localizado (aunque aún no arreglado del todo) el bug en save y quizás el bug en load. A ver si esta tarde lo pruebo y os cuento; parece otro bug de endianess.

josebita

Probad, por favor, a ver si el siguiente fichero corrige las funciones save y load.
http://code.google.com/p/bennugd-wii/downloads/detail?name=bennugd-a5~1.tar.bz2&can=2&q=#makechanges
Según tengo entendido, el ejemplo funciona ahora (el parche no es mío, así que no lo puedo asegurar al 100%).

panreyes

Mmm... tengo yo que acordarme de armarte un código de ejemplo para unos cuantos fallos más que he ido viendo y no te he reportado. Eso si, siempre con ficheros.

Me falla desde el cd, el fopen (fwrite y fread también, lógicamente) y alguna más. Creo que fputs y fgets...

josebita

Splinter, te cuento lo que he podido encontrar con respecto al bug de save. Como he dicho parece un error de endianes, así que supongo que aplica a Bennu.
El bug (load tiene un bug similar, que supongo que proviene del mismo sitio, aunque no lo he podido comprobar aún) está en la forma en que se leen las variables de los dcb; en particular alrededor de la línea 234 del fichero common/varspace_file.c el valor de la variable count no está swappeado (o lo está de más) de forma que en el ejemplo en lugar de valer 7 (como lo hace en un sistema little-endian) vale el swappeado de 7.

Por lo que mi hermano ha podido averiguar, el problema viene del fichero core/bgdrtm/src/dcbr.c (función dcb_load_from, alrededor de la línea 293) no se tiene en cuenta el endianess cuando se leen los datos globales.

La versión que he sacado no arregla esto sino que guarda en el dcb esas variables en el formato nativo de la máquina, a la espera de que implementes (Splinter) un arreglo real del bug. Si necesitas algún detalle más, puedo intentar dártelo.

josebita

Quote from: PiXeL on April 26, 2010, 03:08:09 PM
Mmm... tengo yo que acordarme de armarte un código de ejemplo para unos cuantos fallos más que he ido viendo y no te he reportado. Eso si, siempre con ficheros.

Me falla desde el cd, el fopen (fwrite y fread también, lógicamente) y alguna más. Creo que fputs y fgets...
Te lo agradecería. El otro día probé otra vez este ejemplo con fopen, fread... y parecía ir bien (la salida debería ir al stdout.txt).