J'ai un problème que je n'arrive pas à résoudre en 1 ligne.
Voilà, j'ai réalisé ce programme qui s'occupe de diriger une balle de 0 à 2pi en changeant l'angle de déplacement avec le curseur gauche et droit. Or je voudrais que cette balle rebondisse lorsqu'elle touche les bords de l'écran.
#include <tigcclib.h>
short xpos=0, ypos=0;
short pcos=0, psin=0;
unsigned short x_pcos=0, y_psin=0;
//64 octets, pcos
const char Tbl_pcos [256] = {127,126,126,126,126,126,125,125,124,123,123,122,121,120,119,118,117,116,114,113,111,110,108,107,105,103,101,99,97,95,93,91,89,87,85,82,80,77,75,72,70,67,64,62,59,56,53,51,48,45,42,39,36,33,30,27,24,21,18,14,11,8,5,2,0,-3,-6,-10,-13,-16,-19,-22,-25,-28,-31,-34,-37,-40,-43,-46,-49,-52,-55,-57,-60,-63,-66,-68,-71,-73,-76,-78,-81,-83,-86,-88,-90,-92,-94,-96,-98,-100,-102,-104,-106,-107,-109,-111,-112,-113,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-124,-125,-125,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-125,-125,-124,-124,-123,-122,-121,-121,-120,-119,-117,-116,-115,-114,-112,-111,-109,-108,-106,-104,-102,-101,-99,-97,-95,-92,-90,-88,-86,-84,-81,-79,-76,-74,-71,-69,-66,-63,-61,-58,-55,-52,-49,-46,-43,-40,-38,-35,-32,-28,-25,-22,-19,-16,-13,-10,-7,-4,-1,2,5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50,53,56,59,61,64,67,69,72,75,77,79,82,84,87,89,91,93,95,97,99,101,103,105,106,108,110,111,113,114,115,117,118,119,120,121,122,123,123,124,125,125,125,126,126,126,126,127};
const char Tbl_psin [256] = {0,-3,-6,-9,-12,-15,-18,-21,-24,-27,-30,-33,-36,-39,-42,-45,-48,-51,-54,-57,-60,-62,-65,-68,-70,-73,-75,-78,-80,-83,-85,-87,-90,-92,-94,-96,-98,-100,-102,-104,-105,-107,-109,-110,-112,-113,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-124,-125,-125,-126,-126,-126,-126,-126,-126,-126,-126,-126,-126,-125,-125,-124,-124,-123,-123,-122,-121,-120,-119,-118,-117,-115,-114,-113,-111,-110,-108,-106,-105,-103,-101,-99,-97,-95,-93,-91,-89,-86,-84,-82,-79,-77,-74,-72,-69,-66,-64,-61,-58,-56,-53,-50,-47,-44,-41,-38,-35,-32,-29,-26,-23,-20,-17,-14,-11,-8,-4,-1,1,4,7,10,13,16,20,23,26,29,32,35,38,41,44,47,50,52,55,58,61,63,66,69,71,74,76,79,81,84,86,88,90,93,95,97,99,101,103,104,106,108,109,111,112,114,115,116,118,119,120,121,122,122,123,124,124,125,125,126,126,126,126,126,126,126,126,126,126,125,125,124,124,123,122,121,120,119,118,117,116,115,113,112,110,109,107,106,104,102,100,98,96,94,92,90,88,85,83,81,78,76,73,71,68,65,63,60,57,54,52,49,46,43,40,37,34,31,28,25,22,19,16,12,9,6,3,0};
INT_HANDLER OldInt1 = NULL;
INT_HANDLER OldInt5 = NULL;
unsigned char ball_sprite [] = {0b00111100,
0b01111110,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b01111110,
0b00111100};
void _main(void)
{
OldInt1 = GetIntVec (AUTO_INT_1);
OldInt5 = GetIntVec (AUTO_INT_5);
SetIntVec (AUTO_INT_1, DUMMY_HANDLER);
SetIntVec (AUTO_INT_5, DUMMY_HANDLER);
ClrScr ();
GrayOn ();
short rad=124;
xpos=LCD_WIDTH/2; ypos=LCD_HEIGHT/2;
x_pcos=xpos*128; y_psin=ypos*128;
pcos=Tbl_pcos [rad];
psin=Tbl_psin [rad];
Sprite8 (xpos,ypos,8,ball_sprite,GetPlane (0),SPRT_OR);
while (!_keytest (RR_ESC))
{
//SetPlane (1); ClrScr ();
Sprite8 (xpos,ypos,8,ball_sprite,GetPlane (0),SPRT_XOR);
x_pcos+=pcos; y_psin+=psin;
xpos=x_pcos/128;
ypos=y_psin/128;
if (_keytest (RR_DOWN)) rad-=2;
if (_keytest (RR_UP)) rad+=2;
if (rad<0) rad=255;
if (rad>255) rad=0;
if (xpos==0) rad=[4]???[/4];
if (xpos+8==LCD_WIDTH-1) rad=[4]???[/4];
if (ypos==0) rad=255-rad;
if (ypos+8==LCD_HEIGHT-1) rad=255-rad;
pcos=Tbl_pcos [rad];
psin=Tbl_psin [rad];
//printf_xy (0,0,"%d",rad);
//printf_xy (0,10,"%d",tsin);
Sprite8 (xpos,ypos,8,ball_sprite,GetPlane (0),SPRT_OR);
DrawPix (xpos+4, ypos+4, A_NORMAL);
for (int i=0;i<10000;i++);
}
GrayOff ();
SetIntVec (AUTO_INT_5, OldInt5);
SetIntVec (AUTO_INT_1, OldInt1);
}
x_pcos, correspond à la valeur réelle de la coordonné x de la balle.
y_psin, correspond à la valeur réelle de la coordonné y de la balle.
pcos, valeur du cosinus en cours.
psin, valeur du sinus en cours.
xpos, ypos, coordonnées de la balle.
rad=angle
Les 2 tables Tbl_pcos et Tbl_psin vont de 0 à 255:
0=0
63=pi/2
127=pi
191=-pi/2
255=2pi
Pour effectuer un rebond, il suffit de modifier le 'signe' de pcos ou psin, or je veux obtenir ce signe et le bonne angle dans les 2 tables Tbl_pcos et Tbl_psin.
Si j'effectue un rebond de la balle suivant y, soit le haut et le bas de l'écran, je fait tout simplement rad=255-rad; Or je n'arrive pas à trouver le calcul pour changer le signe de pcos avec des rebonds suivant x soit le coté gauche ou droit de l'écran.