if ((xpos==0) || (xpos+8==LCD_WIDTH-1)) { if (rad>127) rad=255-(rad-128); else rad=128-rad; }
if (rad<0) rad=255; if (rad>255) rad=0;
psin=Tbl_psin [rad];
C'est faux dès que tu peux faire varier 'rad' par pas de plus de 1. Utilise plutôt rad&=255, en plus c'est bien plus rapide.
Tu n'as pas besoin de deux tables, puisque comme tu l'as d'ailleurs remarqué, sin(x)=cos(x+pi/2), donc Tbl_psin[rad]=Tbl_pcos[(rad+64)&255]. Si tu veux un peu plus de vitesse, tu peux définir Tbl_pcos pour faire 256+64=320 valeurs, comme ça tu peux écrire Tbl_psin[rad]=Tbl_pcos[rad+64].
Et enfin, chose cruciale (qui doit être la cause de ton pb) : il faut que tu mettes le clipping pour rad (i.e. "rad&=255") juste avant les accès à la table.
Et accessoirement "255 - rad" correspond à "pi*(255/256) - ton_angle", ce qui n'a pas grand intérêt... Utilise plutôt "256 - rad", autrement dit "- rad" (mais cela suppose évidemment que tu fasses le clipping au dernier moment, ce qui est de toute façon indispensable et ne coûte rien).
Pas bête, j'oublie souvent que des opérations binaires peuvent faire le même résultats et souvent bien plus rapidement.
if (rad<0) rad+=256; if (rad>=256) rad-=256;
while (rad<0) rad+=256; while (rad>=256) rad-=256;
if ((unsigned int)rad>=256) { if (rad<0) do rad-=256; while (rad<0); else do rad+=256; while (rad>=256); }
[...] en changeant l'angle de déplacement avec le curseur gauche et droit.Concernant les variables :
[...] if (_keytest ([4]RR_DOWN[/4])) rad-=2; if (_keytest ([4]RR_UP[/4])) rad+=2; [...]
Pourquoi ne pas déclarer rad avant _main ?[...] // avant _main short pcos=0, 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}; [...] // dans _main short rad=124; [...] for (int i=0;i<10000;i++); [...]
Les 2 tables Tbl_pcos et Tbl_psin vont de 0 à 255:
0=0
63=pi/2
127=pi
191=-pi/2
255=2pi
[...]
Si tu n'utilise que les indices pairs, pourquoi faire des tables 2 fois trop grandes ?if (_keytest (RR_DOWN)) rad-=2; if (_keytest (RR_UP)) rad+=2;
Il serait peut-être plus intéressant de faire quelque chose comme : //avant _main char vitesse_lin=2, vitesse_rot=2; [...] if (_keytest (RR_UP)) vitesse_lin+=1; if (_keytest (RR_DOWN)) vitesse_lin-=1; if (vitesse_lin<0) vitesse_lin=0; if (vitesse_lin>32) vitesse_lin=32; if (_keytest (RR_F1)) vitesse_rot+=1; if (_keytest (RR_F5)) vitesse_rot-=1; if (vitesse_rot<1) vitesse_rot=1; if (vitesse_rot>32) vitesse_rot=32; if (_keytest (RR_LEFT)) rad+=vitesse_rot; if (_keytest (RR_RIGHT)) rad-=vitesse_rot; [...] pJe pense ne pas avoir besoin de préciser le détail de ceci ...
Enfin, pour le rebond : if (xpos==0) rad=128-rad; // rebouclage automatique nécessaire, sinon faire un modulo 256 ou un double-test pour rester dans [[0 ; 255]] if (xpos+8==LCD_WIDTH-1) rad=128-rad; // idem if (ypos==0) rad=256-rad; // 256, pas 255, voire rad=-rad, s'il y a rebouclage automatique if (ypos+8==LCD_HEIGHT-Donc tout pareil que Sasume, mais en un seul pavé indigeste
Tout d'abord, juste histoire de jouer le boulet qui s'attarde sur un détail sans importance aucune :
Pourquoi ne pas déclarer rad avant _main ?
Pourquoi ne pas déclarer rad en tant que unsigned char (si ce type existe) pour être sûr que rad reste dans [[0 ; 255]], donc qu'il n'y a pas de débordement de table, et même pour boucler automatiquement le début et la fin des tables sans avoir à ramener rad dans [[0 ; 255 ]] (le proc s'en charge lui-même avec juste le CF qui s'allume) ? Ca permettrait de s'affranchir de :
Sinon, plutôt que ce double-test, pourquoi ne pas faire un modulo 256 ?
Pourquoi ne pas déclarer pcos et psin après les tables pour leur donner des valeurs valides (au lieu de 0 et 0, mathématiquement impossible), voire les déclarer dans _main ?
Tu n'aurais pas oublié de déclarer i, à tout hasard ?
Si tu n'utilise que les indices pairs, pourquoi faire des tables 2 fois trop grandes ? Il serait peut-être plus intéressant de faire quelque chose comme :
Donc tout pareil que Sasume, mais en un seul pavé indigeste ...
Sachant que Cos(2pi)=Cos(0) et que Sin(2pi)=Sin(0), pourquoi mettre à la fois 0 et 2pi dans les tables ?
Pourquoi ne pas déclarer rad avant _main ?
Pourquoi ne pas déclarer rad en tant que unsigned char (si ce type existe) pour être sûr que rad reste dans [[0 ; 255]], donc qu'il n'y a pas de débordement de table, et même pour boucler automatiquement le début et la fin des tables sans avoir à ramener rad dans [[0 ; 255 ]] (le proc s'en charge lui-même avec juste le CF qui s'allume) ? Ca permettrait de s'affranchir de :
Oui, c'est ce que j'ai fais, une fois les tests finit.
Sachant que Cos(2pi)=Cos(0) et que Sin(2pi)=Sin(0), pourquoi mettre à la fois 0 et 2pi dans les tables ?Par ce que c'est plus facile de gérer la table et de plus, je serais obliger d'effectuer des calculs qui me permetterons d'arriver à 0 ou à 2pi.
[...]Si rad=0, la balle se déplace selon x (aucune composante selon y), donc ne peut pas avoir de collision selon y ...
Y a juste un bug, c'est lorsque rad=0 et qu'il y a collision suivant y, la balle sort de l'écran, [...]
Oui, c'est évident qu'il faut avoir 2pi = 256, sinon il faut calculer tout modulo 255
Si rad=0, la balle se déplace selon x (aucune composante selon y), donc ne peut pas avoir de collision selon y ...
Oui et je dépasse la table et je m'oblige donc à la coder en short.