Seite 1 von 1
waittill?
Verfasst: Samstag 12. Januar 2013, 13:19
von noob1
Hallo Leute,
in der Script-Sprache codscript für Call of Duty gibt es das Konstrukt "waittill", welches ich gerne identisch in Python nutzen möchte, um ein Spiel zu scripten.
Es funktioniert in CoD so:
Code: Alles auswählen
while (1)
{
trigger waittill("trigger", player);
player print("Du berühst den Trigger!!!");
}
Wie sollte man sowas in Python implementieren?
Viele Grüße,
noob1
Re: waittill?
Verfasst: Samstag 12. Januar 2013, 13:34
von sparrow
Du könntest eine Liste der Funktionen haben, die von einem Trigger aufgerufen werden. An der Stelle, wo das Auslösen bemerkt wird, gehst du einfach die Liste durch und führst die Funktion aus. In Python selbst, und den meisten Framworks, sind das dann "Signale".
Re: waittill?
Verfasst: Samstag 12. Januar 2013, 13:52
von noob1
Ich möchte den Thread aber einfach beenden können, ohne darüber nachzudenken, auf welche waittill's er grad wartet.
Re: waittill?
Verfasst: Samstag 12. Januar 2013, 14:21
von bwbg
Ein bisschen Pseudo Code:
Code: Alles auswählen
def on_touched(message):
print(message)
def other_slot(message):
print("The other ...")
print(message)
def do_something():
trigger = Signal()
trigger.connect(on_touched)
trigger.connect(other_slot)
while True:
do_somethinge_else()
if condition_fullfilled():
trigger("Touched")
Wobei 'Signal' entweder selbst zu implementieren ist oder aus irgendeiner Bibliothek stammen kann.
So in der Art würde ich Dein Problem angehen.
Allerdings hängt auch vieles von der aufrufenden Umgebung ab. Es liest sich nicht danach, als wenn du das Pythonprogramm direkt aufrufst.
Grüße ... bwbg
Re: waittill?
Verfasst: Samstag 12. Januar 2013, 16:39
von noob1
Also wie schon im Beitrag davor gesagt, das Problem ist, dass das Signal nicht gelöscht wird, sobald man den Thread beendet.
"waittill" vereint das alles. Leider ist Python wohl nicht dynamisch genug.
Re: waittill?
Verfasst: Samstag 12. Januar 2013, 17:55
von BlackJack
@noob1: Ich wüsste jetzt nicht was das mit „dynamisch” zu tun hat. Wenn man will und kann, lässt sich das sicher lösen. Das `weakref`-Modul könnte dabei nützlich sein.
Re: waittill?
Verfasst: Sonntag 13. Januar 2013, 09:20
von noob1
Ich will das nicht "irgendwie" lösen, sondern mit trigger.waittill().
Re: waittill?
Verfasst: Sonntag 13. Januar 2013, 09:28
von sparrow
Womit das von BlackJack angesprochene "will" ausfällt.
Re: waittill?
Verfasst: Sonntag 13. Januar 2013, 09:28
von sparrow
Womit das von BlackJack angesprochene "will" wohl nicht vorhanden ist
Re: waittill?
Verfasst: Sonntag 13. Januar 2013, 10:58
von Sirius3
Es ist immer gut, wenn man einzelne Anforderungen nur stückchenweise verrät.
Ich hab immer noch keinen Plan, was der Fragesteller eigentlich erreichen will.
Naja, ich hab trotzdem die
einzig richtige Lösung gefunden:
waittill heißt in Python yield.
Code: Alles auswählen
class SignalHandler(object):
def __init__(self):
self.workers = {}
def handle(self, worker):
self.workers[worker] = next(worker)
def emit(self, target, signal):
active = [worker
for worker, target_signal in self.workers.iteritems()
if target_signal == (target, signal)]
for worker in active:
try:
self.workers[worker] = next(worker)
except StopIteration:
pass
trigger1 = "Button A"
trigger2 = "Button B"
def hidden_quest():
while True:
print "Press Button A"
yield trigger1, 'trigger'
print "Triggered"
print "Now press Button B"
yield trigger2, 'trigger'
print "Triggered"
signal_handler = SignalHandler()
signal_handler.handle(hidden_quest())
signal_handler.emit(trigger1, 'trigger')
signal_handler.emit(trigger2, 'push') # nothing happens
signal_handler.emit(trigger2, 'trigger')
signal_handler.emit(trigger1, 'trigger')
------
endlich den ronie-Knopf hier im Forum gefunden
Re: waittill?
Verfasst: Sonntag 13. Januar 2013, 16:27
von noob1
Danke Sirius3, das sieht sehr vielversprechend aus.
