[Lösung]Wie mache ich ein Jetpack?

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

    • [Lösung]Wie mache ich ein Jetpack?

      Hey,

      ich wollte auch mal eine kleines Tutorial machen, das auch sehr einfach ist.
      Vorher lest ihr euch bitte diesen Thread an: Erste Schritte (von Patafix)

      Als erstes öffnet ihr die character.cpp die findet ihr hier:
      TW-Src/src/game/server/entities/character.cpp

      Nun sucht ihr:

      Quellcode

      1. case WEAPON_HAMMER:


      Nun habt ihr den ganz Normale Hammercode, der müsste so aussehen:

      Quellcode

      1. case WEAPON_HAMMER:
      2. {
      3. // reset objects Hit
      4. m_NumObjectsHit = 0;
      5. GameServer()->CreateSound(m_Pos, SOUND_HAMMER_FIRE);
      6. CCharacter *apEnts[MAX_CLIENTS];
      7. int Hits = 0;
      8. int Num = GameServer()->m_World.FindEntities(ProjStartPos, m_ProximityRadius*0.5f, (CEntity**)apEnts,
      9. MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER);
      10. for (int i = 0; i < Num; ++i)
      11. {
      12. CCharacter *pTarget = apEnts[i];
      13. if ((pTarget == this) || GameServer()->Collision()->IntersectLine(ProjStartPos, pTarget->m_Pos, NULL, NULL))
      14. continue;
      15. // set his velocity to fast upward (for now)
      16. if(length(pTarget->m_Pos-ProjStartPos) > 0.0f)
      17. GameServer()->CreateHammerHit(pTarget->m_Pos-normalize(pTarget->m_Pos-ProjStartPos)*m_ProximityRadius*0.5f);
      18. else
      19. GameServer()->CreateHammerHit(ProjStartPos);
      20. vec2 Dir;
      21. if (length(pTarget->m_Pos - m_Pos) > 0.0f)
      22. Dir = normalize(pTarget->m_Pos - m_Pos);
      23. else
      24. Dir = vec2(0.f, -1.f);
      25. pTarget->TakeDamage(vec2(0.f, -1.f) + normalize(Dir + vec2(0.f, -1.1f)) * 10.0f, g_pData->m_Weapons.m_Hammer.m_pBase->m_Damage,
      26. m_pPlayer->GetCID(), m_ActiveWeapon);
      27. Hits++;
      28. }
      29. // if we Hit anything, we have to wait for the reload
      30. if(Hits)
      31. m_ReloadTimer = Server()->TickSpeed()/10;
      32. }break;
      Alles anzeigen


      So jetzt müsst ihr unter:

      Quellcode

      1. MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER);


      diesen Code einfügen:

      Quellcode

      1. GameServer()->CreateSound(m_Pos, SOUND_HAMMER_FIRE);
      2. GameServer()->CreateExplosion((-Direction+m_Pos), m_pPlayer->GetCID(), WEAPON_HAMMER, false);
      3. GameServer()->CreateSound((-Direction+m_Pos), SOUND_GRENADE_EXPLODE) // Wenn sich der Sound scheiße anhört könnt ihr diese Zeile einfach löschen.


      Zur erklärung:
      Durch GameServer()->CreateSound(m_Pos, SOUND_HAMMER_FIRE); wird beim klicken(fire 'mouse1') ein Ton ausgegeben.
      Wie ich das ungefähr sagen soll weiß ich nicht.

      Quellcode

      1. GameServer()->CreateSound((-Direction+m_Pos), SOUND_GRENADE_EXPLODE)

      Ihr seht noch ein Code womit man beim Aktivieren des Hammers einen Ton ausgibt.
      Dieser gibt die Explosion eine Grenade aus. Natürlich den Sound von Teeworlds..

      Jetzt sehen wir uns den Code in der Mitte an(ich bin mir nicht sicher ob das jetzt richtig sein wird)

      Quellcode

      1. GameServer()->CreateExplosion((-Direction+m_Pos), m_pPlayer->GetCID(), WEAPON_HAMMER, false);

      Man sieht das dieser Code eine Explosion erzeugt. Durch diese Explosion wird der Spieler durch die Luft befördert,
      jenachdem in welche Richtung man den Cursor auf dem Bildschirm hält/zeigt.
      Ich weiß jetzt nicht alles wozu das alles sein soll, da ich ein paar Dinge aus anderen Sourcen nehme,
      da diese für mich zum lernen sehr hilfreich sind.




      Jetzt müsst ihr den Server nur noch Compillen.
      Wenn ihr im Ingame seit, braucht ihr nur noch den
      Hammer benutzten und schon fliegt ihr durch die Map ;)

      PS: Wenn ein erfahrender Coder Fehler findet, möge der sich bitte bei mir melden :P
      PSS: Editet.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von moritz. ()

    • Ich hab zwar keine Ahnung von der TW source aber eigentlich erklärt sich das von selbst.

      Wenn man mit dem Hammer zuschlägt, dann

      wird einmal CreateSound mit dem Hammersound als Parameter aufgerufen und zwar an der stelle wo man sich befindet
      danach wird eine Explosion erzeugt (sowie die einer rocket) undzwar an der Stelle an der man sich befindet
      Zu guter letzt wird der Sound einer rocket eingespielt (was man auch weglassen könnte)

      Es funktioniert weil eine Explosion einen ja bekanntlich wegdrückt und dadurch, dass die Explosion genau auf dir (oder evtl etwas unter dir) zündet wirst du nach oben gedrückt, allerdings wäre es in der normalen mod nicht ratsam dies einzufügen, weil man durch eine Explosion leben verliert oder muss dafür noch eine Funktion aufgerufen werden?
    • Ja du hast vollkommen recht - ich selbst könnte das mir jetzt auch erklären jedoch gehört für ganz Neulinge so etwas dazu. Vorallem bei so Sachen wie:
      GameServer()->CreateExplosion((-Direction+m_Pos), m_pPlayer->GetCID(), WEAPON_HAMMER, false);

      Ja aber Tutorials sollten nicht nur eine Lösung erbringen sondern einen auch erklären wie man auf die Lösung kommt.
    • schon besser ;)
      Noch schöner wäre es, wenn der Code selber kommentiert wäre ( das setz ich mich dann aber bald ran, also ne kommentierte Tw-Source).
      Worauf du achten solltest, wenn du ein Tutorial machst ( ja ich weiß da steht Lösung, aber dann heißt das Thema "Wie mache ich ein Jetpack" >> Tutorial^^)
      dass du nicht einfach den code gibts und den dann zeile für zeile erklärst, sondern eine Herleitung geben, womit der User den Gedanken hinter dem Code nachvollziehen kann.
      also erstmal das Ziel festlegen, dann den Weg suchen (wie könnte man das Ziel erreichen, bzw. wie könnte man es coden), dann den Weg beschreiben (das wäre halt wie man das, dass man coden möchte formuliert und einbindet ;) )
      (hab ich bei meinem Tutorial versucht, die betonung liegt auf versucht ;) )