Objekt der Klasse A in der Klasse B verwenden und manipulieren

HiTTi

Mitglied
Hallo zusammen,

ich möchte gerne auf einer Engine ein kleinen und einfaches Minigame schreiben. Dies ist auch soweit fertig, bis auf die "Go" Aktion. Meine Go Akiton soll eine Art Angelhaken werden der beim Überlappen von Sprites Punkte gibt.

Nun habe ich in Klasse A meine Sprites angelegt.
Java:
public class MyMiniGame extends MiniGame
{
    
     
    protected boolean overlap= false;
    
    
    private int goaktions;
    
    private Boolean currentGamerP = false;
    private Boolean currentGamerG = false;
    
    private int gscore;
    
    public int getGscore() {
        return gscore;
    }


    public void setGscore(int gscore) {
        this.gscore = gscore;
    }


    
    
    private int pscore;
    
    public int getPscore() {
        return pscore;
    }


    public void setPscore(int pscore) {
        this.pscore = pscore;
    }
    
    MyFish hai    = new MyFish(100,100,this);
    MyFish fisch1 = new MyFish(100, 100, this);
    
    MyFish fisch2 = new MyFish(100, 100, this);
    MyFish fisch3 = new MyFish(100, 100, this);
    Sprite steg = new Sprite(650, 250, this);
    
    
    
    
    Sprite fischfilet = new Sprite(50, 50, this);
    MyFishman gamer = new MyFishman(100, 100, this);
    MyFishman pc = new MyFishman(100, 100, this);

Ich habe mir dann für alle wichtigen Variablen wie dem Playerscore und ComputerScore getter und Setter geschrieben. Sowie ein Boolean für die Flag, welche gesetzt wird, wenn der eine oder andere Spieler gerade die Go Aktion aufruft.

Meine Klasse B verarbeitet dann die Go Aktionen und dort habe ich auch die Hakensprite angelegt.
Java:
public abstract class MySprite extends Sprite {

    public MySprite(int size_x, int size_y, MiniGame theGame) {
        super(size_x, size_y, theGame);
        MySprite.mg = theGame;
        
    }
    
    protected static final int BASE_SPEED = 200;
    protected int speedFactor = 1;
    static MiniGame mg;
    static MyMiniGame mmg;
    
    int pscore,gscore;
    
    Sprite haken = new Sprite(45,400, mg);
    Timer timer = new Timer();
    
    
    public void actionPerformed(Action action) {

        
        int speed = BASE_SPEED * speedFactor;
        switch (action) {
        case UP:
            animate(0, -speed);
            
            break;
        case DOWN:
            animate(0, speed);
            
            break;
        case LEFT:
            animate(-speed, 0);
            
            break;
        case RIGHT:
            animate(speed, 0);
            
            break;
        case GO:
            haken.paintImage("haken.png");
            haken.setPosition(getXPosition() ,getYPosition()-haken.getHeight());
            
            timer.schedule(new TimerTask() {
                  @Override
                  public void run() {
                    haken.dontShow();
                  }
                }, 200);
            
            // Abfrage wenn Fisch getroffen wird
            if(haken.overlapsSprite(mmg.getFisch1())||haken.overlapsSprite(mmg.getFisch2())||haken.overlapsSprite(mmg.getFisch3())){
                gscore= mmg.getGscore();
                pscore= mmg.getPscore();
                if(mmg.getCurrentGamerG()==true)
                {
                    gscore++;
                    mmg.setGscore(gscore);
                }
                if( mmg.getCurrentGamerP()==true)
                {
                    pscore++;
                    mmg.setGscore(pscore);
                }
                
            }
            
            
            
            
            break;
        default:
            break;
        }
    }
}
Das Problem ist, bis jetzt bekomme ich zwar die Hakensprite immer kurz angezeigt aber es gibt auch eine java.lang.NullPointerExecption.
Zudem weiß ich nicht richtig, wie ich das Verfahren anspassen soll.
Die Schwierigkeit liegt bei mir darin, wie weiß ich, welcher Spieler gerade die Go Aktion ausführt und wie kann ich auf die Objekte der Klasse A zugreifen und in Klasse B mit verarbeiten. Denn der Haken soll einen Fisch treffen und dann 5 Punkte auf den jeweiligen Score addieren.

Ich hoffe ich hab es einigermaßen verständlich erklärt.

Mein Versuch war es mit einer Referenz auf die Klasse und Settern/Gettern auf die benötigten Objekte/Variablen
zuzugreifen.
Es wird wohl ein anderer Weg benötigt.

Hoffentlich kann mir einer von euch helfen 🙂

Schönen Sonntagabend,
HiTTi
 
Wenn irgendwo eine Exception fliegt, poste bitte den stack trace und den Code, der sie hervorruft.
Ehrlich gesagt, kann ich deinen Äußerungen so nur schwer folgen.
 
Hallo Harry Kane,

Danke für deine Antwort.

Leider kann ich nur die Exception posten
2015-06-22 09:02:44 ERROR [Timer-0] MiniGame:583 - java.lang.NullPointerException
Ich komme an die MiniGame nicht ran.

Die Engine habe ich importiert und dann meine Klassen erstellt. Es läuft ja auch alles.
Ich habe halt nur bei dem letzten kleinen Teil Problemen, weil ich von meiner Klasse A nicht auf ein Objekt der Klasse B zugreifen kann.

Das ist ein Auszug aus meiner Klasse B(MySprite):
Java:
public abstract class MySprite extends Sprite {

    public MySprite(int size_x, int size_y, MiniGame theGame) {
        super(size_x, size_y, theGame);
        MySprite.mg = theGame;
        
    }
    
    protected static final int BASE_SPEED = 200;
    protected int speedFactor = 1;
    static MiniGame mg;
    
    
    
    
    Sprite haken = new Sprite(45,400, mg);
    public Sprite getHaken() {
        return haken;
    }


    public void setHaken(Sprite haken) {
        this.haken = haken;
    }

Auf dieses Sprite Haken muss ich in der Klasse A (MyMiniGame) zugreifen und versuche dies in Klasse A über static MySprite ms;

Dann wollte ich den Haken über ms.haken in der Klasse A weiter bearbeiten. Z.B welche Aktion beim Überlappen mit anderen Sprites passieren.

Ich hoffe es ist etwas deutlicher geworden.

LG HiTTi
 
MyMiniGame hat kein static MySprite ms.
In MyMiniGame legst du ja verschiedenen Sprites an. Warum nicht auch einen für den Haken? Und warum sollte der Haken-Sprite wie von dir angedeutet, static sein?
 
In der Klasse MySprites verarbeite ich die Aktionen, welche der Computer und der Spieler machen. Dort brauche ich dann bei der Go Aktion die Haken Sprite. Ich könnte natürlich die haken Sprite auch in MyMiniGame anlegen, dann hätte ich aber das selbe Problem, dass ich dann in der anderen Klasse auf das Hakensprite zugreifen muss. Denn bei Go soll er den Haken ja zeichnen. Evtl. habe ich Static noch nicht richtig verstanden, aber ich wollte damit erreichen, dass es keine NullPointer Exception gibt. Denn das Objekt auf welches ich in MyMiniGame zugreifen will, muss ja bereits erstellt worden sein, sonst gibt es ja kein Objekt auf welches ich zugreifen kann.
 
In deiner MySprite-Klasse hast du 2 statische Variablen mg und mmg. mmg wird soweit ich das sehen kann, nie initialisiert (das würde ich ändern), mg nur wenn der Konstruktor von MySprite aufgerufen wird. Da MySprite Sprite erweitert und du einige Sprite-Objekte anlegst, ist davon auszugehen, dass mg initialisiert ist.
Die Variable Haken von MySprite wird möglicherwiese bereits initialisiert, bevor mg initialisiert ist, und bekommt deshalb einen NullPointer.
Ausserdem vestehe ich nach wie deine grundlegende Programmlogik nicht. Es gibt eine nicht-abstrakte Klasse Sprite, die du mit einer abstrakten Klasse MySprites erweiterst. Das kommt mir schon komisch vor.
Ausserdem verstehe ich nicht, wieso du die Aktionen in MySprites verarbeiten willst und nicht in MyMiniGame. Ganz grob würde ich mir den Aufbau ungefähr so vorstellen:
1. MyMiniGame hält Referenzen auf alle Sprites.
2. MyMiniGame ist für die Ereignisverwaltung zuständig und implementiert dazu die actionPerformed-methode die aktuell noch in MySprite liegt.
3. Bei einer entsprechenden Aktion manipuliert oder untersucht MyMiniGame die passen Sprites, d. h. zeigt/versteckt den Haken oder überprüft, ob die Koordinaten des Hakens mit den Koordinaten eines Fisches übereinstimmen.
 
Hallo Harry Kane,

ok, das probiere ich mal. MySprite habe ich nur angelegt um etwas übersichtlicher arbeiten zukönnen. Ich werde mal alles in die MyMiniGame integrieren und dann nochmal testen. Dann sollte es ja funktionieren.

Danke nochmal!
 

Zurück
Oben