Greenfoot - Objekt im Vordergrund lassen, bei einer scrollbaren Welt ohne zentrierten Actor

andynbg9000

Neues Mitglied
Hallo Leute,

wir sind gerade dabei, für eine Projektarbeit in der Schule, ein Spiel mithilfe von Greenfoot zu programmieren, jedoch haben wir nun ein riesen Problem.

Die Spielidee ist relativ einfach. Wir wollen einen Menschen (verkörpert den Spieler) in einer zufällig generierten Wüste spawnen lassen. Er muss die nächste Stadt, welche auf der Karte ebenfalls zufällig generiert wird, finden.
Nun habe ich ein Problem damit, Objekte im Vordergrund zu fixieren d.h sie sollen sich nicht bewegen. Egal was der der Actor macht, diese Objekte sollen immer an der selben Stelle auf dem Bildschirm zu sehen sein. In Moment ist damit eine Health Bar gemeint.
Bei einem „Central Actor Scrolling System“, stellt man die Objekte mit dem Actor gleich, da man den Actor immer zentriert sieht (sich immer an derselben Stelle befindet).
Jedoch benutze ich ein „Follow Actor Scrolling System“ aus dem Multi Scroll Engine von „Gevater_Tod4711“, welches er auf die Greenfoot Seite hochgeladen hat. Hier kann der Actor bis zu einer gewissen Grenze, frei im Feld herumlaufen. Erst wenn er diese Grenze berührt wird die Welt gescrollt. Somit ist der Actor nicht fixiert, sondern bis zu dieser Grenze frei bewegbar = Objekt kann nicht mit Actor gleichgestellt werden.
Hier findet ihr das Projekt: Greenfoot | Multi Scrolling Engine

Ich denke mal, dass das das ScrollSystem ist:
Java:
protected final void followActor() {
        if (followingActor != null) {
            if (followingActor.getWorld() == null) {
                followingActor = null;
                return;
            }
            int scrollingX = 0;
            int scrollingY = 0;
            if (scrollingSystem == CENTRAL_ACTOR_SCROLLING_SYSTEM) {
                scrollingX = getWidth()/2 - followingActor.getX();
                scrollingY = getHeight()/2 - followingActor.getY();
            }
            else {
                if (followingActor.getX() > getWidth() - scrollingActorSideDistance) {
                    scrollingX = -(followingActor.getX() - (getWidth() - scrollingActorSideDistance));
                }
                else if (followingActor.getX() < scrollingActorSideDistance) {
                    scrollingX = scrollingActorSideDistance - followingActor.getX();
                }
                if (followingActor.getY() > getHeight() - scrollingActorSideDistance) {
                    scrollingY = -(followingActor.getY() - (getHeight() - scrollingActorSideDistance));
                }
                else if (followingActor.getY() < scrollingActorSideDistance) {
                    scrollingY = scrollingActorSideDistance - followingActor.getY();
                }
            }
            if (scrollingX != 0 || scrollingY != 0) {
                totalXMovement += scrollingX;
                totalYMovement += scrollingY;
                if (WORLD_WIDTH != 0) {
                    if (totalXMovement > WORLD_WIDTH/2) {
                        followingActor.setLocation(followingActor.getX() - (totalXMovement - WORLD_WIDTH/2), followingActor.getY());
                        scrollingX -= (totalXMovement - WORLD_WIDTH/2);
                        totalXMovement = WORLD_WIDTH/2;
                    }
                    else if (totalXMovement < -WORLD_WIDTH/2) {
                        followingActor.setLocation(followingActor.getX() - (totalXMovement + WORLD_WIDTH/2), followingActor.getY());
                        scrollingX -= (totalXMovement + WORLD_WIDTH/2);
                        totalXMovement = -WORLD_WIDTH/2;
                    }
                }
                if (WORLD_HEIGHT != 0) {
                    if (totalYMovement > WORLD_HEIGHT/2) {
                        followingActor.setLocation(followingActor.getX(), followingActor.getY() - (totalYMovement - WORLD_HEIGHT/2));
                        scrollingY -= (totalYMovement - WORLD_HEIGHT/2);
                        totalYMovement = WORLD_HEIGHT/2;
                    }
                    else if (totalYMovement < -WORLD_HEIGHT/2) {
                        followingActor.setLocation(followingActor.getX(), followingActor.getY() - (totalYMovement + WORLD_HEIGHT/2));
                        scrollingY -= (totalYMovement + WORLD_HEIGHT/2);
                        totalYMovement = -WORLD_HEIGHT/2;
                    }
                }
                scrollWorldObjects(scrollingX, scrollingY);
            }
        }

Und damit wird es letztendlich Ausgeführt:
Java:
public final void scrollWorldObjects(int scrollingX, int scrollingY) {
        List<Actor> actors = getObjects(Actor.class);
        for (Actor actor : actors) {
           
                actor.setLocation(actor.getX() + scrollingX, actor.getY() + scrollingY);
            
        }
        createTextur();
    }


Hat vielleicht jemand von ein eine Idee, wie wir dieses Problem lösen könnte?

Ich hatte ein Paar Ideen, jedoch hat keine davon funktioniert:
1. Ich könnte die Bar als Other Class erstellen, jedoch hab ich keine Möglichkeit gefunden sie dann auszuführen
2. Ich könnte die Bar in die Welt schreiben, jedoch konnte ich sie dann wieder nicht ausführen
3. Ich könnte die Koordinaten von „protected final void followActor“ unzwar von den Teil wenn der Actor an den Rand, wo die Welt bewegt wird rausfischen und dann eine eigene public final void scrollWorldObjects(int scrollingX, int scrollingY) nur für die Bar erstellen. Also public final void scrollBar(int BarscrollingX, int BarscrollingY):

Man müsste diese Bar einfach irgendwie erstellen, dass sie nicht in der Actor Klasse ist... Den die Actor Klasse wird ja von der ScrollEngine beinflusst... Oder die Koordinaten aus der ScrollEngine rausnehmen :S

-------------Den Anfang habe ich weggelassen, da da er meiner Meinung nach nur den Actor innerhalb der Ränder bewegt, ich brauche aber die Bewegung an den Rändern...........

Java:
protected final void followActor() {

[...]

            if (scrollingX != 0 || scrollingY != 0) {
                totalXMovement += scrollingX;
                totalYMovement += scrollingY;
                if (WORLD_WIDTH != 0) {
                    if (totalXMovement > WORLD_WIDTH/2) {
                        followingActor.setLocation(followingActor.getX() - (totalXMovement - WORLD_WIDTH/2), followingActor.getY());
                        scrollingX -= (totalXMovement - WORLD_WIDTH/2);
                        totalXMovement = WORLD_WIDTH/2;
		scrollingX = BarscrollingX
                    }
                    else if (totalXMovement < -WORLD_WIDTH/2) {
                        followingActor.setLocation(followingActor.getX() - (totalXMovement + WORLD_WIDTH/2), followingActor.getY());
                        scrollingX -= (totalXMovement + WORLD_WIDTH/2);
                        totalXMovement = -WORLD_WIDTH/2;
		scrollingX = BarscrollingX
                    }
                }
                if (WORLD_HEIGHT != 0) {
                    if (totalYMovement > WORLD_HEIGHT/2) {
                        followingActor.setLocation(followingActor.getX(), followingActor.getY() - (totalYMovement - WORLD_HEIGHT/2));
                        scrollingY -= (totalYMovement - WORLD_HEIGHT/2);
                        totalYMovement = WORLD_HEIGHT/2;
		scrollingY = BarscrollingY
                    }
                    else if (totalYMovement < -WORLD_HEIGHT/2) {
                        followingActor.setLocation(followingActor.getX(), followingActor.getY() - (totalYMovement + WORLD_HEIGHT/2));
                        scrollingY -= (totalYMovement + WORLD_HEIGHT/2);
                        totalYMovement = -WORLD_HEIGHT/2;
		scrollingY = BarscrollingY
                    }
                }
                scrollWorldObjects(scrollingX, scrollingY);
	scrollbar(Barscrolling, BarscrollingY)
            }
        }
Natürlich haben wir die einzelnen Variabeln vorher im Konstruktor deklariert 😉

Leider ist es dann abgestürtzt…

Ich hänge mal mein Projekt mit bei, fallls sich jemand, das ganze Projekt ansehen will. Die Bar ist vom "Progress bar/Health bar class" Projekt von "Danpost". Greenfoot | Progress bar/Health bar class

Wir sind voll am verzweifeln und würde mich mega freuen wenn mir jemand helfen könnte...

Grüße 🙂
 

Anhänge

also an sich must du der Heelth bar nur Koordinaten im Fenster zuweisen, heist nicht mit ergendeiner engin oder in relkation von ergendetwas sondern einfach ganz normal aufs Frame painten mit den Variablen des Frames!
 
Wie meinst du das? Ich bin leider echt nicht sooo gut in Java, kannst du mir bitte eine Zeile als Beispiel schreiben, dann würde ich es versuchen zu übernehmen... :S

Wie ich das verstehe:

Java:
public Bar bar = new Bar("Player 1", "Health Points", 25, 100);
im Konstruktor

und

Java:
addObject(bar, 250, 40);
in der ExampleWorld Methode, welches die Unterklasse von der ScrollEngine und damit die Unterklasse der Welt wäre.

Also:
World
SrcollEngine​
ExampleWorld <---- Da
habe ich auch schon gemacht, jedoch ist es dann auf der Welt festgepinnt und verschiebt sich aus demn fenster raus, wenn sich der Actor bewegt.
 
ich würde dir als erstes vorschlagen alss das mit greenfood das ist für die grundlagen gu aber für ein spiel einfach das Falsche! du müstest die Health bar selbst schreiben also nicht eine Vordifinirte nehmen auch wens bestimmt auch mit dieser geht wenn du sie von der kkordinate mit dem player zusammen updatest. Aber ich würde mir an deiner stelle ein Java Buch kaufen und java richtig lernen und nict die abgespeckte greenfood version mit der ich auch angefangen habe. Danach soltest du im Internet mit Tuorials weiterarbeiten dann kommt man gut vorran 😉
 

Zurück
Oben