Jeux Libres
       
           

» Les Forums » Aide à propos de la création de jeux vidéo » [Java] Astuce pratique


Aller à la page : 1.

[Java] Astuce pratique
Lo



Grade : Maître
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
Lo



Grade : Maître
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
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
 


Aller à la page : 1.


Hébergeur du site : David
Version PHP : 5.4.45-0+deb7u2
Uptime : 55 jours 17 heures 58 minutes
Espace libre : 1512 Mo
Dernière sauvegarde : inconnue
Taille de la sauvegarde : 1113 Mo


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

Page générée en 0.432 secondes


Nos sites préférés
- Création d'un jeu de plateforme de A à Z avec SDL
- Zelda ROTH : Jeux amateurs sur le thème de Zelda
- Zeste de Savoir : la connaissance pour tous et sans pépins
- YunoHost : s'héberger soi-même en toute simplicité
- Site de Fvirtman : recueil de projets et de codes en C et C++
- Par ici la sortie : le site des idées de sorties


  © 2005-2020 linor.fr - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.