image image


Erste Versuche mit TigerJython: »Walking« Orc mit GameGrid

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.

image

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!


(Kommentieren) 

image image



Ü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!


Werbung


image  image  image
image  image  image


image