ptitchep | Bonjour
Je développe sous linux un jeu type Total annihilation (ou AOE...).
Comme mes amis qui me servent gentiment de testeurs sont sous windows, je dois recompiler sous windows. J'utilise OpenGl et SDL donc je n'ai pas ou peu de soucis à la compilation.
Par contre à l'execution, j'ai un bug bizarre uniquement sous windows. Lorsqu'une unité se déplace sur la ligne de cases tout en bas de la carte, j'ai un retour au bureau, segfault apparemment. J'ai donc pensé que c'était une histoire de tableau et de mauvaise adresse mais je ne la trouve pas et surtout je ne comprend pas pourquoi cela ne fonctionne pas sous windows et correctement sous linux.
bout de code:
Code :
- void ActionAVANCER::unTour(const Carte* carte,Serveur* serveur)
- {
- ...
- Pave f(position, unit->getTailleX()/2,unit->getTailleY()/2,unit->getTailleZ()/2, direction);
- int indiceCase=carte->positionOK(&f,unit->getCategorie()); //demande à la carte si la nouvelle position est valide
- ...
- }
- int Carte::positionOK(const Pave* forme,int categorie) const
- {
- static Point centre(0,0,0);
- static const Vecteur v(0,1,0);
- //on considère qu'une case de la carte est un pavé très fin:
- static Pave f(centre,
- LARGEUR_CASE,HAUTEUR_CASE,0.1,
- v);
- /*on rcupre la plus grande dimension de la forme (sauf le z)
- et on teste toutes les cases dont la distance est inf a et qui sont de l'eau ou infranchissables.
- */
-
- int indiceX,indiceY;
- //d'abord on rcupre la case de la position:
- indiceY=int(forme->getCentre().y/HAUTEUR_CASE);
- indiceX=int(forme->getCentre().x/LARGEUR_CASE);
- //on compte combien de cases reprsente la plus grande dimension du pav
- float dx=forme->getLx()/2, dmax=forme->getLy()/2;
- if(dx>dmax)
- dmax=dx;
- //on prend le nombre de cases que cela reprsente et on ajoute 1 pour etre sur
- int dX,dY;
- dY=int(dmax/HAUTEUR_CASE) +1;
- dX=int(dmax/LARGEUR_CASE) +1;
- /*Pour chaque case, si elle est infranchisable, on test la collision.
- si il y a collision, on renvoie le numéro de la case
- */
- indiceY-=dY;
- indiceX-=dX;
- //on sauvegarde indiceX
- int sauv=indiceX;
- #warning ici il faudra grer la catgorie pour les bateaux ou les avions
- for (int i=0;i<=2*dY;i++)
- {
- for(int j=0;j<=2*dX;j++)
- {
- int calc=indiceY*largeur+indiceX;
- if(calc>=0 && calc<int(largeur*largeur))
- if(cases[calc]>=DEBUT_CASES_EAU)
- {
- //on remplit le pavé avec la position de la case pour tester la collision
- centre.x=indiceX*LARGEUR_CASE+LARGEUR_DEMI_CASE;
- centre.y=indiceY*HAUTEUR_CASE+HAUTEUR_DEMI_CASE;
- f.setCentre(centre);
-
- if(forme->siCollision(f))
- return calc;
- }
- indiceX++;
- }
- indiceX=sauv;
- indiceY++;
- }
- return -1;
- }
|
---------------
deluser --remove-home ptitchep
|