Правельно, но в целом немножко не такRelict писал(а):Все предметы в одном списке, затем ищем что в клетке сравнивая по координате?
При отображении на экране вызываем эту функцию для каждой клетки видимой на экране?
Для отрисовки, у всех объектов вызывается виртуальный метод onRender(карта)
В качестве контекста отрисовки передается карта.
На карте есть камера.
Вкратце можно сказать, что камера отслеживает область видимости карты.
Высчитывает видимый регион (позиция на карте, высота ширина – области видимости на карте, ну и смещение, для плавного скроллинга карты).
Объект, который хочет отрисовать себя на карте, берет регион отрисовки у камеры, которая находится на карте.
Проверяет, входят ли координаты в регион. Если он попадает в этот регион то объект отрисовывается.
Зачем нужны такие сложности?
Решается ряд задач.
1. плавный скроллинг, достаточно поменять позицию камеры.
2. любой объект может позицировать камеру на себя.
3. миникарта отрисовывается тоже с учетом камеры
4. высчитывают свою позицию только базовый объект, остальным потомкам выдается только уже посчитанные координаты для вывода на экран.
5. решается проблема скроллинга за пределы экрана.
вот например, так отрисовывется object лесенка
Код: Выделить всё
/* //===================================================================================*
* // *
* // отрисовка лесенки на текущем экране с учетом камеры *
* //------------------------------------------------------------------------------------*
*///
void CMapLink::onRender (CMap * pRenderMap)
{
CPoint ptScreen;
if (getScreenPosition(ptScreen))
{
CResourceSprite &sprite = CResourceSprite::instance();
sprite.draw(1015, ptScreen.x, ptScreen.y);
}
}
//---------------------------------------------------------------------------------------
код который бежит по всем объектам, и дергает метод отрисовки.
Сам код render() запускается после отрисовки карты.
Код: Выделить всё
/* //===================================================================================*
* // *
* // отрисовка игровых объектов *
* //------------------------------------------------------------------------------------*
*///
void CObjectList::render(CMap * pRenderMap)
{
backup();
setFirst();
int iCount = getCount();
for (int i = 0; i < iCount; i++)
{
CObject * objItem = (CObject*)item();
objItem->onRender(pRenderMap);
next();
}
restore();
}
//---------------------------------------------------------------------------------------
Пока этот метод будет работать без тормозов, Если на карте будет расположено примерно 200 объектов. (физический не проверял,) Просто каждый объект перебирать очень ресурсоемко.
Далее, когда появятся тормаза. Придется строить r-дерево, но думаю до этого не дойдет.
Карт может быть много, а впамяти минимум 10. Все просто. Я хочу чтобы когда игрок перешел на другую карту, в с тарой карте продолжалась «жизнь» тоесть ходят монстры, торгуют магазины итд. Когда игрок вернется на карту и увидел, что обааанааа, а монстрякито наплодились и разбежалиь п углам. Почему именно 10? Незнаю, думаю этого должно хватить. Больше и не нужно. Да и зызка медленно работает с картой памяти, (особенно если она паленая) намного комфортней играть, когда карты хоть немного да кешируются в памяти.
АаАааа. Сохранение файлов вернее сейфки для зызки, паливо, не все так просто! Записывать в карту памяти, где сидит игра – низяяя. Зызка выделят песочницу, где можно гадить. А вот как работать с этой песочницей, как оформлять сейфки (создовать param.sfo файлы) – нипанятна. Роюсь в примерах…