Ich hatte es angedroht, ich hatte eine unbändige Lust, mit TigerJython zu spielen. »Spielen« im wahrsten Sinne des Wortes, denn TigerJython kommt mit der Bibliothek GameGrid, mit der der Programmierer einfach Spiele erstellen kann. Das verlockte mich natürlich und so habe ich erst einmal einen Orc in eine kleine Welt gestellt, in der er sich tastaturgesteuert frei bewegen kann. Hindernisse, also in meinem Beispiel Bäume, sollen ihn aber stoppen.
Es ist ein Tile-basiertes Spiel, der Orc bewegt sich auf einer Art Schachbrett mit einer Kachelgröße von 32x32 Pixeln. Er wird mit den Pfeiltasten gesteuert und bei jedem Tastendruck bewegt er sich zur nächsten Kachel in Pfeilrichtung, also nach oben, nach unten, nach rechts oder nach links.
Das Spielfeld wird durch eine Matrix repräsentiert, in der 0
ein freies Feld ist und 1
ein Hindernis bedeutet:
level01 = [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1]]
Das folgende Code-Schnipsel baut das Spielfeld auf:
for i in range(len(level01)): for j in range(len(level01[i])): if level01[i][j] == 1: tree = Tree() addActor(tree, Location(j, i)) tree.show()
Der Orc wie auch der Baum werden von einer simplen Klasse, die von der Oberklasse Actor
alle Methoden erbt, erzeugt:
class Orc(Actor): def __init__(self): Actor.__init__(self, "sprites/orc.gif", 8) self.dir = "right" # Spieler startet mit Blickrichtung rechts self.walking = False # Spieler bewegt sich erst auf Tastendruck self.count = 0 class Tree(Actor): def __init__(self): Actor.__init__(self, "sprites/tree.png")
Die eigentliche Spiellogik fondet in der Funktion keyCallback()
statt, in der es auch eine simple Kollisionsabfrage gibt:
ef keyCallback(e): keyCode = e.getKeyCode() if keyCode == 37: # left orc.setDirection(180) orc.show(5) elif keyCode == 38: # up orc.setDirection(270) orc.show(0) elif keyCode == 39: # right orc.setDirection(0) orc.show(7) elif keyCode == 40: #down orc.setDirection(90) orc.show(2) # Kollsionserkennung nextpos = orc.getNextMoveLocation() i = nextpos.getX() # Ränderabfrage if i == 16: i = 0 elif i == 0: i = 15 j = nextpos.getY() if j == 11: j = 0 elif j == 0: j = 10 # print i, j # Wenn an der nächsten Position kein Baum, dann gehe dorthin. if level01[j][i] != 1: orc.move() # Ränderbehandlung für den nächsten Schritt if orc.getX() < 0: orc.setX(15) elif orc.getX() > 15: orc.setX(0) if orc.getY() < 0: orc.setY(10) elif orc.getY() > 10: orc.setY(0)
Neben der Kollisionserkennung werden auch noch die Ränder geprüft. Ist der Orc an einem der Fensterränder, taucht er an der gegenüberliegenden Seite wieder auf. Hier möchte ich später einen Übergang zu einem anderen Level implementieren, aber erst einmal bleibt es bei der Toruswelt.
Hier jetzt der vollständige Code für diejenigen unter Euch, die das Spiel nachvollziehen oder nachprogrammieren wollen:
from gamegrid import * ts = 32 # Tilesize level01 = [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1], [1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1]] class Orc(Actor): def __init__(self): Actor.__init__(self, "sprites/orc.gif", 8) self.dir = "right" # Spieler startet mit Blickrichtung rechts self.walking = False # Spieler bewegt sich erst auf Tastendruck self.count = 0 class Tree(Actor): def __init__(self): Actor.__init__(self, "sprites/tree.png") def keyCallback(e): keyCode = e.getKeyCode() if keyCode == 37: # left orc.setDirection(180) orc.show(5) elif keyCode == 38: # up orc.setDirection(270) orc.show(0) elif keyCode == 39: # right orc.setDirection(0) orc.show(7) elif keyCode == 40: #down orc.setDirection(90) orc.show(2) # Kollsionserkennung nextpos = orc.getNextMoveLocation() i = nextpos.getX() # Ränderabfrage if i == 16: i = 0 elif i == 0: i = 15 j = nextpos.getY() if j == 11: j = 0 elif j == 0: j = 10 # print i, j # Wenn an der nächsten Position kein Baum, dann gehe dorthin. if level01[j][i] != 1: orc.move() # Ränderbehandlung für den nächsten Schritt if orc.getX() < 0: orc.setX(15) elif orc.getX() > 15: orc.setX(0) if orc.getY() < 0: orc.setY(10) elif orc.getY() > 10: orc.setY(0) makeGameGrid(16, 11, 32, None, "sprites/bg0.png", False, keyPressed = keyCallback) setTitle("Walking Orc") # Baue den Level auf: for i in range(len(level01)): for j in range(len(level01[i])): if level01[i][j] == 1: tree = Tree() addActor(tree, Location(j, i)) tree.show() orc = Orc() addActor(orc, Location(10, 9)) orc.show(7) show() doRun()
Die Bilder des Orcs habe ich der freien (CC BY 3.0) Sprite-Sammlung von Philipp Lenssen entnommen, der Baum und der Hintergrund sind aus der ebenfalls (CC BY 3.0) freien AngbandTk-Sammlung TomeTik.
Es ist mein erster, ernster Versuch mit TigerJython, weder mit der Entwicklungsumgebung noch mit der Gamegrid
-Bibliothek bin ich bisher sonderlich vertraut. Es ist daher gut möglich, daß ich etwas in der Dokumentation übersehen habe und daß es elegantere Lösungen gibt. Falls jemand welche kennt, bitte ich um Hinweise in meinen (Email-) Kommentaren. Still digging!
Über …
Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter Rentner, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!
Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.
Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.
Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes
von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.
Werbung
Diese Spalte wurde absichtlich leergelassen!