В настоящее время я рефакторинг кода и одна из вещей, которые я хочу улучшить, это мой код менеджера сущностей. Точнее, функция обновления, где сущности обновляются. Мой движок - это 2D-мозаичный движок, который я использую для игры в iphone. Идея, которая у меня была, заключалась в том, чтобы обновление объекта было разделено на несколько задач, потому что я готов переходить к компонентам на основе компонентов, когда у меня есть время. Это физическая задача, задача обнаружения столкновения, задача AI и т. Д.Мнение организатора цикла
В течение длительного времени я использовал простую функцию update() для моего обновления сущности, вызванного менеджером сущности в цикле. Теперь я столкнулся с другим путем, чтобы сделать это (в конце концов, это то же самое), но дает мне некоторые преимущества, такие как, например, различные тики для различных задач (физика может работать с разной частотой обновления, чем столкновения и т. Д.)
Адрес источника. Я был бы очень рад, если бы кто-нибудь мог комментировать, давать мнения или улучшать его. К сожалению ти является ObjC, но я думаю, что это довольно легко понять:
//Run the update process o nall entities.
for(int i=0; i< numGameObjects;++i)
{
GameObject* go=_entities[i];
//If this game object was marked to be delted don't do any process with it.
//It will be released when update loop is finished.
if(! [go isToBeDeleted])
{
//Player does its physics (Movement, etc...)
//We save old position to let the onMapCollision know
//The previous position before physics were applied.
CGPoint oldPos=[go position];
[go doPhysics];
if([go collisionEnabled])
{
//Check collisions against map
CollisionMask collisionMask=[go collisionMask];
if(collisionMask & MapEntity)
{
bool collision=[self checkEntityVsMapCollision:go];
if(collision==true)
[go onMapCollision:oldPos];
}
//Check collisions against other entities (just the ones that have not been checked previously)
for(int j=i+1; j < numGameObjects; ++j)
{
GameObject* otherGO= _entities[j];
EntityType type=[go type];
if((collisionMask & type) && [go collidesWith:otherGO])
{
[go onEntityCollision:otherGO];
[otherGO onEntityCollision:go];
}
}
}
//Execute AI for this game object
[go doLogic];
}
}
Там могут быть некоторые sintactical ошибки в коде, но я просто хотел показать идею. Извините за длинный вопрос, но я думал, что должен объяснить все как можно яснее.
Заранее спасибо.
Спасибо за комментарии. Действительно поучительный. – Notbad
Извините за то, что я не совсем прочитал ваш ответ вчера, я был в спешке. Я исправил код для части _player. Он должен был читать «идти» не «_player». OldPos var - это просто, чтобы карта столкновения вызывала предыдущую позицию игрового объекта. – Notbad
Ahh gotca, я подумал, что это может быть опечатка. Как общий цикл обновления, я бы сказал, что это выглядит довольно хорошо. Если вам нужно оптимизировать его, приведите сведения о том, какие проверки столкновений вам нужно делать, если вы можете избежать неприятностей, делая это реже и тому подобное. – TurqMage