Thema: while in bestimmten Intervall laufen lassen Sa Jun 05, 2010 6:46 pm
Ich habe ein Problem mit einer while Schleife die in einem bestimmten Intervall durchlaufen sollte. Es handelt sich um ein Objekt, dass zu seiner Ausgangsposition zurückwandern soll und das habe ich versucht mit einer while-Schleife zu realisieren. Solange die Y Position nicht stimmt, soll es der Y-Koorinate eines abziehen(damits nach oben wandert). Das läuft in der Praxis so ab: Objekt fällt runter, ruft die Funktion "Backwards" auf, der Log: Schleife ausgeführt kommt einige male in der Engine, und plötzlich zaubert sich das Objekt ruckartig an seine ursprüngliche Position zurück. Ich wollte das ganze allerdings flüssiger ablaufen lassen, deshalb auch die Frage nach einem Intervall
public func Falling() { var Opfer = FindObject2(Find_OCF(OCF_CrewMember),Find_InRect(-20,-24,40,49)); while (Opfer) DoEnergy(RandomX(-5, 0), Opfer);
}
public func Hit() { //Sounds Sound("RockBreak*"); Sound("Blast2", 0, 0, 50);
if(Sicherung==0) { ScheduleCall(0,"Backwards",50); Sicherung=1; //Damit Hit nicht mehrmals aufgerufen wird Log("Hit"); }
}
//Und hier würde die Backwards-Funktion stehen
Limeox Admiral
Anmeldedatum : 25.04.10
Thema: Re: while in bestimmten Intervall laufen lassen Sa Jun 05, 2010 6:56 pm
Du lässt es einfach durch einen TimerCall oder durch einen Effekt erledigen, der jeden (oder alle 2, 3) Frames ausgeführt wird. Dort wird dann kontrolliert, ob die Positionen stimmen und falls nicht, nach oben geschoben.
Allerdings hat die Sache einen gewissen Haken: Du solltest in jedem Aufruf YDir auf 0 setzen, sonst fällt das Objekt schneller als dass es hochrutscht. Oder du machst das Objekt zu C4D_StaticBack und erst beim Fallen wechselst du auf C4D_Object. Das geht per SetCategory(GetCategory() + 15); Dann kannst du dir das ganze Zurücksetzen ersparen, denn StaticBack-Objekte bleiben schließlich da, wo sie sind. Durch das Ändern der Kategorie auf Object wirds dann erst anfällig für Schwerkraft, Explosionsdrift etc.
Bowserkoopa Staatsrat
Alter : 30 Anmeldedatum : 21.12.08
Thema: Re: while in bestimmten Intervall laufen lassen Sa Jun 05, 2010 7:46 pm
Ich hätte schwören könnnen wir hätten hier mal ein Tutorial über Effekte gehabt, aber komischerweise find ich nichs? Timer wäre unpraktisch, denn es wird ja nur in einer bestimmten Situation gebraucht, da wäre ein Effekt sinnvoller. Das mit YDir erscheint mir zwar logisch, aber dann würde es keinen Sinn ergeben wieso das Objekt sich plötzlich an die ursprungssituation "teleportiert".
EDIT: Noch eine kleine Frage viel mir ein, weil ich mich in der zwischenzeit ja mit was anderem beschäftigen muss^^ Ein Fahrzeug soll die Fähigkeit haben sich um 20° nach oben bzw unten zu richten, deswegen ja Rotate=1 in die DefCore. Was passiert -> Nur ein einziger Vertex darf unten sein damits fährt -> Fahrzeug kippt unkontrolliert hin und her + nicht möglich nach links und rechts zu fahren. Wie lösen?
Limeox Admiral
Anmeldedatum : 25.04.10
Thema: Re: while in bestimmten Intervall laufen lassen Sa Jun 05, 2010 9:27 pm
Tutorial über Effekte... mh, das wäre schon Fortgeschritten mit 7 Sternen, wenn man alles erklären will. :S Wie man das lösen soll... Antistuck? Aber das kann gewaltig buggen...
Pitri Feldmarschall
Alter : 30 Ort : Karlsruhe Anmeldedatum : 02.03.09
Thema: Re: while in bestimmten Intervall laufen lassen So Jun 06, 2010 10:19 am
Ich würde es so machen:
Code:
func Bla() //Die funktion, bei der der Effekt gestartet werden soll! {//(schon von anfang an, oder erst später?) AddEffect("CheckPosition",this,100,5,this); return true; }
Thema: Re: while in bestimmten Intervall laufen lassen So Jun 06, 2010 12:53 pm
Funktioniert trotzdem nicht, da das ganze dann trotzdem in einem Frame gemacht wird - nämlich während der while-Schleife. Ob man dafür dann die Aktion Backwards und die Variable Sicherung braucht... glaube nicht. Und wie gesagt... Mit den Kategorien rumspielen ist einfach und unkompliziert. Wenn mans dann trotzdem mit Timer macht, muss der Effekt beim Fallen entfernt werden (if (GetAction() == "Falling") return -1;), und die while-Schleife raus.
Bowserkoopa Staatsrat
Alter : 30 Anmeldedatum : 21.12.08
Thema: Re: while in bestimmten Intervall laufen lassen So Jun 06, 2010 1:28 pm
Eine überprüfung die alle 3-5 frames stattfindet ist nicht möglich? Außer einem Timer oder einem PhaseCall evt :S
Limeox Admiral
Anmeldedatum : 25.04.10
Thema: Re: while in bestimmten Intervall laufen lassen So Jun 06, 2010 1:41 pm
Schedule oder Effekte. Das wären die anderen Möglichkeiten.
Bowserkoopa Staatsrat
Alter : 30 Anmeldedatum : 21.12.08
Thema: Re: while in bestimmten Intervall laufen lassen So Jun 06, 2010 2:15 pm
Ich habe es jetzt lösen können. Ich habe eine zusätzliche Aktion mit einem PhaseCall und Delay auf 1 geschafft, while zu ersetzen. Zusätzlich musste ich noch eine weitere if Abfrage bezüglich der Überprüfung setzen ob es bereits die Position erreicht hat oder nicht und dementsprechend die Funktion beenden. Komischerweise gibts einen weiteren Haken: Das Objekt tötet alles bei einer Berührung obwohl die Überprüfung alle 20 Frames stattfindet:
//Hauen während runterfallen public func Falling() { var Opfer = FindObject2(Find_OCF(OCF_CrewMember),Find_InRect(-20,-24,40,49)); if(Opfer) { DoEnergy(RandomX(-5, 0), Opfer); } }
Limeox Admiral
Anmeldedatum : 25.04.10
Thema: Re: while in bestimmten Intervall laufen lassen So Jun 06, 2010 3:21 pm
Das Objekt beschleunigt nach unten, auch wenn du es hochsetzt. Das heißt, YDir nimmt immer mehr zu. Wenn nun ein Objekt einen Vertex berührt, hat das den gleichen Effekt, als würde das Objekt mit derselben Geschwindigkeit herunterfallen. Und das kann ziemlich schnell sein. Daher musst du YDir immer auf 0 setzen.
Aus dem Grund wäre auch das mit den Kategorien am einfachsten. :<
Simsi Staatssekretär
Alter : 31 Ort : Vaihingen/Enz Anmeldedatum : 30.03.08
Thema: Re: while in bestimmten Intervall laufen lassen Mo Jun 07, 2010 1:38 pm
Du darfst in deine ActMap nicht PhaseCall=Blabla schreiben, sondern StartCall bzw EndCall.
PhaseCall wird jede Phase (Einzelbild) aufgerufen, und Start-/EndCall eben am Start bzw. Ende der ganzen Aktion.
Bowserkoopa Staatsrat
Alter : 30 Anmeldedatum : 21.12.08
Thema: Re: while in bestimmten Intervall laufen lassen Mo Jun 07, 2010 1:51 pm
Die Lenght ist aber 1 von daher würde es keinen Unterschied machen. Ich habe jetzt den Kategorie-Vorschlag von Limeox angewandt, allerdings lies StaticBack keine Bewegung zu, daher musste ich auf C4D_Vehicle zurückgreifen. Wer wissen will, wie das ganze Skript jetzt aussieht, kann es hier finden. Vielleicht lernt ja der eine oder andere was daraus.
Aber keine Sorge, ich werde die User hier doch noch auf trab halten, denn nun versuche ich mich an einer stationären Kanone
Spoiler:
public func Check() { //Immer wieder mal vars updaten PositionY=GetY();
//Alles lebnde mal suchen if(FindObject2(Find_OCF(OCF_CrewMember),Find_InRect(-50,0,70,160))) SetAction("Falling"); }
//Hauen während runterfallen public func Falling() { SetCategory(C4D_Vehicle);
var Enemy = FindObject2(Find_OCF(OCF_CrewMember),Find_InRect(-20,-24,40,49)); if (Enemy && Fairness==1) { Punch(Enemy, 10); Fairness = 0; Schedule("Fairness=1", 50); } }
Thema: Re: while in bestimmten Intervall laufen lassen Mo Jun 07, 2010 2:03 pm
Ich meinte das mit den Kategorien anders. C4D_Vehcile und C4D_Object unterscheiden sich ja kaum. C4D_StaticBack rutscht eben nicht "aus Versehen" runter und bekommt auch keine Geschwindigkeit, daher ist das optimal. Natürlich nehme ich an, dass der Stalaktit solange an der Decke hängen soll, bis einer unten durchläuft (wie die normalen Stalaktiten). Und dein Problem schien es gewesen zu sein, dass er eventuell auch von selbst runterfällt. Ist das so richtig?
Denn dann reicht es, bei Clonkfund die Kategorie von C4D_StaticBack auf C4D_Object zu ändern, und der Rest passiert von selbst. Das ganze mit dem Wiederhochschieben fällt dann raus.
Gesponserte Inhalte
Thema: Re: while in bestimmten Intervall laufen lassen