CNDG
Würden Sie gerne auf diese Nachricht reagieren? Erstellen Sie einen Account in wenigen Klicks oder loggen Sie sich ein, um fortzufahren.


Ein Forum, in dem sich neue Clonk Entwickler untereinander austauschen können.
 
StartseiteStartseite  PortalPortal  SuchenSuchen  Neueste BilderNeueste Bilder  AnmeldenAnmelden  LoginLogin  

 

 while in bestimmten Intervall laufen lassen

Nach unten 
4 verfasser
AutorNachricht
Bowserkoopa
Staatsrat
Staatsrat
Bowserkoopa


Männlich Alter : 30
Anmeldedatum : 21.12.08

while in bestimmten Intervall laufen lassen Empty
BeitragThema: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySa 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

Code:
public func Backwards()
{
SetAction("Backwards");

while(GetY() != PositionY)
   {
   SetPosition(GetX(),GetY()-1);
   Log("Schleife durchgeführt");
   }
Sicherung=0;
SetAction("Hanging");

}

Evt. wird der Rest des Codes noch benötigt:
Spoiler:
Nach oben Nach unten
Limeox
Admiral
Admiral
Limeox


Männlich Anmeldedatum : 25.04.10

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySa 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.
Nach oben Nach unten
Bowserkoopa
Staatsrat
Staatsrat
Bowserkoopa


Männlich Alter : 30
Anmeldedatum : 21.12.08

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySa 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?
Nach oben Nach unten
Limeox
Admiral
Admiral
Limeox


Männlich Anmeldedatum : 25.04.10

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySa 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...
Nach oben Nach unten
Pitri
Feldmarschall
Feldmarschall
Pitri


Männlich Alter : 30
Ort : Karlsruhe
Anmeldedatum : 02.03.09

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySo 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;
}

func FxCheckPositionTimer()
{
  while(GetY() != PositionY)
  {
    SetPosition(GetX(),GetY()-1);
    Log("Schleife durchgeführt");
  }
  return true;
}
Nach oben Nach unten
http://www.clonk-fanpage.lima-city.de
Limeox
Admiral
Admiral
Limeox


Männlich Anmeldedatum : 25.04.10

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySo 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.
Nach oben Nach unten
Bowserkoopa
Staatsrat
Staatsrat
Bowserkoopa


Männlich Alter : 30
Anmeldedatum : 21.12.08

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySo 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
Nach oben Nach unten
Limeox
Admiral
Admiral
Limeox


Männlich Anmeldedatum : 25.04.10

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySo Jun 06, 2010 1:41 pm

Schedule oder Effekte. Das wären die anderen Möglichkeiten.
Nach oben Nach unten
Bowserkoopa
Staatsrat
Staatsrat
Bowserkoopa


Männlich Alter : 30
Anmeldedatum : 21.12.08

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySo 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:

Actmap
Code:

[Action]
Name=Falling
Procedure=NONE
Delay=20
Length=1
Facet=45,0,40,49
NextAction=Falling
PhaseCall=Falling

Dazugehöriger PhaseCall
Code:
//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);
      }
}
Nach oben Nach unten
Limeox
Admiral
Admiral
Limeox


Männlich Anmeldedatum : 25.04.10

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptySo 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. :<
Nach oben Nach unten
Simsi
Staatssekretär
Staatssekretär
Simsi


Männlich Alter : 31
Ort : Vaihingen/Enz
Anmeldedatum : 30.03.08

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptyMo 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.
Nach oben Nach unten
Bowserkoopa
Staatsrat
Staatsrat
Bowserkoopa


Männlich Alter : 30
Anmeldedatum : 21.12.08

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptyMo 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 Wink

Spoiler:
Nach oben Nach unten
Limeox
Admiral
Admiral
Limeox


Männlich Anmeldedatum : 25.04.10

while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen EmptyMo Jun 07, 2010 2:03 pm

Ich meinte das mit den Kategorien anders. Razz 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.
Nach oben Nach unten
Gesponserte Inhalte





while in bestimmten Intervall laufen lassen Empty
BeitragThema: Re: while in bestimmten Intervall laufen lassen   while in bestimmten Intervall laufen lassen Empty

Nach oben Nach unten
 
while in bestimmten Intervall laufen lassen
Nach oben 
Seite 1 von 1
 Ähnliche Themen
-
» objekte nach einer bestimmten zeit in die han des clonkes ?
» Am Meeresboden laufen
» Script warten lassen
» Ein Objekt Zaubern lassen

Befugnisse in diesem ForumSie können in diesem Forum nicht antworten
CNDG :: Sonstiges :: Scripthilfe-
Gehe zu: