【发布时间】:2014-01-07 04:45:07
【问题描述】:
我正在为我的游戏添加 Tile 碰撞。
我所做的是,遍历每个对象并获取它们周围的边缘图块。
我返回一个 Vec2 的向量,它对应于每个周围边缘瓦片的左上角位置。
那些被放入一组 Vec2 中,所以只有唯一的保留。
从那里,可以构建固定大小的矩形。
但是,我要求将连续的矩形合并为 1。
所以在这个例子中,我们会将这 8 个固定的矩形变成 3 个。
最右边的会保持原样。
x 轴上的 6 会变成 1,x 轴上最左边和最下面的会变成 1。
鉴于我有一个集合 Vec2 表示每个平铺正方形的左上角位置并且我知道正方形的宽度,我如何计算一个新的 Rectangle(x,y,w,h) 向量与合并的固定正方形?
void TilePhysicsManager::update()
{
m_locationSet.clear(); //clear the unique locations
for (b2Body* b = m_b2world->GetBodyList(); b; b = b->GetNext())
{
if(b->GetType() == b2_dynamicBody)
{
PhysicsObject* obj = (PhysicsObject*)b->GetUserData();
const std::vector<Vec2>& edgeTiles = m_tileWorld->getSideTiles(*obj,1.5f);
//add in locations (duplicates will be rejected)
for(int i = 0; i < edgeTiles.size(); ++i)
{
m_locationSet.insert(edgeTiles[i]);
}
}
}
int objIndex = 0; //index of which dummy object we need
for(std::set<Vec2>::iterator it = m_locationSet.begin(); it != m_locationSet.end(); ++it)
{
//if our memory pool is not big enough, grow it
if(objIndex >= count())
{
allocNewObject();
}
m_objects[objIndex]->setLocation(*it);
objIndex++;
}
}
谢谢
【问题讨论】:
-
那些连续的固定矩形几乎总是几乎相连吗?您是否需要从那些较小的矩形中生成最小的较宽矩形,或者有时接近最小数量的较宽矩形也是可以接受的?
-
@invisal 它必须是最长的连续带,否则玩家会卡在边缘。
-
最长的垂直连续带还是最长的水平连续带?哪一个?
-
@invisal 它需要同时生成它们,但它们是边缘图块,因此您最多只能拥有生成垂直和水平形状的 L 形状。