This site requires JavaScript, please enable it in your browser!
Greenfoot back
ich99
ich99 wrote ...

2013/8/12

Einen Gegner erstellen

1
2
ich99 ich99

2013/8/12

#
hey Leute, ich habe mir greenfoot erst kürzlich zugelegt, und habe auch schon ein Spiel erstellt wo man eine Figur durch ein Labyrint steuern muss, doch bis jetzt sind noch keine Gegner vorhanden und so wollte ich hier Fragen wie man einen gegner erstellt, der zufällig im Labyrint rumläuft und nicht durch wände gehen kann. Ausserdem sollte mein Spieler "Sterben", also verschwinden wenn er vom gegner berührt wird. Vielen Dank im Vorraus!
Gevater_Tod4711 Gevater_Tod4711

2013/8/12

#
Eigentlich ist diese seite englisch daher solltest du versuchen deine fragen auf englisch zu stellen. Aber was solls. Um gegner zu erstellen musst du zuerst eine neue classe erstellen die subclass von Actor ist. Um die gegner in eine zufällige richtung laufen zu lassen solltest du Greenfoot.getRandomNumber(int) verwenden. Diese methode liefert eine zufallszahl zwichen 0 und der angegebenen zahl. Beispielsweise liefert Greenfoot.getRandomNumber(5) eine zufallszahl von 0 bis 4 (inclusive). Damit deine Gegner nicht durch Wände laufen können müssen diese erkennen ob ihnen Wände im weg sind. Dazu solltest du die methode getOneObjectsAtOffset(int, int, Class) verwenden. Beispielsweise wenn du prüfen willst ob links von deinem Gegner eine Wand ist kannst du diese methode verwenden:
public boolean wandRechts() {
    return getOneObjectAtOffset(1, 0, Wand.class) != null;
}

//für links, oben und unten musst du nur die werte verändern:
public boolean wandLinks() {
    return getOneObjectAtOffset(-1, 0, Wand.class) != null;
}

public boolean wandOben() {
    return getOneObjectAtOffset(0, -1, Wand.class) != null;
}

public boolean wandUnten() {
    return getOneObjectAtOffset(0, 1, Wand.class) != null;
}
Die methoden verwendest du dann etwa so:
public void act() {
    if (wandRechts()) {
        //der Gegner darf nicht nach rechts laufen da dort eine Wand ist.
    }
}
Um deinen Gegnern beizubringen deinen spieler zu entfernen wenn sie ihn kriegen kannst du diese methode verwenden:
public void act() {
    entferneSpieler();
    //...
    //die restlichen methoden in act;
}

public void entferneSpieler() {
    Actor actor = getOneObjectAtOffset(0, 0, Spieler.class);
    if (actor != null) {
        getWorld().removeObject(actor);
    }
}
Wenn deine Klassen anders heißen (also nicht Wand und Spieler musst du das natürlich ändern. also nicht Spieler.class sondern den richtigen Klassennamen + .class).
ich99 ich99

2013/8/12

#
Also, ich habe jetzt eine subclass von Actor gemacht die "enemy" heißt, und habe folgendes hinein geschrieben: public void act() { laufen(); } public void laufen() { Greenfoot.getRandomNumber(5); } } doch wenn ich nun den gegner in dei Welt plaziere bewegt er sich nicht. Danke für eure Hilfe
Kartoffelbrot Kartoffelbrot

2013/8/12

#
Wie groß sind denn deine Zellen (der dritte Wert im super-Befehl im Konstruktor der Welt) und die Wände? Wenn du große Zellen hast mit einer Wand pro Zelle ist das ganze nämlich erheblich einfacher.
ich99 ich99

2013/8/12

#
Also der dritte wert ist 50, und ich habe Wände von 50x50 pixeln, die passen genau in so ein Kästchen rein, mein spieler und der gegner sind auch 50x50 pixel
Kartoffelbrot Kartoffelbrot

2013/8/12

#
Dann kannst du genau das machen, was der Tod schon zu dir gesagt hat. Die Zufallsbewegung könnte ungefähr so aussehen:
    public void zufaelligBewegen(){
        int richtung = Greenfoot.getRandomNumber(4);//wie GevaterTod schon gesagt hat
        if(richtung==0&&!wandRechts())
            setLocation(getX()+1,getY());
        else if(richtung==0&&!wandLinks())
            setLocation(getX()-1,getY());
        else if(richtung==0&&!wandUnten())
            setLocation(getX(),getY()+1);
        else if(richtung==0&&!wandOben())
            setLocation(getX(),getY()-1);
    }
Gevater_Tod4711 Gevater_Tod4711

2013/8/12

#
Nur Greenfoot.getRandomNumber(5) hilft leider nicht weiter. Das ist einfach eine zufallszahl. Versuchs mal damit:
public void laufen() {
    if (!(wandRechts() && wandLinks() && wandOben() && wandUnten())) {
        boolean gegnerBewegt = false;
        int random;
        while (!gegnerBewegt) {
            random = Greenfoot.getRandomNumber(4);
            if (random == 0) {
                if (!wandRechts()) {
                    setLocation(getX() + 1, getY());
                    gegnerBewegt = true;
                }
            }
            else if (random == 1) {
                if (!wandLinks()) {
                    setLocation(getX() - 1, getY());
                    gegnerBewegt = true;
                }
            }
            else if (random == 2) {
                if (!wandOben()) {
                    setLocation(getX(), getY() - 1);
                    gegnerBewegt = true;
                }
            }
            else if (random == 3) {
                if (!wandUnten()) {
                    setLocation(getX(), getY() + 1);
                    gegnerBewegt = true;
                }
            }
        }
    }
}
Damit sollte sich dein Gegner bewegen.
Kartoffelbrot Kartoffelbrot

2013/8/12

#
Greenfoot.getRandomNumber(x) zieht eine zufällige Zahl. Das Objekt bewegt sich noch nicht. Du solltest mal in Greenfoot auf Actor doppelklicken und dir die Methoden durchlesen, die (vor Allem!) Actor und die ganzen anderen Greenfootklassen haben. Das sind 6 oder so. Du musst die nicht auswändig können. Aber manche zu wissen ist schon enorm hilfreich.
Kartoffelbrot Kartoffelbrot

2013/8/12

#
Tods ist etwas besser, bei meiner Methode kann es nämlich passieren, dass sich deine Gegner auch mal nicht bewegen, weil sie nach rechts laufen wollen und nicht können. Bei Tod ist gewährleistet, dass sie sich (solange sie nicht von Wänden umschlossen sind) immer bewegen.
Gevater_Tod4711 Gevater_Tod4711

2013/8/12

#
Das stimmt wohl. Davon sollte man einige kennen. Die anderen (also außer Actor und World) findest du hier.
Kartoffelbrot Kartoffelbrot

2013/8/13

#
Ach und bei meinem Code ist auch noch ein Fehler. Dort steht überall if(richtung==0). Allerdings müsste es so aussehen:
    public void zufaelligBewegen(){  
        int richtung = Greenfoot.getRandomNumber(4);//wie GevaterTod schon gesagt hat  
        if(richtung==0&&!wandRechts())  
            setLocation(getX()+1,getY());  
        else if(richtung==1&&!wandLinks())  
            setLocation(getX()-1,getY());  
        else if(richtung==2&&!wandUnten())  
            setLocation(getX(),getY()+1);  
        else if(richtung==3&&!wandOben())  
            setLocation(getX(),getY()-1);  
    }  
Sonst wuerde er sich ja nur bewegen, wenn richtung = 0 ist, und dann auch nur nach rechts.
ich99 ich99

2013/8/13

#
Ich hab jetzt den Code von Gevater_Tod genommen, doch ich habe noch ein Problem, und zwar steht ja dort immer "wandRechts", "wandLinks" und so weiter, doch wenn ich jetzt auf compile klicke sthet dort : "can not find symbol - method wandRechts". Mir ist klar dass ich jetzt irgendwo vermerken muss was wandRechts und so sind, doch ich weiß nicht wo. wenn ihr mir da helfen könntet wäre das wirklich nett!
Gevater_Tod4711 Gevater_Tod4711

2013/8/13

#
wandRechts, wandLinks usw. sind einfach methoden wie auch die act methode. Die schreibst du genau wie die act methode einfach irgentwo in deine Klasse rein. Die methoden sollten so aussehen:
    public boolean wandRechts() {  
        return getOneObjectAtOffset(1, 0, Wand.class) != null;  
    }  
      
    //für links, oben und unten musst du nur die werte verändern:  
    public boolean wandLinks() {  
        return getOneObjectAtOffset(-1, 0, Wand.class) != null;  
    }  
      
    public boolean wandOben() {  
        return getOneObjectAtOffset(0, -1, Wand.class) != null;  
    }  
      
    public boolean wandUnten() {  
        return getOneObjectAtOffset(0, 1, Wand.class) != null;  
    }  
ich99 ich99

2013/8/13

#
Danke! Endlich hat es Funktioniert!
ich99 ich99

2013/8/13

#
Doch eine Frage hätte ich noch, wie kann man machen , dass wenn man ein bestimmtes "Material" berührt , man in ein Anderes level, also in eine andere "welt" kommt?
There are more replies on the next page.
1
2