Riper escribió:Ahora mismo tengo 2 problemas:
- No encuentro la funcion para que el juego detecte que el boton UP del mando esta pulsado y la pala suba continuamente. De momento la pala solo sube a cada golpe de boton. Un desastre.
- La "pelota" se desplaza muy deprisa. No encuentro la manera de reducir el desplazamiento ni encontrar una instrucción de sleep/pause para que la pelota no vaya tan rapido.
Buenas Riper.
Para el primer problema, el atributo
state marca cuándo pulsas un botón, pero no el hecho de mantenerlo pulsado. Cuando
state sea cierto debes poner la variable que has creado para controlar la pulsación a 1 (por ejemplo) que indique que se ha pulsado el botón que indicas, y esa variable sólo se pondrá a cero cuando el atributo
change sea verdadero, es decir cuando se suelte dicho botón. Entonces luego en cualquier parte del código puedes ejecutar el código de movimiento cuando la variable valga 1.
Quedaría algo como:
u8 pushingUP = 0
void myJoyHandler( u16 joy, u16 changed, u16 state)
{
if (joy == JOY_1)
{
if (state & BUTTON_UP) pushingUP = 1;
else if (changed & BUTTON_UP) pushingUP = 0;
}
}
La solución más sencilla para el segundo problema es poner un limitador para que el movimiento no se ejecute en cada ciclo del while. Por ejemplo creas una variable y controlas que sólo pueda tomar 2 valores y que vaya alternándolos en cada iteración del while. Entonces pones como condición para que se ejecute el código de movimiento que tu variable valga uno de los dos valores, reduciendo a la mitad la velocidad de la bola. Si en lugar de tomar sólo 2 valores toma 3, entonces reduces la velocidad a 1/3 de la que tienes ahora, y ya es sólo ir probando hasta que quede a tu gusto.
El código sería algo tal que así:
u8 updateBall = 0;
While(1) {
..........
//Sólo se ejecuta cuando updateBall vale 1.
if(updateBall) {
ball.x += ball.dx;
ball.y += ball.dy;
}
//updateBall toma los valores 0 y 1 sólamente.
updateBall = 1 - updateBall;
..........
}