Ich finde das alles ziemlich "lang"!
Wozu die ganzen Klassen? Eigentlich halten die nur Attribute - das könnte man dann auch über ein Dictionary lösen.
Außerdem sind viele Attribute der Klassen auch nur copy&paste! Wieso nicht weiter abstrahieren und dann Listen vbon Objekten gleichen Musters anlegen?
Ich würde generell diese vielen Daten auslagern (-> JSON, o.a.). Die gehören imho ja nicht direkt zum eigentlich Programm.
Code: Alles auswählen
bench_1.rotate(angle=0*pi/3,axis=(0,1,0))
bench_2.rotate(angle=1*pi/3,axis=(0,1,0))
bench_3.rotate(angle=2*pi/3,axis=(0,1,0))
bench_4.rotate(angle=3*pi/3,axis=(0,1,0))
bench_5.rotate(angle=4*pi/3,axis=(0,1,0))
bench_6.rotate(angle=5*pi/3,axis=(0,1,0))
Wieso packst Du das nicht in eine Liste? Wenn man Bezeichner durchnummeriert, hat man etwas falsch gemacht!
Wieso nutzt Du keine Funktionen? Zudem ist der ganze Code auf Modulebene! Das ist ziemlich unschön.
Code: Alles auswählen
"""Motion"""
while True:
time.sleep(5)
move_spider(1,0.1)
move_spider(2,0.2)
move_spider(3,0.3)
move_spider(4,0.4)
# usw.
Wieso nicht diese Werte auch in eine Datenstruktur auslagern (Hatte ich doch schon mal angeregt iifc!) und dann mit einer Schleife iterieren?
Das ganze ist irgend wie komplett unschön!
Viel zu viele Magic Numbers im Quellcode.
Ich würde versuchen fast alle diese Werte in eine externe Datendatei auszulagern und diese zu Beginn einzulesen und dann Schritt für Schritt Objekte zusammenzubauen, die sich sinnvoll aus den kleint möglichen Wertpaaren zusammensetzen.
Beispiel:
Code: Alles auswählen
PILLAR_1=box(pos=(310,-660,-230),
length=30,
width=30,
height=1500,
color=(0.8,0.8,0.8),
material=materials.emissive)
Davon hast Du in der Klasse Scenery drei Stück.
Augenscheinlich brauchst Du für eine box also die Parameter: pos, length, width, height, color und material.
in JSON sähe das so aus:
Code: Alles auswählen
{
"box_mitte": {
"type": "box"
"pos": [310,-660,-230],
"length": 30,
"width": 30,
"height": 1500,
"color": [0.8, 0.8, 0.8],
"material": "emissive"
},
...
}
Dies könntest Du nun parsen und eine neue box anlegen:
Code: Alles auswählen
import json
def load_data(filename):
with open(filename, "r") as infile:
scene = json.load(infile)
return scene
def create_scene():
create_funcs = {
"box": create_box,
"sphere": create_sphere,
# usw.
}
# hier ein Dictionary für die fertigen Objekte
objects = {}
scene_data = load_data("scene.json")
for name, values in scene_data.iteritems():
objects[name] = create_funcs[values["type"]](**values)
return objects
Die einzelnen "create"-Funktionen erzeugen dann eben je nach Art ein solches Objekt und geben es zurück. Dieses wird dann in das Dict objects gepackt und kann später weiter genutzt werden; etwa zum Bewegen einzelnen Objekte.
Dies könnte man auch in die JSON-Datei integrieren
Code: Alles auswählen
{
"sphere_aussen": {
"type": "sphere",
"pos"= [0, -1615, 0],
"radius": 15000,
"color": [0, 0, 0.5]
"rotations": [
{
"angle": ...
},
usw.
]
}
}
Um diesen Klasse-Wust wegzubekommen, könnte man noch eine weitere Ebene in die JSON-Datei einbauen und in Python dann als "höchstes" Dictionary ablegen.
Code: Alles auswählen
{
"scenery": {
hier dann alle Daten für die Scene
},
"schriftzug": {
hier alles für diesen High enegery Text
},
usw.!
}
So, ich hoffe das waren mal ein paar Anregungen!
Auf jeden Fall sagt dieses Script, dass Du von guter Modellierung noch weit entfernt bist - das ist kein Wunder als Anfänger, aber ein Zeichen, sich nicht zu hohe Ziele zu stecken (ich verweise da mal auf den Idee-Thread
)
Wichtig ist immer, zu erkennen, welche Strukturen man geschickt und sinnvoll zusammenpacken kann. Für diese implementiert man dann Datenstrukturen und Operationen darauf. So wächst Stück für Stück etwas zusammen.