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
Jetzt gehst du nach ganz unten und fügst diesen Code ein:
Spoiler anzeigen
Jetzt gehst du in collision.h und fügst weit unten das ein:
Spoiler anzeigen
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
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
Somit ist das Tutorial beendet, ich hoffe ich konnte einigen helfen :3
Lg.
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:
[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:
[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]
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:
[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]
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:
[cpp]
bool Test(int x, int y); //hier wird der boolean von collision.cpp deklariert
[/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:
[cpp]
TILE_AIR=0,
TILE_SOLID,
TILE_DEATH,
TILE_NOHOOK,
[/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:
[cpp]
if(GameServer()->Collision()->Test((int)m_Pos.x,(int)m_Pos.y)
{
//hier kannst du irgendeincode reintun
//z.B. m_Armor++;
}
[/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.