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

2013/8/12

Einen Gegner erstellen

1
2
Gevater_Tod4711 Gevater_Tod4711

2013/8/13

#
Ob dein spieler ein bestimmtes Material berührt prüfst du am besten so:
public boolean touchingEndZone() {
    return getOneObjectAtOffset(0, 0, EndMaterial.class) != null;
}
Statt EndMaterial.class must du natürlich wieder den Klassennamen einsetzen den du verwendest. Um ein neues Level zu beginnen gibt es mehrere Möglichkeiten. Die einfachste ist glaube ich eine neue welt zu erstellen: Dazu brauchst du mehrere unterklassen von World (eine pro Level). Jede Welt entspricht dann einem Level. Das nächste Level beginnst du so:
//in deiner spieler Klasse;
public void act() {
    //...
    if (touchingEndZone()) {
        Greenfoot.setWorld(new Level2());
    }
}
Dieser code macht aber leider dass du nur nach level 2 wechseln kannst. Um in jedes Level zu wechseln wird es etwas komplizierter:
//in deiner spieler Klasse;
public void act() {
    //...
    if (touchingEndZone()) {
        if (getWorld() instanceof Level1) {//wenn du in level 1 bist ...;
            Greenfoot.setWorld(new Level2()); //... starte level 2;
        }
        else if (getWorld() instanceof Level2) { //wenn du in level 2 bist ...;
            Greenfoot.setWorld(new Level3()); //... starte level 3;
        }
        //viele, viele if anweisungen;
    }
}
Eine andere Möglichkeit ein neues Level zu starten (wenn man mehrere level verwendet ist diese warscheinlich doch einfacher): Deine Level construierst du mit methoden in deiner welt klasse (public void level1(), public void level2(), ...). Wenn du dann das end material erreichts startest du das neue level so:
public void act() {
    //...
    if (touchingEndZone()) {
        getWorld().startNextLevel();
    }
}
//in deiner welt Klasse;
private int levelNumber = 1;


public void startNextLevel() {
    removeAllObjects();
    switch (levelNumber) {
        case 1://level 1;
            startLevel2();
            levelNumber = 2;
            break;
        case 2://level 2;
            startLevel3();
            levelNumber = 3;
            break;
    }
}

public void removeAllObjects() {
    removeObjects(getObjects(null));
}
Busch2207 Busch2207

2013/8/13

#
Hey, Gevater_Tod4711! Deine Idee mit startNextLevel() in der welt-Klasse ist ganz gut, jedoch wird es beim Compilieren die Fehlermeldung 'cannot find symbol - method startNextLevel()' geben, wenn du 'getWorld().startNextLevel(); schreibst! Um dies zu umgehen müsste man entweder die getWorld()-Methode überschreiben: public welt getWorld() { return (welt)super.getWorld(); } Oder man schreibt: ((welt)getWorld()).startNextLevel();
ich99 ich99

2013/8/13

#
Okay, danke hat alles funktioniert :D
Gevater_Tod4711 Gevater_Tod4711

2013/8/13

#
@Busch2207 Ach ja stimmt. Die Casts vergesse ich immer weil ich meistens ne methode in ner superclass hab die das macht. Danke für den Hinweis.
8bitcarrotjuice 8bitcarrotjuice

2013/8/13

#
Thanks Tod, I now know to check what world your currently in, but wouldn't it be easier just making a field with a int called level and add 1 each time you reach the exit? Something like this:
public class Exit extends actor {
public int level=0;
public void act() {
     Actor player=getOneIntersectingActor(Player.class);
     if(player!=null) {
          level++;           
          getWorld().removeObjects(getWorld().getObjects(null)); 
          if(level==2) {
               //prefix of the level
          }
          if(level==3) {
              //...
          }
          //etc...
     }
}
The only thing with this code is that you have to have the initial first level in the world class, otherwise it works like charm, even though your code is probably better!
Gevater_Tod4711 Gevater_Tod4711

2013/8/13

#
You'll have to modify your code a bit if you want it to work like you said. The problem is that the Exit object is destroyed when your player reaches it ( line 7: getWorld().removeObjects(getWorld().getObjects(null));). So the variable level will be reseted every time you reach the end and so you'll never reach level 3 or higher. If you declare the variable level 'public static' instead of just 'public' it should work. But your right this should also work.
Kartoffelbrot Kartoffelbrot

2013/8/13

#
The best of programming is, that there are (nearly) always multiple ways!
You need to login to post a reply.
1
2