CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Java] Système de block à la Minecraft

Poneymovez
Poneymovez
Niveau 9
16 novembre 2012 à 22:29:15

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 :)

Bunyan
Bunyan
Niveau 17
16 novembre 2012 à 22:51:07

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.

Poneymovez
Poneymovez
Niveau 9
16 novembre 2012 à 22:58:07

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 :-)

Poneymovez
Poneymovez
Niveau 9
16 novembre 2012 à 23:00:12

Fais chier ce tab :fou:

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 :hap:

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 :)

Bunyan
Bunyan
Niveau 17
16 novembre 2012 à 23:16:03

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.

Poneymovez
Poneymovez
Niveau 9
16 novembre 2012 à 23:22:32

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 :hap:

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.

Poneymovez
Poneymovez
Niveau 9
16 novembre 2012 à 23:23:43

PS :d) Programmation, j'ai pas de fortes difficultés, mis à part ce système que j'aimerai bien finir quoi :hap:

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 :-)

Bunyan
Bunyan
Niveau 17
16 novembre 2012 à 23:25:09

Et pour le reste, sinon ?
Parce que tu ne réponds juste à la partie la moins intéressante pour ton problème en fait :/

Poneymovez
Poneymovez
Niveau 9
16 novembre 2012 à 23:30:30

pour le final :d) Je savais, après pourquoi j'ai mis ça :sarcastic:
Généralement je programme entre 20h et 3h du matin donc des fois je me retrouve avec des choses incompréhensible :sarcastic:

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 ( :hap: )
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 :(

Poneymovez
Poneymovez
Niveau 9
16 novembre 2012 à 23:31:49

Ha oui :d)

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 :(

[-ArK-]
[-ArK-]
Niveau 29
17 novembre 2012 à 11:33:35

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 :question:
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 :hap:

Poneymovez
Poneymovez
Niveau 9
17 novembre 2012 à 11:48:50

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 :)

Poneymovez
Poneymovez
Niveau 9
17 novembre 2012 à 12:55:05

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 :(

Poneymovez
Poneymovez
Niveau 9
17 novembre 2012 à 13:26:27

Au cas où :

J'ai trouvé comment faire :d)
http://www.siteduzero.com/forum-83-820494-p1-systeme-bloc-a-la-minecraft.html#r7848690

Voir tout en bas :)

Merci à vous :-)

[-ArK-]
[-ArK-]
Niveau 29
17 novembre 2012 à 13:33:55

Pas bête :oui:

Assez atypique ton système je trouve :noel:

Pseudo supprimé
Pseudo supprimé 17 novembre 2012 à 13:38:45

lol on a le même projet :D
http://spacequadrants.com/

Poneymovez
Poneymovez
Niveau 9
17 novembre 2012 à 13:44:41

Je sais [-ArK-] :noel:

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) :d)

http://pastebin.com/Tb8qASGm

Raspberry-Pi :d) Moi c'est un un puzzle game avec editeur de niveau. Rien à voir avec toi je trouve :-)

[stefo]
[stefo]
Niveau 13
17 novembre 2012 à 14:05:34

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.

Bunyan
Bunyan
Niveau 17
17 novembre 2012 à 14:36:28

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.

Poneymovez
Poneymovez
Niveau 9
17 novembre 2012 à 15:30:12

Ok, merci pour vos conseils, je vais regarder tout ça :ok:

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment