我是这个领域的新手,在我的项目模块之一的简单平台游戏中遇到了太多麻烦 如果你们可以帮助或分享一些代码。这就是我到目前为止所做的。
我可以解析Tmx Map(使用平铺地图编辑器创建)并使用TmxParser库显示它,但我不知道如何处理Map Object,虽然我可以上网如何解析也使用了一个给出的例子自己的图书馆。但我不擅长编程,我想分享代码。
目标:制作一个简单的平台游戏,让玩家可以移动和跳跃 使用的工具:C ++,Tiled,tmxparser和SDL
请提前帮助谢谢! 这是我的代码
#include <iostream>
#include <map>
#include <string>
#include <SDL2/SDL.h>
#include <SDL2/SDL_events.h>
#include <SDL2/SDL_image.h>
#include <tmxparser/Tmx.h>
#include <tmxparser/TmxLayer.h>
#include <tmxparser/TmxMap.h>
#include <tmxparser/TmxMapTile.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{ SDL_Window *sdlWindow;
SDL_Renderer *sdlRenderer;
SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_MAXIMIZED, &sdlWindow, &sdlRenderer);
SDL_SetWindowTitle(sdlWindow, "Tiled Test");
SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 0, 255);
SDL_RenderClear(sdlRenderer);
SDL_RenderPresent(sdlRenderer);
SDL_Event event;
SDL_Texture* background = SDL_CreateTexture(sdlRenderer,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
640, 480);
Tmx::Map *map = new Tmx::Map();
std::string fileName = (argc > 1) ? argv[1] : "./example/example.tmx";
map->ParseFile(fileName);
if (map->HasError())
{
printf("error code: %d\n", map->GetErrorCode());
printf("error text: %s\n", map->GetErrorText().c_str());
return map->GetErrorCode();
}
printf("====================================\n");
printf("Map\n");
printf("====================================\n");
printf("Version: %1.1f\n", map->GetVersion());
printf("Orientation: %d\n", map->GetOrientation());
if (!map->GetBackgroundColor().empty())
printf("Background Color (hex): %s\n",
map->GetBackgroundColor().c_str());
printf("Render Order: %d\n", map->GetRenderOrder());
if (map->GetStaggerAxis())
printf("Stagger Axis: %d\n", map->GetStaggerAxis());
if (map->GetStaggerIndex())
printf("Stagger Index: %d\n", map->GetStaggerIndex());
printf("Width: %d\n", map->GetWidth());
printf("Height: %d\n", map->GetHeight());
printf("Tile Width: %d\n", map->GetTileWidth());
printf("Tile Height: %d\n", map->GetTileHeight());
std::map<const char*, SDL_Texture*> tilesets;
// Iterate through the tilesets.
for (int i = 0; i < map->GetNumTilesets(); ++i)
{
printf(" \n");
printf("====================================\n");
printf("Tileset : %02d\n", i);
printf("====================================\n");
// Get a tileset.
const Tmx::Tileset *tileset = map->GetTileset(i);
// Print tileset information.
printf("Name: %s\n", tileset->GetName().c_str());
printf("Margin: %d\n", tileset->GetMargin());
printf("Spacing: %d\n", tileset->GetSpacing());
printf("First gid: %d\n", tileset->GetFirstGid());
printf("Image Width: %d\n", tileset->GetImage()->GetWidth());
printf("Image Height: %d\n", tileset->GetImage()->GetHeight());
printf("Image Source: %s\n", tileset->GetImage()->GetSource().c_str());
//create tecture for tileset
std::string location = "./example/" + tileset->GetImage()->GetSource();
tilesets.insert(std::pair<const char*, SDL_Texture*>(tileset->GetName().c_str(), SDL_CreateTextureFromSurface(sdlRenderer, IMG_Load(location.c_str()))));
if (!tileset->GetImage()->GetTransparentColor().empty())
printf("Transparent Color (hex): %s\n",
tileset->GetImage()->GetTransparentColor().c_str());
if (tileset->GetTiles().size() > 0)
{
// Get a tile from the tileset.
const Tmx::Tile *tile = *(tileset->GetTiles().begin());
// Print the properties of a tile.
std::map<std::string, std::string> list =
tile->GetProperties().GetList();
std::map<std::string, std::string>::iterator iter;
for (iter = list.begin(); iter != list.end(); ++iter)
{
printf("%s = %s\n", iter->first.c_str(), iter->second.c_str());
}
if (tile->IsAnimated())
{
printf(
"Tile is animated: %d frames with total duration of %dms.\n",
tile->GetFrameCount(), tile->GetTotalDuration());
const std::vector<Tmx::AnimationFrame> &frames =
tile->GetFrames();
int i = 0;
for (std::vector<Tmx::AnimationFrame>::const_iterator it =
frames.begin(); it != frames.end(); it++, i++)
{
printf("\tFrame %d: Tile ID = %d, Duration = %dms\n", i,
it->GetTileID(), it->GetDuration());
}
}
if(tile->HasObjects())
{
printf(
"Tile has objects.\n");
// Iterate through all Collision objects in the tile.
for (int j = 0; j < tile->GetNumObjects(); ++j)
{
// Get an object.
const Tmx::Object *object = tile->GetObject(j);
// Print information about the object.
printf("Object Name: %s\n", object->GetName().c_str());
printf("Object Position: (%03d, %03d)\n", object->GetX(),
object->GetY());
printf("Object Size: (%03d, %03d)\n", object->GetWidth(),
object->GetHeight());
// Print Polygon points.
const Tmx::Polygon *polygon = object->GetPolygon();
if (polygon != 0)
{
for (int i = 0; i < polygon->GetNumPoints(); i++)
{
const Tmx::Point &point = polygon->GetPoint(i);
printf("Object Polygon: Point %d: (%f, %f)\n", i, point.x,
point.y);
}
}
// Print Polyline points.
const Tmx::Polyline *polyline = object->GetPolyline();
if (polyline != 0)
{
for (int i = 0; i < polyline->GetNumPoints(); i++)
{
const Tmx::Point &point = polyline->GetPoint(i);
printf("Object Polyline: Point %d: (%f, %f)\n", i, point.x,
point.y);
}
}
}
}
}
}
// Iterate through the tile layers.
for (int i = 0; i < map->GetNumTileLayers(); ++i)
{
printf(" \n");
printf("====================================\n");
printf("Layer : %02d/%s \n", i, map->GetTileLayer(i)->GetName().c_str());
printf("====================================\n");
// Get a layer.
const Tmx::TileLayer *tileLayer = map->GetTileLayer(i);
for (int y = 0; y < tileLayer->GetHeight(); ++y)
{
for (int x = 0; x < tileLayer->GetWidth(); ++x)
{
if (tileLayer->GetTileTilesetIndex(x, y) == -1)
{
printf("........ ");
}
else
{
// Get the tile's id and gid.
printf("%03d(%03d)", tileLayer->GetTileId(x, y), tileLayer->GetTileGid(x, y));
const Tmx::Tileset *tileset = map->GetTileset(tileLayer->GetTile(x,y).tilesetId);//map->FindTileset(layer->GetTileId(x, y));
if (tileset != 0)
{
SDL_Rect rect; rect.x = x*tileset->GetTileWidth(); rect.y=y*tileset->GetTileHeight();rect.w=tileset->GetTileWidth();rect.h=tileset->GetTileHeight();
const Tmx::MapTile *tile = &tileLayer->GetTile(x,y);
tilesets.find(tileset->GetName().c_str());
int tilesPerRow = tileset->GetImage()->GetWidth() / tileset->GetTileWidth();
int tilyyyy = (tileLayer->GetTileId(x, y)) / tilesPerRow;
SDL_Rect srcRect; srcRect.x = ((tileLayer->GetTileId(x, y) - (tilyyyy*tilesPerRow))*tileset->GetTileWidth()); srcRect.y = tilyyyy*tileset->GetTileHeight(), srcRect.h = tileset->GetTileHeight(); srcRect.w = tileset->GetTileWidth();
SDL_Texture* tester = tilesets.find(tileset->GetName().c_str())->second;
SDL_RenderCopy(sdlRenderer, tester, &srcRect,&rect);
SDL_RenderPresent(sdlRenderer);
}
// Find a tileset for that id.
//const Tmx::Tileset *tileset = map->FindTileset(layer->GetTileId(x, y));
if (tileLayer->IsTileFlippedHorizontally(x, y))
{
printf("h");
}
else
{
printf(" ");
}
if (tileLayer->IsTileFlippedVertically(x, y))
{
printf("v");
}
else
{
printf(" ");
}
if (tileLayer->IsTileFlippedDiagonally(x, y))
{
printf("d ");
}
else
{
printf(" ");
}
}
}
printf("\n");
}
}
printf("\n\n");
// Iterate through all of the object groups.
for (int i = 0; i < map->GetNumObjectGroups(); ++i)
{
printf(" \n");
printf("====================================\n");
printf("Object group : %02d\n", i);
printf("====================================\n");
// Get an object group.
const Tmx::ObjectGroup *objectGroup = map->GetObjectGroup(i);
// Iterate through all objects in the object group.
for (int j = 0; j < objectGroup->GetNumObjects(); ++j)
{
// Get an object.
const Tmx::Object *object = objectGroup->GetObject(j);
// Print information about the object.
printf("Object Name: %s\n", object->GetName().c_str());
printf("Object Position: (%03d, %03d)\n", object->GetX(),
object->GetY());
printf("Object Size: (%03d, %03d)\n", object->GetWidth(),
object->GetHeight());
// Print Polygon points.
const Tmx::Polygon *polygon = object->GetPolygon();
if (polygon != 0)
{
for (int i = 0; i < polygon->GetNumPoints(); i++)
{
const Tmx::Point &point = polygon->GetPoint(i);
printf("Object Polygon: Point %d: (%f, %f)\n", i, point.x,
point.y);
}
}
// Print Polyline points.
const Tmx::Polyline *polyline = object->GetPolyline();
if (polyline != 0)
{
for (int i = 0; i < polyline->GetNumPoints(); i++)
{
const Tmx::Point &point = polyline->GetPoint(i);
printf("Object Polyline: Point %d: (%f, %f)\n", i, point.x,
point.y);
}
}
}
}
delete map;
bool quit = false;
while (!quit)
{
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
}
SDL_DestroyRenderer(sdlRenderer);
SDL_DestroyWindow(sdlWindow);
SDL_Quit();
return 0;
return 0;
}
答案 0 :(得分:0)
代码工作正常,应该能够显示example.tmx没有问题(确保你有一个&#34;示例&#34;目录中包含所需的文件)。至于有关Map对象的信息,我不会想到除了阅读平铺地图格式之外的其他方式(可在此处获取:http://doc.mapeditor.org/reference/tmx-map-format/)。如果您还有其他问题,也可以从Tiled的论坛(http://forum.mapeditor.org/)获得帮助。
至于你的目标&#34;制作一个简单的平台游戏,让玩家可以移动和跳跃#34;这本身就是一个相当广泛的主题,我认为不能完全回答这里。
希望有所帮助。