Größergleich (>) & Triggerfrage

Previous topic - Next topic

Veritas

Hallo Freunde,
ich hab mal ne Logikfrage die mich schon ein paar Tage auf.
Triggern ist neu für mich, hab da noch nicht so die Ahnung von.
Ich habe einen Ablauf bei dem der Wert oa (Y-Wert eines Sprites) sich in einer Schleife immer wieder über eine Koordinate bewegt.
Jedesmal wenn er diese eine Koordinate überschreitet soll die Geschwindigkeit des bewegenden Sprites veringert werden.
Ich habe einen Trigger gesetzt WANN das Sprite beginnen soll die Geschwindigkeit zu drosseln.
Dieser Trigger funktioniert auch. Er setzt
Code (glbasic) Select
bremsen=TRUE
womit das Geschehen unten abläuft.
Allerdings soll diese Aktion nur ein einziges mal ausgeführt werden, daher habe ich einen 2. Trigger eingebaut.
Dieser ist von Anfang an auf
Code (glbasic) Select
tr_stop_oa=FALSE
gesetzt ist und nach einmaligem Subtrahieren von gStop
Code (glbasic) Select
Geschwindigkeit=Geschwindigkeit-gStop
auf True gesetzt wird, damit das nicht nochmal passiert.

Code (glbasic) Select

IF bremsen=TRUE // Wenn Trigger auf TRUE gesetzt wurde: folgende Schritte ausführen
IF (oa=Endposition) <<--PROBLEM
IF tr_stop_oa=FALSE
tr_stop_oa=TRUE
Geschwindigkeit=Geschwindigkeit-gStop
ENDIF
ENDIF
ENDIF


Mein Problem ist jetzt allerdings folgendes. Die Position oa kann anhand der Geschwindigkeit nicht immer, wenn überhaupt GLEICH der Endposition sein.
Gut okay, dann machen wir
Code (glbasic) Select
IF (oa>Endposition)
Problem gelöst. Naja, nicht ganz. Trotz des Triggers wird die Aktion dann nicht EINmal ausgeführt sondern solange oa größer ist als die Endposition, was natürlich zu unerwünschten Ergebnissen führt.

Jaaa, ihr schmunzelt jetzt sicher, das kennt jeder ;) Das Sprite bremst ab und verschwindet dann in gegensätzlicher Geschindigkeit im Nirvana  =D.
Hat jemand eine Idee wie man das von mir geschilderte Problem beheben kann?
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Kitty Hello

mach doch:
IF old_pos <=EndPos AND new_pos>=EndPos THEN Brems()

Was willst Duüberhaupt machen? Hier ist ein grundlegendes Problem, meine ich.

Veritas

Es geht nach wie vor um meine Rollenanimation. Eine Anzahl von Sprites durchläuft vertikal einen Viewport. Ab einer gewissen Durchlaufszahl wird der Trigger ausgelöst. Der Bremsvorgang startet.
Das letzte Bild soll logischerweise im Zentrum des Viewports stehen bleiben.
Die Geschwindigkeit ändert sich ja stetig (-10%, je Bild). Anfangs habe ich die = Abfrage gemacht in dem ich zum Testen die Endposition immer 1*Geschwindigkeit gesetzt habe.

Code (glbasic) Select
Endposition=Geschwindigkeit

Das funktionierte auch einwandfrei, das Problem dabei ist nur das, das Bid dann logischwerweise die Falsche Position hat, es bleibt dann ziemlich direkt am Viewportrand stehen. Ist ja auch logisch.
Wollte dann einfach einen Faktor einbauen, dieser wird aber ebenfalls nicht getroffen, zumindest hab ich noch nicht rausgefunden wie dieser Faktor aussehen müsste.

Code (glbasic) Select
Endposition=Geschwindigkeit*Faktor (obwohl das ja eigentlich logisch wäre Oo)?

Die einzige Art und weise wie ich das Beheben konnte, war mit dem >= Das Problem ist nur das er es trotzdem mehr als ein einziges mal ausführt, bis er merkt das er es garnicht mehr darf. Dadurch entsteht eine Ungenauigkeit und die Animation stoppt nicht mehr da wo sie aufhören soll, sondern 3 Bilder zu früh. (Was natürlich *grummel* Mist ist!! =) )


Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Veritas

kann mir wirklich niemand sagen WARUM? GLBasic trotz Trigger, mehr als einmal rechnet? Normalerweise müsste sowas doch funktionieren? Liest es den Code vlt nicht sauber? Soll ichs mal mit C++ Syntax versuchen?
Hab ich einen Logikfehler?

Eine Range kann ich nicht gebrauchen, da diese nicht präzise genug wäre.


(wenn ichs in C++ Syntax versuche brauch ich aber Hilfe =D)

LG Nicola
Tower: 2,5Ghz Quadcore/  8GB DDR2 Ram/ 1066Mhz FSB / ATI HD Radeon 4860.
Mobil:  DELL Studio XPS 16 / 2,53GHz intel Centrino 2 Duo / 4GB DDR 3 Ram/ 1066Mhz FSB/ ATI Radeon 4670 mobility

Never Argue with Idiots. They'll drag you down
to their level and beat you with experience.

Kitty Hello