Frage

Ich baue ein Pacman-Spiel. Grundsätzlich möchte ich eine Karte Darstellung dieses Fenster haben, die aus Blöcken / Fliesen. Dann, als der Pacman-Zeichen / Geist bewegt würde ich ihre Position auf der Karte ändern, um darzustellen, was auf dem Bildschirm ist, und verwendet, die für die Kollisionserkennung etc.

Wie kann ich diese Karte bauen, vor allem da der Bildschirm von x, y-Koordinaten vorgenommen wird, so wie kann ich vertrete sie richtig in Fliesen / auf dieser Karte?

War es hilfreich?

Lösung

Ich weiß, es ist verlockend, denkt an Objekten und Schnittstellen zu starten, aber haben Sie darüber nachgedacht, einen 2-dimensionalen Array mit jedem Elemente der 40 Pixel oder so etwas? Ich erinnere mich nicht Pacman Wesen Pixel genau, wenn es zu Kollision kommt, mehr eine Frage der Richtung jedes Stück in bewegt.

Andere Tipps

Im Allgemeinen haben Sie eine abstrakte Darstellung, die nicht als solchen Pixel referenziert (zum Beispiel, vielleicht das Pac-Man-Labyrinth ist einfach w Einheiten breit), und dann haben Sie eine lineare Transformation (Sie wissen, y = mx + b ) die abstrakte Darstellung der tatsächlichen Pixel zu tragen.

Um es konkret zu machen, lassen Sie uns sagen, dass Sie Ihre abstrakte Darstellung wollen 100 Einheiten breit sein, und Sie wollen es als 400 Pixel zu machen. Dann wird die Transformation nur scrn_x = 4 * x.

Art schwierig, mit diesem zu kommen, ohne es selbst zu schreiben, aber.

Zuerst müssen Sie die Definitionen von Instanzen erstellen, die ICollidable implementieren. Entities würden Geister, Pacman, Punkte und Powerups gehören. Jedes Element in der Karte enthalten würde, zusammen mit anderen Informationen, eine Liste aller vorhandenen Einheiten mit einer Art „Position“ Wert für zusätzliche Präzision. Die ICollidable Schnittstelle würde nicht nur Logik für die Bestimmung, welche Entitäten miteinander kollidieren (Geister mit Punkten zum Beispiel nicht kollidieren.) Aber zu bestimmen, ob sie in der Lage sind, miteinander zu kollidieren. IE, wenn Pacman ist ein Raum von der rechten Seite eingeben und ein Geist ist, dass der Raum von links verlassen keine Kollision gibt. Es wird auch helfen, festzustellen, wann genau Pacman einen Punkt gegessen hat, so dass grafisch es richtig aussieht. IE, wenn Sie einen Punkt zerstören Recht als Pacman einen Raum betritt, es wird verschwinden, bevor er selbst es grafisch berührt.

Ihre Sprites wie Pacman und der Geist werden durch Positionen (x, y) dargestellt. Um festzustellen, ob sie miteinander kollidieren, benutzen Sie diese psuedocode:

sprites = [ ... list of sprites ... ]
for i1=0 to len(sprites):
    sprite1 = sprites[i1]
    for i2 = i1+1 to len(sprites):
        sprite2 = sprites[i2]
        if (sprite1.x-sprite2.x)^2+(sprite1.y-sprite2.y)^2 < radius_of_sprites^2:
            collide(sprite1, sprite2)

Beachten Sie, dass dies nicht die Karte überhaupt nicht beteiligt. Wir können für Kollisionen zwischen Pacman überprüfen und die Karte getrennt. Der Schlüssel Trick hier ist, teilen Sie die Pixel jedes der Pacman Seiten Koordinate (oben, unten, links, rechts) und prüfen, ob Kollisionen. Zum Beispiel, wenn Pacman nach rechts geht, müssen wir den rechten Rand für eine Kollision überprüfen:

pacman_tile_x = (pacman.x+tilesize/2)/tilesize    # added tilesize/2 to check the middle of pacman
pacman_tile_y = pacman.y/tilesize + 1   # +1 because right edge is 1 tile to the right of the sprite's coordinate
if tile[pacman_tile_x][pacman_tile_y].is_a_wall:
    ... wall collide code ...

Nun, wenn Sie eine große Anzahl von Sprites auf dem Bildschirm haben, können Sie die Sprite-to-Sprite Kollisionserkennung optimieren, indem sie zu speichern, die Sprites bestehen auf einer bestimmten Kachel in der Karte, und so haben Sie nur gegen Sprites überprüfen in benachbarten Fliesen. Aber für einen ersten Durchlauf und zu diesem Pacman-Spiel, es ist wahrscheinlich nicht eine notwendige Optimierung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top