В настоящее время я занимаюсь рефакторингом кода, и одна из вещей, которую я хочу улучшить, это мой код менеджера сущностей.Точнее, функция обновления, где обновляются сущности.Мой движок - это движок 2D на основе плиток, который я использую для игры на iphone.У меня была идея разделить обновление сущностей на несколько задач, потому что я готов перейти к сущностям на основе компонентов, когда у меня будет время.Это физическая задача, задача обнаружения столкновений, задача ИИ и т. Д. *
В течение долгого времени я использовал простую функцию 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];
}
}
В коде могут быть некоторые синтаксические ошибки, но я просто хотел показать идею.Извините за длинный вопрос, но я подумал, что должен объяснить все как можно яснее.
Заранее спасибо.