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:
Und damit wird es letztendlich Ausgeführt:
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...........
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
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)
}
}
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