Je post le sujet que j'ai fais sur le SDZ, ça sera plus propre
http://www.siteduzero.com/forum-83-820494-p1-systeme-bloc-a-la-minecraft.html
Vous pouvez répondre ici ou là bas, c'est pareil pour moi.
Merci d'avance.
Cordialement ![]()
Déjà : tu affiches quoi là ? C'est quelle variable qui te donne ça ? C'est "Block[] block" ?
Comment remplis-tu ton tableau ? Essayes-tu de mettre en oeuvre un Singleton ?
'Fin, du peu que je vois, le comportement que tu as est totalement normal. Tout tes blocs sont en constantes globales, tu n'en crée qu'un de chaque type (et tu ne peux pas en créer d'autre). Tu as un comportement tout à fait normal au vu de ton code.
je vais essayer de mieux expliquer :
J'ai un block glass qui a pour effet de se détruire au bout de 3 "marches du joueur" dessus.
Dès que le joueur marche dessus, une variable s'incrémente.
Le soucis, c'est que la variable incrémente tous les blocs glass de la map.
Ensuite, les variables toussa on s'en fiche un peu j'ai envie de dire ![]()
Fais chier ce tab
Donc mon tableau Block[] block contient les blocks en faite. C'est dur à expliquer.
Par exemple, dans mon tableau block, j'ai le block air. ça permet de récupérer les infos. Enfin bref
Le soucis c'est que je sais pas du tout comment faire pour que chaque block ait sa propre instance, et pas une instance commune dans la class block
Merci ![]()
Vu que tu n'as pas compris ce que j'ai écris, je vais l'écrire différemment.
Tu as une constante par bloc. À chaque fois que tu demandes air, wall, glass ... c'est cette constante qui est renvoyée. Tu crées donc ton tableau de bloc avec des plusieurs exemplaires des mêmes blocs. Si tu mets un bloc air en 5, 6 et 7, c'est le même qui y est mis, vu que c'est une constante.
Le comportement que tu décris, et qui est problématique pour toi, est le comportement que tu as implémenté. Tu n'as qu'un seul bloc de chaque sorte, grâce au mot-clé "final", qui permet de faire les constantes en Java.
Ne prends pas mal la question : tu as de très grosses lacunes en programmation, non ? Tu sembles connaître des pans entiers, et certaines choses avancées, mais ignorer des bases.
La réponse à ta question, en version courte, est d'écrire quelque chose comme : new GlassBlock();
En version longue :
Il te suffit simplement de supprimer toutes les variables "air", "wall", "glass", etc. et de remplacer les appels à BLock.glass par un "new GlassBlock()", une classe permettant de créer un block de verre.
Si tu veux garder ton idée d'usine et de chaînage d'appels (ce que je trouve personnellement immonde, personnel, je répète ;) ), je te suggère dans ce cas de passer par une classe style http://pastebin.com/TjzUxeuE . Je met en oeuvre le DP Factory dans ce cas.
Je prends pas mal la question, j'ai juste eu envie de faire comme Minecraft. J'aime beaucoup cette idée d'instanciation en une ligne
J'ai regardé vite fait leur génération, mais c'est tellement "chiant" à mon niveau que j'ai abandonné.
C'est à dire que là c'est arrangeant :
air = new Block().setID(0).setTexture(0, 0).setHard(false).setPickable(false).finalize_bloc
k();;
En une ligne c'est casé, pas besoin de faire ça sur X lignes.
PS
Programmation, j'ai pas de fortes difficultés, mis à part ce système que j'aimerai bien finir quoi
Mais c'est comme tout, avant de faire du vélo il faut apprendre.
Avant de faire ce système il faut que je vois comment il fonctionne ![]()
Et pour le reste, sinon ?
Parce que tu ne réponds juste à la partie la moins intéressante pour ton problème en fait :/
pour le final
Je savais, après pourquoi j'ai mis ça ![]()
Généralement je programme entre 20h et 3h du matin donc des fois je me retrouve avec des choses incompréhensible
Après le fait de devoir définir chaque bloc danc chaque class ça me fais un peu chi** quoi ![]()
Parce que je reprend le cas de Minecraft (
)
public static final Block stone = (new BlockStone(1, 1)).setHardness(1.5F).setResistance(10.0F).setStep
Sound(soundStoneFootstep).setBlockName("stone");
Et on voit bien que quand on brise un bloc de stone, on brise pas tous les blocs ![]()
Et c'est là que je bloque quoi ![]()
Ha oui
Quand à l'instanciation, je fais comme ceci :
_map[i][j] = new Block().air;
Je vois pas comment créer une nouvelle instance du block Air étant lui même dans la class Block ![]()
Pour créer une instance du block air étant lui-même un block t'as qu'à faire des sous classes qui étendent Block non ![]()
genre public class BlockAir extends Block
Et ensuite dans leurs constructeur tu mets directement les attributs du genre pickable.
Dans ta classe Block t'auras qu'à mettre un constructeur du genre :
public Block(int x, int y, boolean isPickable, boolean isSolid) {
this._x = x;
this._y = y;
this.pickable = isPickable;
this.isSolid = isSolid;
}
et dans ton constructeur de BlockAir tu pourras par exemple faire un appel comme ça :
public BlockAir(int x, int y){
super(x, y, true, false);
}
etc.
Ou tu peux faire un constructeur de base et faire tes setters dans le constructeur, du genre :
public BlockAir(int x, int y){
super(x, y);
setTruc(true);
etc
}
De cette manière quand tu créeras des blocks t'auras pas besoin de redéfinir leurs propriétés à chaque fois, juste leurs coordonées ![]()
Ouais, j'y ai pensé, mais justement j'aime pas cette méthode, car quand il y aura pas mal de bloc, en rajouter sera long je trouve
Puis dans mon éditeur (Et même dans le jeu), j'ai une méthode où je récupère l'_id du bloc sélectionné, ensuite je fais un "_map[i][j] = new Block().block[_id];", du coup il faut que je vois comment faire avec l'autre méthode
Après, si j'ai pas le choix, je ferais comme ça ![]()
Quelqu'un sur le SDZ m'a donné cette idée :
public static getBlock_Air() { return new Block().setID(0).setTexture(0, 0).setHard(false).setPickable(false).finalize_bloc
k();
}
Je la trouve bien, mais le truc c'est que faire un accesseur par block, ça va vite être le bordel ![]()
Au cas où :
J'ai trouvé comment faire ![]()
http://www.siteduzero.com/forum-83-820494-p1-systeme-bloc-a-la-minecraft.html#r7848690
Voir tout en bas
Merci à vous ![]()
Pas bête
Assez atypique ton système je trouve ![]()
lol on a le même projet :D
http://spacequadrants.com/
Je sais [-ArK-]
Et encore, si tu verrais à quoi il ressemble now (Vu que j'ai des BlockGlass (Par exemple) qui hérite de Block, j'ai du trouver un système)
http://pastebin.com/Tb8qASGm
Raspberry-Pi
Moi c'est un un puzzle game avec editeur de niveau. Rien à voir avec toi je trouve ![]()
C'est marrant parce que tu mélanges le paradigme orienté objet avec le paradigmes de développement impératif.
Dans tout les cas, ton code java n'est pas du tout orienté objet et peux se révéler dangereux dans certains cas.
Pour le DP Factory, c'est ce que j'avais préconisé au-dessus.
Pour info, ce que tu fais avec ton dernier snippet là, c'est cloner ton objet. Je te conseils donc de t'intéresser à l'interface Cloneable, ainsi qu'aux diverses problématiques liées à ce souci.
Tu utilises aussi la réflexivité, pense bien à ce que tes Block possèdent un constructeur sans argument accessible, sinon tu risques d'avoir des soucis.
Ok, merci pour vos conseils, je vais regarder tout ça ![]()