PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Äpfel vergammeln



Klunky
07.01.2008, 01:58
Als es ist so ich habe ein Common Event erstellt wo nach einer gewissen Zeit Äpfel vergammeln sollen also in deinem Inventar.
Mit der Bedigung das du mindestens einen Apfel hast.
Nun bekomme ich aber das Problem das alle in deinen Inventar die länger als 30 Minuten da drinne weilen vergammeln sollen. Aber erstens scheitert das an der Umsetzung weil ich nicht weiß wie man ermitteln kann wie viele Äpfel man hat (also per Variable also da brauche ich hilfe!) und das 2. Problem was ist mit den neu gekriegten Äpfeln? die können ja nicht mit den anderen vergammeln. wie stelle ich es ein das EIN bekommener Apfel in 30 Minuten vergammelt?

Odeos
07.01.2008, 05:47
paraleler prozess

label1
--bedingung apfel ist im inventar
wait 30m
-1 apfel item
+1 vergammelten apfel item
--ansonsten

--ende
springe zu label

so müsstes gehen

Programmierer
07.01.2008, 12:15
so würde aber alle 30 Sekunden ein Apfel vergammeln und nicht jeder Apfel nach 30 Sekunden ;)

mMn ist das nur umzusetzen, entweder mit dem XP oder mit einem eigenen Inventar. Anders als mit viel Aufwand (da keine Arrays -.-) lässt sich das wohl nicht lösen.

MA-Simon
07.01.2008, 14:29
Du brächtest im Prinzip, für jeden der 99 möglichen Äpfel eine eigene Variable, Immer, wenn du einen Apfel in deinem Inventar hinzugefügt bekommst, Springt eine dieser variablen auf 30. Das überprüftst du mit einer weiteren verteilervariable (für jede mögliche inventarzahl startet diese ein neues variablen-zähl event. Das kann man zwaralles in einem parralel lösen aber: Hm, dann brauchst du ein elllenlanges script, wobei du ständig abfrägst, wiehoch die einzelnen gestarteten variablen den sind und reduzierst die jede Minute um 1. Das ist aber mit 99 Fork Conditions etc. verbunden, die ständig parralel laufen+ eine Verteilerabfrage für die 99 variablen, denn eine Variable soll ja nicht doppelt mit 30 min belegt werden. Zuguterletzt, wenn eine dieser 99 möglichen variablen auf 0 fällt, wird ein Apfel gelöscht und die Variable kommt wieder zu den anderen in die Warteschleife ...

Theoretisch möglich, hm und auch umsetzbar ^.- einen konkreten Code kann ich dir leider nüscht nennen. Aber vorstellen kann ich ihn mir schon. Eigentlich auch ziemlich einfach zu machen, wenn man es so überlegt, aber seeeeehr viel Tiparbeit, bei der man ständig die variablen ändern muss.

Eine andere Frage ist die, ob das der Maker schafft. Ich befürte, der stoppt da und giebt den geist auf, bzw. er rechnet zu lange das ganze event durch und somit, käme der schön 1 min Tackt Zeitplan föllig durcheinander.

PS:

Digitale Äpfel vergammeln nüscht!!!;)

Programmierer
07.01.2008, 14:32
Die Frage wäre nur, wenn der Held einen Apfel isst, welcher wird dann gegessen? Der, der am wenigsten vergammelt ist? Einen zufälligen?

Beril
07.01.2008, 14:50
Wie verhält sich eigentlich ein Event, wenn es gecallt wird, wenn es noch läuft?
Wenn es quasi mehrere parallele Abläufe schafft, dann bräuchtest du eigtl nur jedes mal, wenn du einen Apfel bekommst ein CE callen, dass 30 min wartet, danach abfragt ob noch gleich viele Äpfel im Inventar sind und wenn es gleich oder mehr sind einen normalen Apfel löschen und einen gegammelten hinzufügen.

Programmierer
07.01.2008, 15:14
Damit würdest du aber sämtliche Gammelungsprozesse aussetzen, wenn der Held nur einen Apfel isst...

CapSeb
07.01.2008, 16:21
- 99 Äpfel heißt 99 Variablen. Das ist kein Problem.
- Dann einfach ein Common Event mit einer Schleife (= Loop) erstellen.
- In dieser Schleife wird ein Variable immer um eins erhöht (Zählervariable).
- in der Schleife steht sonst nur noch ein Befehl: Der X-te Apfel wird um eins verringert (Den X-ten Apfel erhälst du mit der Zählervariable, weiter unten mehr dazu)
- Hinter der Schleife kommen zwei Befehlsblöcke: Eine Bedingungen, dass es "Gammel-Äpfel" gibt (siehe "Gammelbedinung"), und danach ein Wait von einer Minute.

Beim Aufnehmen eines Apfels muss geguckt werden, wieviele Äpfel vorhanden sind (entweder Inventar, oder ob Variable null sind mit Hilfe der Zählervariable - siehe unten). Schließlich muss die richtige Variable auf 30 gesetzt werden.


Eine neue Variable, in diesem Fall "Zählervariable" genannt, wird noch vor der Schleife auf einen bestimmten Wert gesetzt, quasi initiiert (nur, dass der Maker die zu Spielbeginn schon initiiert hat >_>). Dabei nimmst du als Wert die Variablennummer des ersten Apfels (zB. 113, musst halt sehen wo du die Variablen hinschreibst). Beim ersten Schleifendurchlauf hast du also die Zählervariable auf den ersten Apfel gerichtet.
Den Inhalt der bspw. 113. Variable erhälst du mit dem Befehl "Change Variable", nimmst dort aber "VarNo." (die dritte Zeile, sie steht nach dem Variablen Bereich). Änderst du die Variable-Number der Zählervariable änderst du in Wirklichkeit die 113. Variable, wenn die Zählervariable auf 113 steht. Die Zählervariable bleibt dabei gleich.
Bei jedem Schleifendurchlauf wird, wie schon geschrieben, die Zählervariable um eins erhöht. Somit wird beim zweiten Durchlauf in unserem Beispiel die 114. Variable angesprochen, also der 2 Apfel. Nach 99 Durchläufen, wenn also die Zählervariable bspw. auf 211 am Ende der Schleife steht, muss ein Brake kommen (if Zählervariable = 211).
Dadurch werden alle 99 Äpfel um 1 (=eine Minute) verringert.



Die Gammelbedingung fragt, ob die erste Apfelzeit kleiner-gleich null ist. Wenn das der Fall ist, werden alle Äpfel um eine Position nach oben verschoben.
Das macht man wieder mit der Zählervariable. Diesmal braucht man aber zwei. Also die erste auf den ersten Apfel "richten" , die zweite auf den zweiten Apfel "richten" und eine Schleife nehmen. Zuerst nimmt man den ersten Apfel und füllt ihn mit der Zeit des zweiten, dann füllt man den zweiten mit dem dritten, den dritten mit dem vierten, den vierten mit dem fünften...
Aber das macht man nicht per Hand, sondern mit den beiden Zählervariable die jedes Mal um eins erhöht werden, und dadurch jedes Mal einen anderen Apfel ansprechen (mit Var-No). Quasi genauso wie mit der Zeitverringerung.

Achtung: Es könnte auch sein das mehrere Äpfel gleichzeitig vergammelt sind, da man nur die Minuten zählt. Daher muss man in der Bedingungen am Ende ein "Goto Label #1" setzen und vor die Bedingung den Label #1 pflanzen.


Zusatzidee:
Es wäre auch möglich statt der absoluten Apfelzeit das Verhältnis zur vorherigen Apfelzeit abzuspeichern (= relative Zeit) und dann diese Zeit zu warten. Da müsste man aber beim Einsammeln des Apfels die Schleife zum berechnen der Zeit verwenden.

Bei Verständnidschwierigkeiten einfach nachfragen.


http://www.multimediaxis.de/images/smilies/old/s_017.gif CapSeb http://www.multimediaxis.de/images/smilies/old/s_065.gif

Programmierer
07.01.2008, 16:28
HEy... Respekt zu der Idee. So ersetzt du durch Aufwand die benötigten Arrays. Die einzige Frage, die noch zu klären wäre, wäre die Frage, welcher Apfel gegessen wird ;)

CapSeb
07.01.2008, 16:38
Die einzige Frage, die noch zu klären wäre, wäre die Frage, welcher Apfel gegessen wird ;)
fast gammelige Äpfel schmecken doch ausgezeichnet. :D Und zudem ist das die ökonomischste Wahl...
Wenn man die von mir eben genannte "Gammelbedingung" verwendet, ist es sowieso nötig, dass man den ältesten Apfel isst. Das If fragt ja nur den ersten Apfel ab. Sonst müsste man da auch noch eine Schleife ausßenrum bauen, die leere Variablen erkennt. Reicht ja, wenn das bei der Äpfelanzahl bis hin zu einer leeren Stelle abzählt. :rolleyes:

Ohne diese VarNo wären übrigens alle Formen von größeren Datenbanken nicht möglich. Schade dass das nicht bei Pictures geht (Nummer, Größe, Farbe...).


http://www.multimediaxis.de/images/smilies/old/s_017.gif CapSeb http://www.multimediaxis.de/images/smilies/old/s_065.gif

Macavity
10.01.2008, 08:30
Mein Vorschlag wäre ein anderer, klar du brauchst die X Variablen für die entsprechende Anzahl an Äpfeln aber anstatt eines Zählers der ständig die X Werte an vorhandenen Äpfeln verändert würde ich die Zeit des Apfel-Aufnehmens in der Variablen speichern.

Der Vorteil ist das die Fäulnis des Apfels dann nur berechnet werden muss wenn der Apfel angeschaut wird (über das Inventar), oder die Fäulnis anderweitig von Interesse ist. Das dürfte schneller sein.