VocaWord

Blender != Blenderplayer

von Valentin Pratz (26.11.2013)

Wenn man die Spiele-Entwicklung in Blender startet und später den Blenderplayer für die Verteilung des Spiels verwenden möchte, gibt es einige Dinge zu beachten. Am Beispiel unseres Spiels »Sokoban« zeigen wir, welche Probleme wir lösen mussten.

Unser Ansatz war, neue Objekte immer mit folgender Methode zu erzeugen:

bpy.ops.mesh.primitive_..._add

Anschließend war ein neues Material zu erstellen,

bpy.data.materials.new()

eventuell noch eine Textur hinzuzufügen und es abschließend zuzuweisen. Wenn alle Objekte hinzugefügt waren, wurde die Szene mittels

scene.restart()

neu gestartet und die Objekte erschienen auf dem Bildschirm. Nachdem wir das Programm fast fertiggestellt hatten, mussten wir uns natürlich Gedanken über die Verbreitung machen und wir sahen im offiziellen Blenderplayer die beste Möglichkeit.

Also starteten wir das Programm in der Kommandozeile mittels:

/pfad/zum/blenderplayer /pfad/zum/file.blend

Doch das Programm funktionierte nicht, sondern lieferte nur folgenden Fehler:

ImportError: No module named 'bpy'

Nach einiger Recherche fanden wir heraus, dass es keine Möglichkeit gibt, das »bpy«-Module im Blenderplayer zu benutzen. Also mussten wir die Funktionalität von »bpy« irgendwie durch die des Moduls »bge« ersetzen.

Hier einige Ausschnitte der Anpassungen:

  • Objekte hinzufügen Im Blenderplayer können keine neuen Objekte erzeugt werden, man kann nur schon bestehende einfügen. Also kopieren wir alle unsere Objekte auf einen nicht genutzten Layer (man kann nur Objekte von inaktiven Layern hinzufügen). Außerdem brauchen wir noch ein Empty auf unserem aktiven Layer um die Objekte hinzuzufügen (die Objekte müssen nicht an Koordinaten, sondern an der Position eines anderen Objektes eingefügt werden). Diesem geben wir den Namen »add_empty«. Nun können wir Objekte wie folgt hinzufügen:

     # Die aktuelle Szene
     scene = bge.logic.getCurrentScene()
     # Unser Empty zum Hinzufügen
     add_empty = scene.objects["add_empty"]
     # Das Objekt, das wir hinzufügen wollen
     obj = scene.objectsInactive["unser_objekt"]
     # Das Objekt hinzufügen
     scene.addObject(obj, add_epmty)
    
    In der Dokumentation von Blender[1] wird die Möglichkeit angeführt,
    Objekte nur mit Hilfe der Strings ihrer Namen zu erzeugen, in diesem
    Beispiel also:
    ::
    
      scene.addObject("unser_objekt", "add_empty"))
    
    In Blender 2.68 führte dies bei uns zu einem Speicherzugriffsfehler,
    weshalb wir erstere Variante benutzt haben.
    
  • Position der Objekte bei der Erzeugung anpassen Um ein Objekt an einer bestimmten Position hinzuzufügen, müssen wir nur die Position unseres Emptys ändern.

    System Message: ERROR/3 (<string>, line 88)

    Unexpected indentation.

    # Die aktuelle Szene
    scene = bge.logic.getCurrentScene()
    # Unser Empty
    add_empty = scene.objects["add_empty"]
    # neue Position setzen
    add_empty.worldPosition = ((x, y, z))
    # Jetzt das Objekt wie oben beschrieben hinzufügen
    # -> Es erscheint an Position (x, y, z)
    
  • Texturen austauschen

Der Vollständigkeit halber wollen wir hier noch auf das austauschen von Texturen verweisen [2], welches wir aber nicht selbst ausprobiert haben.