Есть у меня Lua скриптец работающий в связке с С++ (через mLuabind) который получает вначале менеджер спрайтов, затем этим менеджером создает кучу спрайтов и устанавливает их в нужную позицию. При создании спрайтов менеджером они вносятся в массив и там хранятся.
obj = {}
StaticSpriteManager=getMgr();
for v = 1, 4000, 1 do
local obj= StaticSpriteManager.createStaticSprite();
obj.setPosition(400,300);
end
Проблемма в том что эти спрайты начинают сразу же удаляться, еще до завершения работы скрипта.
Как я понимаю это происходит потому, что в obj прописался новый спрайт, а прежний потерял все ссылки
(вот прежний и удаляется).
Вопрос — нормальное ли это поведение Луа (может у меня что-то заглючило)
иесли да то как с этим мириться? Тоесть в данной ситуации мне вовсе не надо чтобы спрайты удалялись,
и может быть вообще ситуация когда я решу готовый массив спрайтов подвигать скриптом, так что они там тоже удалятся?
Это же никуда не годится.
Помогите плиз разрулить.
11.12.08 22:34: Перенесено модератором из 'Прочее' — der Igel
Здравствуйте, Nuzhny, Вы писали:
N>Не очень понимаю, что ты делаешь. StaticSpriteManager.createStaticSprite() создаёт новый спрайт? Тогда вполне нормально, что он удаляется.
N>Может, тебе надо заполнить спрайтами массив obj = {}? Тогда зачаем делается присвоение local obj= StaticSpriteManager.createStaticSprite();?
N>Делай obj[v] = StaticSpriteManager.createStaticSprite();
Да, пример кода не очень удачный , я приведу другой — обойти все спрайты (созданные не в луа) и выставить им координаты (400,300)
StaticSpriteManager=getMgr();
for v = 1, 4000, 1 do
local obj= StaticSpriteManager.getStaticSprite(v);
obj.setPosition(400,300);
end
здесь оно тоже все удаляет, хоть не оно создавало. Как поступить ?
я понял, что можно в глобальной таблице сохранять все что обрабатываем и не хотим чтобы это удалилось, но это же как-то не правильно, этот набор объектов я мог создать и не скриптом, а скриптом просто обработать единажды. И мне получается для того чтобы после этой единственной обработки объектов скриптом он их не поудалял нужно делать лишние телодвижения и загонять их в глобальный массив. Разве это удобно ?
Здравствуйте, Troglodit, Вы писали:
T>Да, пример кода не очень удачный , я приведу другой — обойти все спрайты (созданные не в луа) и выставить им координаты (400,300)
T>T> StaticSpriteManager=getMgr();
T> for v = 1, 4000, 1 do
T> local obj= StaticSpriteManager.getStaticSprite(v);
T> obj.setPosition(400,300);
T> end
T>
T>здесь оно тоже все удаляет, хоть не оно создавало. Как поступить ?
А можно увидеть код биндинга на стороне C++? Как будто объекты передаются по значению, либо отдается ownership через adopt.
Здравствуйте, migun, Вы писали:
M>Здравствуйте, Troglodit, Вы писали:
T>>Да, пример кода не очень удачный , я приведу другой — обойти все спрайты (созданные не в луа) и выставить им координаты (400,300)
T>>T>> StaticSpriteManager=getMgr();
T>> for v = 1, 4000, 1 do
T>> local obj= StaticSpriteManager.getStaticSprite(v);
T>> obj.setPosition(400,300);
T>> end
T>>
T>>здесь оно тоже все удаляет, хоть не оно создавало. Как поступить ?
M>А можно увидеть код биндинга на стороне C++? Как будто объекты передаются по значению, либо отдается ownership через adopt.
host.Insert(
Class<hwStaticSprite>("hwStaticSprite")
.Constructor()
.Method("setPosition", &hwStaticSprite::setPosition)
.Member("dx", &hwStaticSprite::dx)
.Member("dy", &hwStaticSprite::dy)
.Member("scale", &hwStaticSprite::scale)
.Member("rot", &hwStaticSprite::rot)
.Member("dscale", &hwStaticSprite::dscale)
.Member("drot", &hwStaticSprite::drot)
);
host.Insert( Function("getMgr", &getMgr ) );
host.Insert(
Class<hwStaticSpriteManager>("hwStaticSpriteManager")
.Method("createStaticSprite", &hwStaticSpriteManager::createStaticSprite, Adopt(-1))
.Method("getStaticSprite", &hwStaticSpriteManager::getStaticSprite, Adopt(-1))
);
Да, действидельно, когда убрал адопт удалять перестало. Спасибо !