Nicht-statische Methode in einer statischen aufrufen

Akkulader

Mitglied
Moinmoin

wir programmieren in der Uni mit Greenfoot und mein Ziel ist es heute einen Highscore zu bauen.

Ich habe also eine Klasse Score in der es die Methode
Java:
 public int scoreZaehlen()
gibt.
Die Methode ist einzig dafür da, um den Score immer um 1 zu erhöhen.

Nun möchte ich diese Methode in einer Methode einer anderen Klasse aufrufen nämlich:
Klasse = Gift.class
Methode:
Java:
 public  void collision ()

Wenn ich nun die Methode in collision() per
Java:
 Score.scoreZaehlen();
aufrufen will meckert Greenfoot ("non-static method scoreZaehlen() cannot be referenced from a static context").


Wie krieg ich das nun hin, dass ich den nicht-statischen Inhalt in einem statischen aufrufen kann?



Ich wär euch wirklich sehr dankbar für jegliche Hilfe!!🙂
 
nicht statische Methoden, also Instanzmethoden können nur ein einer Instanz aufgerufen - nicht verwunderlich ;-)
Irgendwo muss also ein Score Objekt existieren/erzeugt werden und man muss an der entsprechenden Stelle im Code Zugriff auf das Objekt haben.
 
Ja, leider lernen wir nicht so die Basis von Java, sondern sollen alles gleich anwenden.
Wusste bis grade z.B. nicht, dass nicht statische Methoden Instanzmethoden sind : /


Hab das jetzt zumindest compiliert bekommen, jedoch krieg ich ne NullPointerException wenn das ausgeführt werden soll

Public Gift ist der Konstruktor der Klasse Gift
Java:
public Score score;
    
    public Gift()
    {
        this.score=score;
    }

Dann später:
Java:
 public  void collision (){
....
score.scoreZaehlen();
...
}
 
Ist doch gut.
Theorie ist meistens langweilig und imho lernt man so auch viel besser. Wenn man etwas nicht braucht vergisst man es gleich wieder.

Java:
this.score=score;

Das schreibt die Variable score in die Variable score. Das ist nicht falsch, nur bringt es nichts.

Java:
this.score = new Score();

Ich glaube das meintest du.
 
Joa ist eig spannend. Aber leider lernt man die Grundlagen einfach nicht. Wir sind mittlerweile bei der 5. Übung und bis jetzt haben wir alles nur durch try&error gelernt. Da fehlen einfach die Grundlagen.


Es gibt bei
Java:
 this.score= new Score();
zumindest keinen NullPointer aber dennoch passiert einfach nichts.

Hier mal meine scoreZaehlen Methode:
Java:
 public int scoreZaehlen()
    {
        
        //if(Greenfoot.isKeyDown("t"))
        //{
            
score = score + 1;
            return score;
            
        //}
       
        
    }

Das // wird nicht ausgeführt. Die Methode funktioniert allerdings, wenn ich das // wegmach und im Spiel dann T drücke.. iwo muss es am Methodenaufruf hapern..🙁
 
Ich bezweifel, dass die Methode ohne Kommentaren funktionieren wird. Da müsste dir ein Error fliegen, sofern sich Greenfoot an den original Syntax hält.

Müsste richtig arbeiten, falls collision funktioniert.
Füg einfach ein paar System.out.printlns oder einen entsprechenden pendant hinzu, um den Programmfluss im Auge zu behalten.
 
Also wenn ich nur
Java:
 public int scoreZaehlen()
    {
       
            score = score + 1;
            return score;
    }
schreibe und diese Methode in der act()-Methode (die immer ausgeführt wird) abrufe, dann zählt er kontinuierlich hoch.
Mit der if-Bedingung halt nur wenn ich T Drücke.

Das einzige was ich mir vorstellen könnte wäre, dass ich die scoreZaehlen() Methode in der act() aufrufen muss, auch wenn ich die if-Bedingung nicht einfüge.
Dann bestünde aber das Problem, wie ich scoreZaehlen() nur Aufrufen lasse, wenn es aus der anderen Klasse gewünscht ist (und nicht immer).
 
Du prüfst ob das Ereignis, dass Punkte gibt zutrifft und rufst dann erst auf? ???:L
Wenn du immer aufrufst gibt es auch immer Punkte.

Ja ich möchte, dass nur gezählt wird, wenn mein Held gegen das eine Instanz aus Gift.class läuft



Ich KANN folgendes machen:
Java:
public void act()
{
   scoreZaehlen();
   scoreAnzeigen();
}

public int scoreZaehlen()
    {
        
        if(Greenfoot.isKeyDown("t"))
        {
            
            score = score + 1;
            return score;
            
        }
       
        
    }
Dann wird immer hochgezählt, wenn ich T drücke.


Wenn ich folgendes mache, dass addiert der IMMER.
Java:
public void act()
{
   scoreZaehlen();
   scoreAnzeigen();
}



public int scoreZaehlen()
    {
                 
            score = score + 1;
            return score;    
        
    }


Ich WILL sozusagen das:
Java:
public void act()
{
   
   scoreAnzeigen();
}



public int scoreZaehlen()
    {
                 
            score = score + 1;
            return score;    
        
    }
Denn damit könnte ich theoretisch aus einer anderen Klasse heraus auf scoreZaehlen() zugreifen.
Das geht ja aber leider nicht 🙁
Deshalb dachte ich, dass das Problem daher rühren könnte, dass scoreZaehlen(); nicht mehr in der act()-Methode stehen würde. Das darf dort aber nicht stehen, da es wie gesagt IMMER aufgerufen würde.
 
Mal ne andere Frage:

Wenn ich per
Java:
 public int scoreZaehlen()
    {
            
            score = score + 1;
            return score;
     }
den score erhöhe.



Wie kann ich ihn dann ausdrucken?
Folgendes gibt nur den alten Scorewert aus.
Java:
 public void scoreSetzen()
    {
        
       
            GreenfootImage scoreImg = new GreenfootImage (300,200);
            setImage(scoreImg);
            getImage().setColor(new Color(172, 220, 230));
            getImage().setFont(new Font ("Serif", Font.BOLD, 30));
            getImage().drawString("Score: "+score, 100, 100);
            
        
    }

Gibt es eine Möglichkeit getImage().drawString("Score: "+score, 100, 100); so zu verändern, dass da
("Score: "+ [returnter]score, 100, 100) steht?

Wär richtig toll wenn mir geholfen werden könnte 😀
 

Zurück
Oben