Wie füge ich ein neues Tile ein?

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

    • Wie füge ich ein neues Tile ein?

      Moin,

      hab mal wieder ein kleines Tutorial zusammengebastelt: Wie füge ich ein neues Tile ein.
      Für die Leute, die nicht wissen was ein Tile ist:
      Ein Tile ist eine "Position" in der Map wie z.B. ein Mapres von grass_main.png. Aber
      den Tile, dass ich meine ist ein anderes. Damit gemeint ist: Wenn man den Tile berührt
      (o.a. collidiert) kann irgendeine Funktion aufgerufen werden. Z.B. könnte man, wenn
      man den Tile berührt zb. 10 Armor oder 10 Health dazubekommen. Heute ist unser Ziel
      am Ende des Tutorials ein neuen Tile erstellt zu haben, worin du irgendein Code einfügen kannst
      der ausgeführt wird, wenn du dieses Tile berührst.

      Was du brauchts, um dem Tutorial gut folgen zu können:
      Collision.cpp (Source: src/game/collision.cpp)
      Collisiion.h (Source: src/game/collision.h)
      Mapitems.h (Scoure: src/game/mapitems.h)
      Character.cpp (Source: src/game/server/entities/character.cpp)

      Zuerst öffnest du collision.cpp/.h und mapitems.h.
      In collision.cpp suchst du void CCollision::Init(class CLayers *pLayers). Die
      komplette Funktion sollte dann so aussehen:

      void CCollision::Init(class CLayers *pLayers)

      [cpp]void CCollision::Init(class CLayers *pLayers)
      {
      m_pLayers = pLayers;
      m_Width = m_pLayers->GameLayer()->m_Width;
      m_Height = m_pLayers->GameLayer()->m_Height;
      m_pTiles = static_cast<CTile *>(m_pLayers->Map()->GetData(m_pLayers->GameLayer()->m_Data));

      for(int i = 0; i < m_Width*m_Height; i++)
      {
      int Index = m_pTiles.m_Index;

      if(Index > 128)
      continue;

      switch(Index)
      {
      case TILE_DEATH:
      m_pTiles[i].m_Index = COLFLAG_DEATH;
      break;
      case TILE_SOLID:
      m_pTiles[i].m_Index = COLFLAG_SOLID;
      break;
      case TILE_NOHOOK:
      m_pTiles[i].m_Index = COLFLAG_SOLID|COLFLAG_NOHOOK;
      break;
      default:
      m_pTiles[i].m_Index = 0;
      }
      }
      }[/cpp]


      Unter m_pTiles[i].m_Index = 0; }
      brauchst du nur das einfügen:
      Spoiler anzeigen
      [cpp]
      if(Index == TILE_TEST) //hier wird abgefragt, ob Index gleich TILE_TEST ist
      m_pTiles[i].m_Index = Index; //wenn dem so ist, ist TILE_TEST gleich m_Index.
      [/cpp]


      Jetzt gehst du nach ganz unten und fügst diesen Code ein:
      Spoiler anzeigen
      [cpp]
      bool CCollision::Test(int x, int y) //boolean für den Tile: Test
      {
      int Nx = clamp(x/32, 0, m_Width-1); //hier wird ein integer deklariert -> Nx
      int Ny = clamp(y/32, 0, m_Height-1); //hier wird ebenfalls ein integer deklaiert -> Ny

      return m_pTiles[Ny*m_Width+Nx].m_Index == TILE_TEST; //hier wird der Tile Test "returnt/wiederholt".
      }
      [/cpp]


      Jetzt gehst du in collision.h und fügst weit unten das ein:
      Spoiler anzeigen
      [cpp]
      bool Test(int x, int y); //hier wird der boolean von collision.cpp deklariert
      [/cpp]


      Nachdem du das erledigt hast, kommen wir zu einer sehr wichtige Sache. Die Positionierung des
      Tiles in der Entities.png. Dazu brauchst du noch ein gut brauchbares Bild:
      Numered Entities - by ZetaHoernchen
      Um die Position gut zu bestimmen, solltest du stets die entities.png nebenbei offen haben.

      In mapitems.h suchst du nun das:
      Spoiler anzeigen
      [cpp]
      TILE_AIR=0,
      TILE_SOLID,
      TILE_DEATH,
      TILE_NOHOOK,
      [/cpp]

      Jetzt brauchst du noch diesen Code unter TILE_NOHOOK hinzufügen: TILE_TEST=176;
      Die Position des Tiles Test ist nun über dem Spawnpoint für DM.

      Jetzt gehst du in Character.cpp und suchst dir die Funktion void CCharacter::Tick();
      Um den Tile TEST abzufragen brauchst du diese If-Anweisung:
      Spoiler anzeigen
      [cpp]
      if(GameServer()->Collision()->Test((int)m_Pos.x,(int)m_Pos.y)
      {
      //hier kannst du irgendeincode reintun
      //z.B. m_Armor++;
      }
      [/cpp]


      Somit ist das Tutorial beendet, ich hoffe ich konnte einigen helfen :3

      Lg.
    • Wenn TILE_TEST=176 ist, dann ist
      [cpp]if(Index == TILE_TEST) //hier wird abgefragt, ob Index gleich TILE_TEST ist
      m_pTiles.m_Index = Index; //wenn dem so ist, ist TILE_TEST gleich m_Index.[/cpp]
      komplett sinnlos, weil der Index eh schon so gesetzt ist und die Anweisung eh nicht erreicht wird, da vorher das mit dem continue steht ;)

      Das muss man nur machen, wenn der Index <= 128 ist. Dann sollte man aber auch die Collisionsflags nutzen oder den Check in GetTile etwas abändern, damit es nicht zu ungewolltem Verhalten kommt.
    • Sushi schrieb:

      Wenn TILE_TEST=176 ist, dann ist
      [cpp]if(Index == TILE_TEST) //hier wird abgefragt, ob Index gleich TILE_TEST ist
      m_pTiles.m_Index = Index; //wenn dem so ist, ist TILE_TEST gleich m_Index.[/cpp]
      komplett sinnlos, weil der Index eh schon so gesetzt ist und die Anweisung eh nicht erreicht wird, da vorher das mit dem continue steht ;)

      Das muss man nur machen, wenn der Index <= 128 ist. Dann sollte man aber auch die Collisionsflags nutzen oder den Check in GetTile etwas abändern, damit es nicht zu ungewolltem Verhalten kommt.


      Nope, funzt sonst nicht richtig. Habe das selbst ohne diese Abfrage versucht und das Tile wurde nicht erkannt.
      Deshalb würde ich die Abfrage empfehlen.
    • Assa schrieb:

      Toast schrieb:

      if(GameServer()->Collision()->Test((int)m_Pos.x,(int)m_Pos.y)


      Wie will man das Einrücken??
      Das nicht, aber guck dir mal den ersten Spoiler an, den kann man schon einrücken.
      Zitate

      Marik schrieb:

      Keine Angst ich für meinen Teil halt von DDrace genauso viel wie von City :P beides fürn Kübel

      Heliux schrieb:

      Ganz Ehrlich?
      Hast du auch mal an Kritik gedacht?
      Was er verbessern kann?
      Was er falsch gemacht hat?
      Welche Bilde findest du insbesondere schlecht?
    • Hey, anstelle für jedes teil eine neue funktion in collision.cpp zu erstellen, lässt sich das alles zusammenfassen, denn es wäre alles viel zu aufwendig:

      Einfach in collision.cpp:

      Spoiler anzeigen

      [cpp]bool CCollision::GetHitPos(int x, int y, int Index) //x Position des Spielers, y Position des Spielers, Tile Sorte
      {
      int Nx = clamp(x/32, 0, m_Width-1);
      int Ny = clamp(y/32, 0, m_Height-1);
      return m_pTiles[Ny*m_Width+Nx].m_Index == Index; //Vergleiche vorher, nur allgemein
      }[/cpp]

      in collision.h wieder ganz unten (Anstelle bool Test(int x, int y))
      Spoiler anzeigen

      [cpp]bool GetHitPos(int x, int y, int Index); //x Position des Spielers, y Position des Spielers, Tile Sorte[/cpp]

      in character.cpp muss man dann nurnoch die Funktion aufrufen (Hier Teil Test) im Tick() (Siehe Tutorial)
      Spoiler anzeigen

      [cpp]if(GameServer()->Collision()->GetHitPos((int)m_Pos.x, (int)m_Pos.y, TILE_TEST))
      {
      //Füge ein, wass passieren soll, wenn man TILE_TEST betritt
      }[/cpp]


      Dies ist ein riesiger vorteil, denn wenn man ein neues Tile machen will, muss man es nur in mapitems.h (wie im Tutorial) definieren und braucht nurnoch in character.cpp (in Tick() ) reinschreiben:

      Spoiler anzeigen

      [cpp]if(GameServer()->Collision()->GetHitPos((int)m_Pos.x, (int)m_Pos.y, TILE_IRGENDWAS))
      {
      //Füge ein, wass passieren soll, wenn man TILE_IRGENDWAS betritt
      }[/cpp]


      Ich hoffe es wird den Anfängern unter euch noch ein bisschen weiter Helfen :))

    • Ich wollte das ganze auch einmal ausprobieren, hab aber jedes mal diese Fehle ausgespuckt bekommen, weiß der wer vllt. Rat?


      C:\Users\djo\Desktop\TW-CITY\Mod\teeworlds-crapmod>..\bam-0.4.0\bam
      [1/3] #1 c++ src/game/collision.cpp
      src/game/collision.cpp(65) : error C2601: 'CCollision::GetHitPos': Lokale Funkti
      onsdefinitionen sind unzulässig
      src/game/collision.cpp(52): Diese Zeile enthält eine '{', die keine Ents
      prechung hat
      bam: 'objs/game/collision_d.obj' error 2
      bam: error: a build step failed

      C:\Users\djo\Desktop\TW-CITY\Mod\teeworlds-crapmod>