2011-07-27 2 views
0

J'apprends actuellement la programmation de jeux en utilisant un framework appelé libgdx. Il permet aux utilisateurs de créer des programmes qui peuvent facilement être exécutés à la fois sur une machine virtuelle Java sur le bureau et sur un téléphone mobile Android. J'essaie de créer un programme de base qui affichera un personnage à l'écran et me permettra de le déplacer d'avant en arrière avec le clavier. J'ai créé 3 classes - une appelée Assets, qui charge les fichiers dans la mémoire et les convertit en Textures et Animations, une appelée InputHandler, qui répond à l'entrée de la touche en changeant les animations, la direction du mouvement etc., et une appelée FightView, qui est essentiellement où tout le rendu se fait. Le InputHandler est appelé à partir de la classe FightView avec la commande typique input = new InputHandler(anim, frame);. Le constructeur de InputHandler ressemble à ceci:Android Game Dev - NullPointerException après avoir déclaré un nouvel objet (le constructeur ne fait pas ce que je veux qu'il fasse)

public InputHandler(Animation animation, TextureRegion region){ 

    Assets.load(); //loads textures from files into memory and creates animations from them 
    animation = Assets.playStance; //set initial animation to be used 
    region = animation.getKeyFrame(0, true); //make TextureRegion equal to first frame in animation 

} 

Maintenant, ce que je veux arriver est tout simplement que l'animation et TextureRegion passés dans le constructeur sont fixés aux valeurs indiquées ci-dessus, de sorte que, par exemple, si j'étais pour mentionner region dans la classe FightView après input avait été déclaré, il serait défini comme animation.getKeyFrame(0, true);. D'après mon expérience limitée de Java ce que je crois devrait se produire, mais je reçois un NullPointerException au moment de la compilation pointant vers la deuxième ligne dans le code ci-dessous:

input = new InputHandler(anim, frame); 
    x = centreX - (frame.getRegionWidth()/2); 

De toute évidence, frame est toujours nulle, même après avoir été passé à travers le constructeur, qui (comme on peut le voir dans la troisième ligne du constructeur) devrait lui assigner une valeur. Notez qu'avant d'être passés dans le constructeur, ils sont tous les deux null - j'essaye de créer une classe qui donnera les données des champs sans avoir besoin de le faire dans la classe FightView.

Toute aide appréciée. Cela pourrait être la mauvaise façon d'y parvenir - ce que j'essaie de faire est de créer un objet qui, lors de l'initialisation, chargera les données Animation et TextureRegion s.

Répondre

1

Le problème que vous rencontrez est dû à une mauvaise compréhension d'un concept Java de base. Java transmet les paramètres par valeur et non par référence. Ce que vous avez écrit ne fonctionnera jamais comme prévu. Tout d'abord, je vous recommande d'abord de vous attaquer à un problème plus simple ou de faire un détour pour renforcer certains des concepts et concepts d'objet Java de base. Deuxièmement, voici une brève réponse pour réaliser ce que vous désirez.

Ajoutez des membres à la classe InputHandler pour contenir une Animation et une TextureRegion. Dans le constructeur (qui ne prendrait aucun paramètre), vous attribueriez les valeurs comme vous l'avez fait, sauf que vous les attribueriez aux variables membres.

class InputHandler { 

    public Animation animation; 
    public TextureRegion region; 

    public InputHandler() { 

     Assets.load(); //loads textures from files into memory and creates animations from them 
     animation = Assets.playStance; //set initial animation to be used 
     region = animation.getKeyFrame(0, true); //make TextureRegion equal to first frame in animation 

    } 
} 

Après avoir construit la InputHandler vous pouvez faire référence à ses membres (cadre dans ce cas) et de voir vos valeurs correctes.

input = new InputHandler(); 
x = centreX - (input.frame.getRegionWidth()/2); 
+0

Merci pour l'aide, je l'ai fait ce que vous avez dit et maintenant le code ressemble à ceci: \t \t entrée = new InputHandler(); \t \t frame = entrée.frame; \t \t x = centreX - (frame.getRegionWidth()/2); J'ai aussi une méthode dans InputHandler appelée update() qui change les animations etc.quand un bouton est pressé. Aurai-je besoin d'écrire la ligne 'frame = input.frame' après avoir appelé cette méthode pour effectuer ces changements? – semiserious

Questions connexes