Didgik Posted November 4 Posted November 4 Привет! Хочу отловить событие EventFrozen. Сделал кнопку для запуска и привязал событие на getEventFrozen. Выключаю событие и включаю его только после нажатия кнопки "Бросить кубик". И у меня тут же отрабатывает событие EventFrozen. Чтобы обойти этот момент пришлось в обработчике проверять есть ли у объекта скоростя и если есть, просто пропускать. Увеличивал Frozen frames до 50, не помогает. Вопрос стандартный, что не так? #include "DiceComponent.h" #include <UnigineGame.h> #include <UnigineVisualizer.h> REGISTER_COMPONENT(DiceComponent) void DiceComponent::init() { GuiPtr gui = Gui::getCurrent(); Visualizer::setEnabled(true); Label = WidgetLabel::create(); Label->setFontSize(72); Label->setFontOutline(2); Label->setFontColor(Unigine::Math::vec4_blue); gui->addChild(Label, Gui::ALIGN_TOP); btThrowing = WidgetButton::create("Бросить кубик"); btThrowing->setFontSize(32); btThrowing->getEventClicked().connect(this, &DiceComponent::throwing); btThrowing->setEnabled(true); gui->addChild(btThrowing, Gui::ALIGN_BOTTOM); DiceBody = node->getObjectBodyRigid(); DiceBody->getEventFrozen().connect(this, &DiceComponent::frozen_callback); DiceBody->getEventFrozen().setEnabled(false); } void DiceComponent::throwing() { DiceBody->getEventFrozen().setEnabled(true); node->setWorldPosition(Math::Vec3(0.05,-2,1)); DiceBody->addAngularImpulse(rnd.getDirection() * 0.2); float r = rnd.getFloat(3, 5); DiceBody->addLinearImpulse(Math::vec3(-r, r, 0)); Log::message("throwing\n"); } void DiceComponent::frozen_callback() { Math::vec3 av = DiceBody->getAngularVelocity(); Math::vec3 lv = DiceBody->getLinearVelocity(); if (abs(av.length2()) > 0.01 && abs(lv.length2()) > 0.01) { return; } DiceBody->getEventFrozen().setEnabled(false); Math::Vec3 m = normalize(node->getTransform().getRow3(2)); int x = round(m.x); int y = round(m.y); int z = round(m.z); if (x < 0) Value = 4; if (x > 0) Value = 3; if (y < 0) Value = 2; if (y > 0) Value = 5; if (z < 0) Value = 6; if (z > 0) Value = 1; Label->setText(String::format("Выпало: %d", Value)); Log::message("frozen %d\n", Value); }
silent Posted November 5 Posted November 5 Здравствуйте! Попробуйте непосредственно перед броском у тела кубика сделать setFrozen(false). How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN
Didgik Posted November 5 Author Posted November 5 3 часа назад сайлент сказал: Попробуйте непосредственно перед броском у тела кубика сделать setFrozen(false) . Нет не помогает.
mifril Posted November 5 Posted November 5 Здравствуйте! Дело в том что EventFrozen вызывается когда сосотяние Frozen изменилось, поэтому при броске вы тоже получаете этот ивент, так как состояние изменилось с Frozen = true в Frozen = false, вместо проверки велосити в колбеке вы можете просто вызвать DiceBody->isFrozen(), и только когда значение будет равно True выполнять логику с определением выпавшей грани куба. 1 1
Didgik Posted November 5 Author Posted November 5 Вот. Теперь сошлось. В доке с автоматическим переводом на русский это было не очевидно, по крайней мере мне )
Recommended Posts