Du bist nicht angemeldet.

Werbeanzeige

1

18.05.2012, 10:21

Mapscrolling

Hallo Leute,

ich arbeite gerade an einem One-Man Spiel in Java mit 2D Grafik.

Bisher läuft es auch ganz gut. Nun ist aber mein Problem, dass ich eine
größere Spielkarte habe, als 800*600, was die Auflösung des Spiels ist.
Jetzt muss sich der Bildschirmbereich mitverschieben, falls der Spieler
eine gewisse x/y Koordinate betritt.

Wie wird das am elegantesten geregelt?

David Scherfgen

Administrator

Beiträge: 10 297

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

18.05.2012, 10:41

Zeichnest du das Spielfeld in jedem Frame komplett neu?
Dann zeichnest du immer nur den Teil mit dem Spieler als Mittelpunkt, und das Scrolling ergibt sich von allein.

3

18.05.2012, 11:44

Das Spielfeld, also der border wird immer neu gezeichnet.
Theoretisch würde dein Ansatz funktionieren, aber auf der Map sind ja weitere Objekte ausser
dem Helden. Zum Beispiel NPC, Häuser, Bäume, ... Dann müsste ich deren Koordinaten auch immer ändern.

Wie wird das denn in der Spieleindustrie gehandhabt?

h3nryjk

Frischling

Beiträge: 13

Wohnort: 127.0.0.1 - Mi casa es tu casa

Beruf: Student

  • Private Nachricht senden

4

18.05.2012, 12:17

Hi Kenan89,

wie das in der Spieleindustrie gehandhabt wird, weiß ich (mangels Erfahrung) zwar nicht,
aber ich persönlich würde eine Kameraklasse verwenden. :)
Wenn du eine Art Entity-Manager Klasse für Gegner/Spieler/Bäume o.ä. verwendest, kannst
du in jeder Iteration, in der die Entity-KI aufgerufen wird bzw. in der Schleife, die zum Darstellen
der Entities verwendet wird, die Position an die Kamera (die als
eine Referenz übergeben wird) anpassen.

Bsp.:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class EntityManager {
    private ArrayList<Entity> entitylist;
    
    ...

    public void showEntities(Camera camera, Graphics g) {
        for(Entity e: entitiylist) {
            e.setPosition(camera); // Wenn die Methode setPosition(Camera); in Entity-Klasse vorliegt
            e.x = camera.getX();
            e.y = camera.getY();
            e.show(g);
        }
    }
}


So stelle ich mir das am besten vor ;)

David Scherfgen

Administrator

Beiträge: 10 297

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

18.05.2012, 12:22

Zum Beispiel NPC, Häuser, Bäume, ... Dann müsste ich deren Koordinaten auch immer ändern.

Klar. Du weißt ja, wo deine Kamera ist. Die Position der Objekte auf dem Bildschirm musst du dann ermitteln, indem du von ihrer "globalen Position" die Kameraposition subtrahierst.

6

18.05.2012, 13:15

Okay, das probiere ich aus.

7

21.05.2012, 18:02

D.h. der Held hat im Prinzip 2 Koordinaten. Einmal Global, und einmal Lokal. Wenn die Karte scrollen soll, also wenn der Held über die Mitte des bildschirms getreten ist,
dann ändern sich nicht die lokalen, sondern globalen Koordinaten.
Alle anderen Objekte haben nur globale Koordinaten, die um die Differenz zwischen mittelpunkt der Kamerasicht und dem schritt des
Helden über die mitte, korrigiert werden.

David Scherfgen

Administrator

Beiträge: 10 297

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

22.05.2012, 00:31

Nee, jedes Objekt hat nur globale Koordinaten.
Zum Zeichnen rechnest du sie in Bildschirmkoordinaten um, mit Hilfe der Kameraposition. Diese Bildschirmkoordinaten existieren aber nur temporär, die speicherst du nirgendwo.
Diese kannst du setzen wie du willst, z.B. so dass der Held immer in der Bildmitte ist.

9

22.05.2012, 09:22

Achso jetzt weiss ich was du meinst, klappt aber nicht.

Denn wenn die Kamera z.B. ganz rechts oben ist, dann darf der Held die Mitte
des Bildschirms verlassen, um an die Grenze der Spielkarte gelangen zu können.
Würde er immer in der mitte bleiben, so könnte er gar nicht Figuren,
die eben ganz rechts oben sind, nicht ansprechen. Hier ein Foto:

(Link)

Der rote Punkt ist der Held, der braune eine andere Figur.
Wie sollte der Held an diese Figur gelagen, wenn er immer mittig
in der Kamera platziert ist. Deswegen global und lokal für den Helden
nur.

BlueCobold

Community-Fossil

Beiträge: 10 859

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

22.05.2012, 10:06

Doch, das ginge schon, wenn Du die Map entsprechend erweiterst, wie das üblicherweise gemacht wird bei solchen Games, wo ein Char immer mittig im Screen steht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige