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.
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