Jump to content

событие EventFrozen


Recommended Posts

Posted

Привет!

Хочу отловить событие 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);
}

 

Posted
3 часа назад сайлент сказал:

Попробуйте непосредственно перед броском у тела кубика сделать  setFrozen(false) .

Нет не помогает.

Posted

Здравствуйте!

Дело в том что EventFrozen вызывается когда сосотяние Frozen изменилось, поэтому при броске вы тоже получаете этот ивент, так как состояние изменилось с Frozen = true в Frozen = false, вместо проверки велосити в колбеке вы можете просто вызвать DiceBody->isFrozen(), и только когда значение будет равно True выполнять логику с определением выпавшей грани куба.

  • Like 1
  • Thanks 1
Posted

Вот. Теперь сошлось. В доке с автоматическим переводом на русский это было не очевидно, по крайней мере мне )

×
×
  • Create New...