Freeze tile problem

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • 50 ticks = 1 sekunde
      9000 ticks = 180 sekunden

      nich etwas zu viel?

      deine abfrage if(onFreeze = 1) ist falsch. mach aus dem = ein ==, da du sonst abfragst, ob onFreeze mit dem wert 1 belegt werden kann was in der regel funktioniert und so true zurückgibt.

      e: wenn ich micht irre, ist das auch der grund, für den direkten freeze beim spawnen.. versuchs einfach mal :D
    • [cpp]void CCharacter::Tick( int i = 0, int onFreeze = 0 )
      {

      if( GameServer()->Collision()->IsTile( m_Pos, TILE_FREEZE ) )
      {
      onFreeze = 1;
      i = 0;

      m_Input.m_Direction = 0;
      m_Input.m_Jump = 0;
      m_Input.m_Hook = 0;

      SetEmote( EMOTE_BLINK, 100000 );
      GiveNinja();
      }
      else
      {
      if( !onFreeze )
      return;

      if( i < 9000 )
      {
      m_Input.m_Direction = 0;
      m_Input.m_Jump = 0;
      m_Input.m_Hook = 0;

      SetEmote( EMOTE_BLINK, 100000 );
      GiveNinja();

      ++i;
      }
      else if( i > 8999 )
      {
      onFreeze = 0;
      i = 0;
      HandleNinja();
      SetEmote( EMOTE_NORMAL, 100000 );
      }
      }
      }[/cpp]

      Code ist ungetestet und evtl. sind auch übertragugnsfehler oder ähnliches drin.
      Hab auch schon eine Weile nichts mehr damit gemacht, aber das ist zumd. übersichtlicher.

      Warum hast du onFreeze und i immer neu deklariert?
      Hab da keinen tieferen Sinn gesehen, deswegen hab ich es rausgenommen - muss aber nicht stimmen.

      Statt dem Postinkrement in Zeile 23 würde ich ein Präinkrement benutzen der spart dir eine temporäre Variable (außer C++ handlet das anders als D).

      Achja und statt:

      [cpp]int onFreeze = 1;

      if( onFreeze == 1 ) { //doSth. }[/cpp]

      Würde ich einfach das nehmen:
      [cpp]int onFreeze = 1;
      if( onFreeze ) { //doSth. }[/cpp]


      Deine Variante 'kostet' nur einen Vergleich mehr weil du letztendlich das machst:
      1 == 1 -> true == true -> true
      Aber 1 ist selbst ja schon true, also hast du letztendlich das: if( 1 ) -> if( true ).
      Noch ein Vergleich mehr brauchst du da nicht.

      Hoffe es hat etwas geholfen, wenn nicht ist es auch nicht schlimm.

      Und verbessert mich bitte, wenn ich das mit der Variablendeklaration nicht gerafft habe..

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von lush () aus folgendem Grund: Bugfix

    • Wusste nicht ob onFreeze über ein Interface oder ähnliches definiert ist, ist ja nur ein Code-Ausschnitt ::P:
      Dachte da würde was tieferes dahinter stecken, weil ich int für sowas eben immer nur benutze, wenn bool nicht geht :))

      Im Teeworlds-Code ist das soweit ich mich erinnere auch öfter mal so x.X
    • Das else-if geht schon, macht es aber meiner Meinung nach weniger lesbar, weil es keinen direkt ins Auge fallenden Zusammenhang zwischen

      GameServer()->Collision()->IsTile(...) und onFreeze gibt (zumd. sehe ich ihn nicht direkt beim coden).

      Deshalb finde ich es so besser, obwohl es dasselbe macht ::P:

      Ist aber nicht schlimm, weil der Compiler so oder so etwas ähnliches generieren würde, nur dass es so besser zu lesen ist.
    • Ich bevorzuge es, nur eine Variable zu nehmen, in diesem Fall ein Tick-Zähler für den gefrorenen Zustand (m_FrozenTick) als Member der Klasse CCharacter deklariert (wie bereits von Malek vorgeschlagen). So ist man nur gefroren, wenn m_FrozenTick > 0 ist.

      Eine Änderung der Funktionsparameter von Tick() ist ohne weiteres nicht möglich, da diese Funktion von der Basisklasse CEntity geerbt wird.

      Ungetestet, mit Pre-Dekrement[cpp]
      void CCharacter::Tick(){
      if(GameServer()->Collision()->IsTile(m_Pos,TILE_FREEZE))
      m_FrozenTick = Server()->TickSpeed()*3;
      if(m_FrozenTick > 0)
      {
      --m_FrozenTick;
      ResetInput();
      SetEmote(EMOTE_BLINK, Server()->Tick()+1);
      GiveNinja();
      }
      ... //weiterer Inhalt von Tick(), weshalb die Lösung mit return; nicht gut ist.
      }
      [/cpp]
      für die Header-Datei reicht ein simples:
      [cpp]
      int m_FrozenTick;
      [/cpp]
      Und in der Spawn-Funktion noch:
      [cpp]bool CCharacter::Spawn(CPlayer *pPlayer, vec2 Pos){

      m_FrozenTick = 0;
      ...}
      [/cpp]
      Damit wir ohne Initialisierung keine bösen Werte bekommen.

      PS:

      um zu vermeiden, dass man danach auch weiter Ninja hat, kann man z.B. die Zeit herunter setzen:

      [cpp]m_Ninja.m_ActivationTick = Server()->Tick()-(g_pData->m_Weapons.m_Ninja.m_Duration * Server()->TickSpeed() / 1000);[/cpp]

      zum Kommentar von Assa: Wer mag, mit Damage-Indikatoren :)

      [cpp]if((m_FrozenTick%Server()->TickSpeed()) == 0)
      GameServer()->CreateDamageInd(m_Pos, 0, (int)(m_FrozenTick/Server()->TickSpeed()));[/cpp]

      Gruß Pata

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Patafix ()

    • Pikotee schrieb:

      HI,

      wenn's nicht klappt adde mich einfach in Skype, dann helfe ich dir weiter.

      In wahrheit ist weniger aufwand notwendig :)

      MfG. Piko

      so leute ey. in nem jahr googlet mal irgendjmd genau das problem, findet diesen thread und ist mega abgefuckt, weil du nicht die lösung postest. in der lage war sicher jeder schon mal, und trd gibt es noch leute, die "in wahrheit weniger aufwand ;));;;;;" posten, oder noch besser "ok, hat sich erledigt, hab die lösung, war ganz leicht hurr durrxdxd"

      sorry für ot :(
    • Naja ich bin ewas zu faul um den Code zu testen, etc.

      Außerdem kann Marcelly den Code danach hier ja gerne posten.

      Zudem ist es denke ich besser, als "mach's selbst" oder "google doch" zu schreiben.

      Ach ja, bevor einige hier schreiben, dass der code nicht funktioniert, da die variable "m_FozenTick" nicht deklariert ist, einfach mal ein 'r' hinzufügen :)

      MfG. Piko