Jeux Libres

Envie de créer un jeu vidéo ?   Le site qui vous accompagne de A à Z.


» Les Forums » Création de jeux en Java » Astuce pratique


Aller à la page : 1.

Astuce pratique
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 07 Juillet 2009, 15:41             Message non corrigé

Super pratique, et simple pour partitionner ses maps, ce qui évite les tests de collisions inutils et autre bricoles.

<!-- o code  2e --><!-- o code  -->
public class Octree {
private Octree parent;
private Octree[] enfants;
private float posX, posY, posZ, taille;
private ArrayList<Item> itemsInside;
private boolean feuille;
public Octree (float posX,float posY,float posZ, float taille) {
this.posX = posX;
this.posY = posY;
this.posZ = posZ;
this.taille = taille;
parent = this;
enfants = new Octree[8];
feuille = false;
initialiser ();
}
public void initialiser () {
//Crée l'arbre.
taille /= 2;
if (taille > Parameter.UNITE_BLOC) {
enfants[0] = new Octree (posX, posY, posZ, taille);
enfants[1] = new Octree (posX + taille, posY, posZ, taille);
enfants[2] = new Octree (posX + taille, posY, posZ + taille, taille);
enfants[3] = new Octree (posX, posY, posZ, taille);
enfants[4] = new Octree (posX, posY + taille, posZ, taille);
enfants[5] = new Octree (posX + taille, posY + taille, posZ, taille);
enfants[6] = new Octree (posX + taille, posY + taille, posZ + taille, taille);
enfants[7] = new Octree (posX, posY + taille, posZ + taille, taille);
} else {
feuille = true;
                       taille *= 2;
               }
}
private void addItem (Item item) {
itemsInside.add(item);
}
//Place un objet dans l'arbre.
public void placerObjet (Item item) {
if (parent != null) {
for (int i = 0; i < 8; i++) {
if (enfants[i].feuille == false)
enfants[i].placerObjet (item);
else {
Vec3t centre = new Vec3t (posX + taille / 2, posY + taille/2, posZ + taille/2);
AxisAlignedBoundingBox aabb  = new AxisAlignedBoundingBox(centre, taille, taille, taille);
if (aabb.isInside(item.getPositions().getVec3t()[0], item.getPositions().getVec3t()[1], item.getPositions().getVec3t()[2]))
addItem (item);
}
}
}
}

public String toString () {
return "Pos x : "+posX+" pos y : "+posY+" pos z : "+posZ+" taille : " + taille+" feuille : " + feuille + "\n";
}

}
<!-- f code --><!-- f code 2e -->

L'avantage est que l'on peut faire les tests de collision uniquement dans les octrees qui sont en face du rayon de la caméra et derrière aussi. (le rayon c'est tout simplement entre lookAt et la position du joueur)

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 09 Juillet 2009, 10:31             Message non corrigé

Erf, j'avais oublier de multiplier la taille par deux dans le else de initialiser.

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Joey



Grade : Débutant
Inscrit le: 07 Sept 2009, 22:43
Ecrit le: 07 Sept 2009, 22:49             Message corrigé par ryzou

C'est trop cool tout ça !

________
Joey Tribbiani
  Profil Mail
 


Aller à la page : 1.


Hébergeur du site : 1and1.fr



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

1198836 pages ont été consultées sur le site !
Dont 2330 pages pendant les 24 dernières heures.

Page générée en 0.321 secondes


Nos partenaires
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo


  © 2005-2012 www.jeux-libres.com - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.