Frage von GreenCinco12, 10

Greenfoot mehrere Player Steuern?

Anfänger Incoming

Habe in Greenfoot 3 verschiedene Actors mit den gleichem Code

Spieler 1 bewegt sich mit Pfeiltasten

Spieler 2 mit WASD

und Spieler 3 mit 8462

Wenn ich nur Spieler 1 auf dem Feld habe bewegt er sich mit den Pfeiltasten. Wenn ich Spieler 1 und 2 auf dem Feld habe bewegt sich nur Spieler 2 mit WASD, aber Spieler 1 weder mit den Pfeiltasten noch mit anderen Tasten. Und wenn ich alle 3 Spieler auf dem Feld habe dann kann sich nur Spieler 3 bewegen, mit 8462, und Spieler 1 und 2 bewegen sich garnicht mehr.

Kann man irgendwie machen dass sich alle bewegen wenn alle gleichzeitig auf dem Spielfeld sind?

    public void TastaturSteuerungPfeiltasten() 
{
    if (Greenfoot.isKeyDown("right"))
    {
        fahre("rechts");
    }
    if (Greenfoot.isKeyDown("left"))
    {
        fahre("links");
    }
    if (Greenfoot.isKeyDown("up"))
    {
        fahre("hoch");
    }
    if (Greenfoot.isKeyDown("down"))
    {
        fahre("runter");
    }
}       

den ganzen Code kann man nicht einfügen, ist zu lang. Hab also nur die Steuerung gepostet. Die ist bei allen gleich nur halt durch WASD oder 8462 ausgetauscht und umbenannt (also von TastaturSteuerungPfeiltasten zu TastaturSteuerungWASD) Falls mit also einer helfen könnte ^^

Bitte nur Leute die Ideen zum genannten Problem haben antworten.

Danke im Vorraus.

Antwort
von regex9, 7

Zeige bitte einmal den Part, wo du die jeweiligen Methoden aufrufst.

Kommentar von GreenCinco12 ,
import greenfoot.*;

import java.awt.Color;

/**
* Write a description of class Mensch here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Spieler1 extends Spieler
{
private Display anzeige;
class Display extends Actor
{
GreenfootImage bild;

public Display()
{
bild = getImage();
}

public void act()
{

}

public void anzeigen(String pText)
{
loeschen();
bild = new GreenfootImage(pText, 30, null, null);
getImage().drawImage(bild, 8,0);

}

public void loeschen()
{
getImage().clear();
setImage("images/nachricht.png");
}

}
/**
* Act - do whatever the Mensch wants to do. This method is called whenever
* the 'Act' or 'Run' button gets pressed in the environment.
*/
public void act()
{
while (true)
{
Fressen();
}
}
private int addScore = 1;
private int score = 1;

public void setScore(int addScore)
{
score = score + addScore;
}
public int getScore()
{
return score;
}

public void Fressen()
{
TastaturSteuerungPfeiltasten();
Actor Frosch;
getScore();
Frosch = getOneObjectAtOffset(0,0, Frosch.class);
if (Frosch != null)
{
getScore();
//System.out.println("Spieler1 got " + getScore() + " Frog");

if (score == 1)
{
System.out.println("Spieler1 got " + getScore() + " Frog");
}
else
{
System.out.println("Spieler1 got " + getScore() + " Frogs");
}
}
}
public void TastaturSteuerungPfeiltasten()
{
if (Greenfoot.isKeyDown("right"))
{
fahre("rechts");
}
if (Greenfoot.isKeyDown("left"))
{
fahre("links");
}
if (Greenfoot.isKeyDown("up"))
{
fahre("hoch");
}
if (Greenfoot.isKeyDown("down"))
{
fahre("runter");
}
}
public void fahre(String richtung)
{
if(richtung=="rechts")
{
setRotation(getRotation()+0);
fahre();
}
else if (richtung=="links")
{
setRotation(getRotation()-180);
fahre();
setRotation(getRotation()+180);
}
else if (richtung=="hoch")
{
setRotation(getRotation()-90);
fahre();
setRotation(getRotation()+90);
}
else if (richtung=="runter")
{
setRotation(getRotation()+90);
fahre();
setRotation(getRotation()-90);
}
else
{
nachricht("Befehl nicht korrekt!");
}
}

//public void schreibeText(String meinText);
//{
// GreenfootImage image = getImage();
// image.clear();
// image.setColor(Color.BLACK);
// image.drawString(meinText, 10, 10);
//}

/**
* Der Rover dreht sich um 90 Grad in die Richtung, die mit richtung („links“ oder „rechts“) übergeben wurde.
* Sollte ein anderer Text (String) als "rechts" oder "links" übergeben werden, dann erscheint eine entsprechende Meldung auf dem Display.
*/
public void drehe(String richtung)
{
if(richtung=="rechts")
{
setRotation(getRotation()+90);
}
else if (richtung=="links")
{
setRotation(getRotation()-90);
}
else
{
nachricht("Befehl nicht korrekt!");
}
}
private void nachricht(String pText)
{
if(anzeige!=null)
{
anzeige.anzeigen(pText);
Greenfoot.delay(1);
anzeige.loeschen();
}
}

/**
* Der Rover bewegt sich ein Feld in Fahrtrichtung weiter.
* Sollte sich in Fahrtrichtung ein Objekt der Klasse Huegel befinden oder er sich an der Grenze der Welt befinden,
* dann erscheint eine entsprechende Meldung auf dem Display.
*/
public void fahre()
{
int posX = getX();
int posY = getY();

if(huegelVorhanden("vorne"))
{
nachricht("Zu steil!");
}
else if(getRotation()==270 && getY()==1)
{
nachricht("Ich kann mich nicht bewegen");
}
else
{
move(1);
Greenfoot.delay(1);
}

if(posX==getX()&&posY==getY()&&!huegelVorhanden("vorne"))
{
nachricht("Ich kann mich nicht bewegen");
}
}
/**
* Der Rover überprüft, ob sich in richtung ("rechts", "links", oder "vorne") ein Objekt der Klasse Huegel befindet.
* Das Ergebnis wird auf dem Display angezeigt.
* Sollte ein anderer Text (String) als "rechts", "links" oder "vorne" übergeben werden, dann erscheint eine entsprechende Meldung auf dem Display.
*/
public boolean huegelVorhanden(String richtung)
{
int rot = getRotation();

if (richtung=="vorne" && rot==0 || richtung=="rechts" && rot==270 || richtung=="links" && rot==90)
{
if(getOneObjectAtOffset(1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(1,0,Huegel.class)).getSteigung() >30)
{
return true;
}
}

if (richtung=="vorne" && rot==180 || richtung=="rechts" && rot==90 || richtung=="links" && rot==270)
{
if(getOneObjectAtOffset(-1,0,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(-1,0,Huegel.class)).getSteigung() >30)
{
return true;
}
}

if (richtung=="vorne" && rot==90 || richtung=="rechts" && rot==0 || richtung=="links" && rot==180)
{
if(getOneObjectAtOffset(0,1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,1,Huegel.class)).getSteigung() >30)
{
return true;
}

}

if (richtung=="vorne" && rot==270 || richtung=="rechts" && rot==180 || richtung=="links" && rot==0)
{
if(getOneObjectAtOffset(0,-1,Huegel.class)!=null && ((Huegel)getOneObjectAtOffset(0,-1,Huegel.class)).getSteigung() >30)
{
return true;
}

}

if(richtung!="vorne" && richtung!="links" && richtung!="rechts")
{
nachricht("Befehl nicht korrekt!");
}

return false;
}
//public void hinten()
//{
// drehe("rechts");
// drehe("rechts");
// fahre();
// drehe("rechts");
// drehe("rechts");
// }
}
Kommentar von GreenCinco12 ,

War mir nicht sicher welche Methode ^^ Hab aber geschafft gerade so den ganzen Code einzufügen. Ist jetzt der Code aus einem der 3 Spieler, sind aber alle gleich aufgebaut, nur wie gesagt Spieler1 durch Spieler2/3 ausgetauscht und die Tastensteuerung geändert.


Manche Methoden sind aus einem vorgefertigtem Programm aus der Schule wie z.b huegelVorhanden(), fahre(), und drehe()


Hab manche, wie fahre(), dann auf meine bedürfnisse mit dem fahre(Richtung) angepasst.

Kommentar von regex9 ,

Hmn, nein, ich würde gern die Methode sehen, wo deine Spieler erstellt werden und möglicherweise auch die draw-Schleife, in der die Elemente gerendert werden. Poste das via http://pastebin.com/.

Ein paar Tipps zu deinem bisherigen Code:

  • Entscheide dich für eine Sprache: Englisch oder Deutsch.
  • Die Klasse Display muss bestimmt keine innere Klasse sein.
  • Fasse zwischen deinen Spielerklassen zusammen. Gemeinsamkeiten können in der Basisklasse Spieler definiert werden. Da die Basisklasse sicherlich nie instanziert wird, kann sie als abstract definiert werden.
  • TastaturSteuerungsPfeiltasten kann in der Basisklasse als abstract method deklariert werden. Die Subklassen müssen diese Methode dann explizit überschreiben.
  • Nutze mehrzeilige Kommentare /* ... */ für größere Kommentarblöcke.
  • Nutze ein Enum für die jeweiligen Richtungen.
  • Müssen alle Methoden nach außen hin sichtbar sein? Ordne die Methoden innerhalb der Klasse nach Sichtbarkeit. Sichtbare Inhalte oben, geschützte Inhalte unten.

  • Einen möglichen Ansatz kannst du hier sehen:  http://pastebin.com/WzNuVM9P

Keine passende Antwort gefunden?

Fragen Sie die Community