我需要有关课程相关问题的帮助。我知道如何解决它,但我想知道是否有比我现在的想法更好的解决方案。
每个 Class Tile Object
和 Class Player Object
都有 x 和 y 位置。我想知道是否有办法加快处理。我目前的想法是if-else
这样的陈述:
if(x==1) {
if(y==1) {
return tileone1;
} else if(y==2) {
return tileone2;
} else if(y==3) {
return tileone3;
} else if(y==4) {
return tileone4;
} else if(y==5) {
return tileone5;
} //......
} else if(x==2) {
if(y==1) {
return tiletwo1;
} else if(y==2) {
return tiletwo2;
} else if(y==3) {
return tiletwo3;
} else if(y==4) {
return tiletwo4;
} else if(y==5) {
return tiletwo5;
} //......
} //......
问题是为每个瓷砖写这个都需要花费太长时间。
我需要一个函数,它将根据Object Player
的x和y输入返回Tile对象。任何其他解决方案都会很棒。
Tile getTileBasedOnCoords(int x, int y){
}
答案 0 :(得分:1)
有多种方法可以实现这一目标。最简单的似乎是(给出问题)是将所有Tile对象放入数组中,并返回具有相应索引的对象。
答案 1 :(得分:0)
使用带有提供x和y值的自定义键的地图。这样您就可以直接访问磁贴,而无需将每个磁贴与玩家位置进行比较(请参阅以下代码中的getSectorByCoordinate()
)。
struct CSectorCoordinate
{
private:
int mX;
int mY;
public:
CSectorCoordinate();
CSectorCoordinate(int aX, int aY);
bool operator() (const CSectorCoordinate & a, const CSectorCoordinate & b) const;
int getX();
int getY();
};
...
bool CSectorCoordinate::operator() (const CSectorCoordinate & a, const CSectorCoordinate & b) const
{
// note: the following conditions ensure a strict weak ordering (see documentation of std::map)
if (a.mX < b.mX)
return true;
if (b.mX < a.mX)
return false;
return a.mY < b.mY;
}
...
typedef std::map<CSectorCoordinate, Configuration::CSectorEntity *, CSectorCoordinate> CSectorCoordinateMap;
CSectorCoordinateMap mSectorCoordinateMap;
...
bool CSectorEntityConfigurationBunch::getSectorByCoordinate(int aX, int aY, Configuration::CSectorEntity * & prSector)
{
CSectorCoordinateMap::const_iterator i(mSectorCoordinateMap.find(CSectorCoordinate(aX, aY)));
if (i != mSectorCoordinateMap.end())
prSector = i->second;
else
prSector = 0;
return prSector;
}