Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gérer le déplacement d'un personnage

Juste de la réfléxion quoi..

Sujet résolu
    19 décembre 2014 à 21:22:56

    Bonsoir !

    Je me suis donné comme petit objectif de coder un RPG avec un système de cases. J'ai avancé un peu, mais je suis bloqué par un problème qui m'énerve un peu..

    En gros, tout d'abord, ce crée une classe World qui va contenir entre autre la liste des personnages disponibles et le "plateau de jeu" (enfin la map, les dimensions, les items au sol, etc..).

    Puis je crée une classe Perso qui va représenter.. bah un personnage. Donc ce personnage pour l'instant doit juste savoir se déplacer. Seul problème, le personnage ne peut pas se déplacer en fonction des obstacles présents sur le sol puisqu'il ne connait pas la valeur de son World (oui, World est instancié, pas de static, j'ai oublié de préciser).

    Du coup comme c'est le World qui possède les infos de la carte et en même temps la liste des Perso, je peux créer une fonction dans la classe World qui va déplacer tel Perso dans telle direction... sauf s'il y a un obstacle devant.

    Sauf qu'une classe chargée d'en gérer une autre c'est pas terrible. Je voulais savoir s'il existait un moyen (autre que de rendre World static) pour pouvoir mettre les fonction de déplacement dans la classe Perso et en même temps se déplacer "normalement" (genre pas dans les murs..).

    A noter : j'y ai pensé, mais envoyer une copie de son World à un Perso lorsqu'on le crée (le Perso) ne fonctionnerait pas car si le World original est modifié la copie que possède le Perso ne le sera pas :/.

    Voilà, en gros c'est ça le souci. Si quelqu'un a une solution, merci d'avance !

    Bonne soirée !

    • Partager sur Facebook
    • Partager sur Twitter
    Salut les zéros !
      19 décembre 2014 à 23:42:22

      Plutôt qu'une copie, passe une référence de ta map à tes persos

      public class Map {
      
         public void addPerso(Perso perso) {
            persos.add(perso);
            perso.setMap(this);
         }
      
      }
      • Partager sur Facebook
      • Partager sur Twitter

      cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

        20 décembre 2014 à 16:49:17

        Merci pour ta réponse !

        En fait mon code (j'avais pensé que c'était pas la peine de préciser) est un peu différent. La classe World est une classe abstraite qui va être instanciée et modifiée par des classes filles, qui vont justement servir à faire la différence entre tous les niveaux.

        Ici, la classe s'appelle SpawningForest. Il y aura plein de trucs à rajouter après mais pour l'instant avec ta méthode créer une instance de SpawningFortest bugge. Voici les fichiers :

        public class Main {
        	
        	public static void main(String[] args) {
        		World world = new SpawningForest();
        	}
        }
        import java.util.List;
        
        public abstract class World {
        	
        	private List<Perso> persos;
        	
        	protected final void addPerso(Perso p) {
        		this.persos.add(p);
        	}
        }
        public class SpawningForest extends World {
        	
        	public SpawningForest() {
        		this.addPerso(new Perso(this));
        	}
        	
        	
        	public int getWidth() {
        		return 5;
        	}
        	
        	public int getHeight() {
        		return 5;
        	}
        	
        	public String getName() {
        		return "Spawning Forest";
        	}
        	
        	
        }
        public class Perso {
        	
        	private World world;
        	
        	public Perso(World world) {
        		this.world = world;
        	}
        	
        	
        	public World getWorld() {
        		return this.world;
        	}
        }


        Voila, c'est les 4 classes qui sont appelées.

        Et le résultat est toujours :

        Exception in thread "main" java.lang.NullPointerException

        • Partager sur Facebook
        • Partager sur Twitter
        Salut les zéros !
          20 décembre 2014 à 17:17:47

          Le problème n'est pas le même, la stack trace peut beaucoup aider dans ce cas ;) tu as la ligne et la classe source de l'erreur

          Ta liste 'persos' dans World n'est pas instanciée. Créé lui un constructeur où persos = new ArrayList<Perso>() ou fais le directement inline

          • Partager sur Facebook
          • Partager sur Twitter

          cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

            20 décembre 2014 à 21:58:26

            Oui, merci pour le stack trace je connaissait pas j'y repenserai.

            Et effectivement ça marche merci !! :D (j'ai galéré au moins 20 min à changer des trucs pour tester..).

            Je pensais pas que mettre 1 instance sur 2 variables modifierait les valeurs partout.

            En tout cas merci beacoup ! :)

            • Partager sur Facebook
            • Partager sur Twitter
            Salut les zéros !
              21 décembre 2014 à 6:20:28

              Plus précisément ça ne les modifie pas partout, mais simplement au même endroit ;)

              Tous les personnages référencent le même objet Map, c'est à dire qu'ils ont simplement un 'lien' pour accéder à cet objet. En Java, seul les types primitifs sont passés par copie

              • Partager sur Facebook
              • Partager sur Twitter

              cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

                22 décembre 2014 à 16:06:16

                tiens d'ailleurs dans ce cas, c'est mieux d'utiliser un singleton de Map ou un objet map static ?
                • Partager sur Facebook
                • Partager sur Twitter
                  22 décembre 2014 à 16:37:10

                  Le singleton consiste à avoir un objet statique, il le protège juste en assurant qu'il soit unique. L'idéal serait de le gérer comme montré plus haut (ou via des interfaces, pour limiter les actions de l'objet à ce qu'il peut faire sur la map). Si par la suite tu as besoin de plusieurs maps, ça limiterait les changements à apporter.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  cd514331234507.564a1d2324e4e.gifCTO Co-fondateur @ My Talent Manager : boostez votre carrière d'artiste | https://mytalentmanager.fr

                    23 décembre 2014 à 10:33:42

                    L'idée était justement d'éviter à avoir à passer les informations de la map à tout ce qui en avait besoin, vu qu'une seul devait etre créée à la fois. Je pensais faire une classe Map singleton et publiquement accessible, et une classe comme MapInfo ou MapFactory qui contienne plusieurs contructeurs pour chaque map, et qui initialise le singleton.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 décembre 2014 à 21:18:33

                      Oui, mais justement ce n'est pas le but.

                      Le mieux serait de pouvoir instancier plusieurs maps (World en fait) à la fois. Ca servira pas forcément pour un programme client mais on sait jamais si ce tout petit truc évoluait et donnait un jeu multi ce serait pas mal (.. indispensable en fait ;)) de pouvoir instancier plusieurs Worlds à la fois.

                      Ou même en jeu solo, on peut instancier plusieurs maps comme des maisons dans un village, histoire de pas avoir à charger un nouveau World chaque fois qu'on va dans une zone différente (même si c'est pas très long je l'admet).

                      -
                      Edité par Bibu54 23 décembre 2014 à 21:19:26

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Salut les zéros !
                        24 décembre 2014 à 9:53:25

                        oui désolé j'aurais du ouvrir un autre sujet pour parler de ça x) je t'ai completement volé le tien
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 décembre 2014 à 14:47:02

                          Nan nan pas de souci :) de toute façon c'est résolu !
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Salut les zéros !

                          Gérer le déplacement d'un personnage

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown