ich benutze Python zusammen mit dem 3D Programm Blender. Dort ist Python angewendet und mit eigens definierten Funktionen ausgestattet.
Aber anscheinend habe ich ein reines Python Problem.
Ich hatte früher Php und Java mal angelernt und irgendwie passt der übertrag davon in Python nicht so ganz.
Nach diversen Tests und erfolgloser Suche (bzw. Unverständnis) melde ich mich hilfesuchend an euch
Wenn ich hier falsch bin, bzw. das Blenderzeug euch verwirrt, sagt bescheid.
Erstmal der Code. Das Problem liegt ganz unten, ich habe die Problem-Zeile nochmal mit Kommentar gekennzeichnet.
Meine Ideen und Ziele habe ich ganz nach unten geschrieben, weil erstmal klar sein muss, ob der Code hier überhaupt "akzeptiert" wird.
Danke auf jeden Fall für eure Geduld!
Code: Alles auswählen
import bge
def main():
cont = bge.logic.getCurrentController()
own = cont.owner
#scene <--sucht blender sich
scene = bge.logic.getCurrentScene()
print(scene, "is the current scene")
#search for property 'player' <---das macht Blender automatisch, die Liste wird korrekt erstellt, Suzanne und Player Collision werden nachfolgend ausgedruckt (siehe auch konsolenzitat)
playerlist = [s for s in scene.objects if 'player' in s]
if playerlist :
print(playerlist, "is the List with the property x")
i = 0
pLl = len(playerlist)
print(pLl , "is the length of the playerlist")
print(i , "is i")
print(playerlist[0], "Playerlistentry 0")
print(playerlist[1], "Playerlistentry 1")
print(playerlist[i],"is playerlistentry i")
#forloop
for playerlist in range(0,pLl):
print(i , "value of i in forloop-beginning" )
#same as before but, next line provides "int object is not subscriptable ERROR!" why? and how is it to solve?
print(playerlist[i],"is playerlistentry i")
main()
Das sagt mir die Blender-Console dazu - Suzanne, Spaceship Collision, Enemy Collision sind Objekte aus Blender, die über die internen Funktionen aus der Szene aufgenommen werden.
Der Witz an der Sache ist, vor der forschleife bekomme ich noch die korrekte Ausgabe, in der forschleife ergibt die gleiche Syntax einen Fehler.Blender Game Engine Started
Scene is the current scene
[Suzanne, Spaceship Collision] is the List with the property x
2 is the lenght of the playerlist
0 is i
Suzanne Playerlistentry 0
Spaceship Collision Playerlistentry 1
Suzanne is playerlistentry i
0 value of i in forloop-beginning
Python script error - object 'Enemy Collision' controller 'Python':
Traceback <most recent call last>:
File "errorcheck_int_not_subscriptable1.py", line 31, in <module>
File "errorcheck_int_not_subscriptable1.py", line 28, in main
TypeError: 'int' object is not subscriptable
Blender Game Engine Finished
Meine Vermutungen:
- ich habe etwas mit lokaler und globaler Variable nicht beachtet.
Mein Unverständnis:
- wenn ich die incrementvariable i als String nutze bekomme ich die Aufforderung einen Integer zu wählen, aber der führt ja zu der entsprechenden Problemphrase.
Mein Ziel:
- durch die Liste durchinkrementieren.
Ich will eine Funktion nutzen, welche die Distanz zwischen 2 Objekten misst (dem Scriptbesitzerobjekt und dem player-objekt), von Blender habe ich nun die Spielerliste bekommen, also die Referenzen. Nun will ich die Funktion auf jedes der in der Liste gespeicherten Objekte anwenden und diese ggf. woanders speichern.
In meinem Anwendungsfall will ich die Distanzfunktion nutzen um zu sehen, welches Objekt ist das nächste. Dazu muss die Referenz und die Distanz des Objekts zusammen auffindbar sein, da ich später anhand der Distanz das nähere Objekt verfolgen möchte. Dazu kann ich Blender ein "Suche/Verfolge" Funktion benutzen, wenn ich das Objekt kenne.
Meine Idee:
- Liste benutzen, Funktion für jedes Item der Liste in der forschleife benutzen, in anderer liste abspeichern, bzw. nur das nähere merken. Aber das geht wohl nicht ...so einfach.
Ihr seid unten angekommen
Danke!
und einen schönen Tag/Abend/Nacht/Morgen noch!