Examples/Physics2DDemo: Add box grabbing
This commit is contained in:
parent
68ce2b2d00
commit
c9fae3470a
|
|
@ -39,7 +39,7 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
Nz::Vector2f windowSize = Nz::Vector2f(window.GetSize());
|
Nz::Vector2f windowSize = Nz::Vector2f(window.GetSize());
|
||||||
|
|
||||||
physSytem.GetPhysWorld().SetGravity({ 0.f, -98.1f });
|
physSytem.GetPhysWorld().SetGravity({ 0.f, -313.f });
|
||||||
|
|
||||||
entt::handle viewer = world.CreateEntity();
|
entt::handle viewer = world.CreateEntity();
|
||||||
{
|
{
|
||||||
|
|
@ -72,14 +72,13 @@ int main(int argc, char* argv[])
|
||||||
for (std::size_t x = 0; x < 30; ++x)
|
for (std::size_t x = 0; x < 30; ++x)
|
||||||
{
|
{
|
||||||
entt::handle spriteEntity = world.CreateEntity();
|
entt::handle spriteEntity = world.CreateEntity();
|
||||||
{
|
|
||||||
spriteEntity.emplace<Nz::NodeComponent>(Nz::Vector2f(windowSize.x * 0.5f + x * 48.f - 15.f * 48.f, windowSize.y / 2 + y * 48.f));
|
|
||||||
spriteEntity.emplace<Nz::GraphicsComponent>(boxSprite, 1);
|
|
||||||
|
|
||||||
auto& rigidBody = spriteEntity.emplace<Nz::ChipmunkRigidBody2DComponent>(boxSettings);
|
spriteEntity.emplace<Nz::NodeComponent>(Nz::Vector2f(windowSize.x * 0.5f + x * 32.f - 15.f * 32.f, windowSize.y / 2 + y * 48.f));
|
||||||
rigidBody.SetFriction(0.9f);
|
spriteEntity.emplace<Nz::GraphicsComponent>(boxSprite, 1);
|
||||||
//rigidBody.SetElasticity(0.99f);
|
|
||||||
}
|
auto& rigidBody = spriteEntity.emplace<Nz::ChipmunkRigidBody2DComponent>(boxSettings);
|
||||||
|
rigidBody.SetFriction(0.9f);
|
||||||
|
//rigidBody.SetElasticity(0.99f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -123,6 +122,48 @@ int main(int argc, char* argv[])
|
||||||
Nz::PidController<Nz::Vector3f> headingController(0.5f, 0.f, 0.05f);
|
Nz::PidController<Nz::Vector3f> headingController(0.5f, 0.f, 0.05f);
|
||||||
Nz::PidController<Nz::Vector3f> upController(1.f, 0.f, 0.1f);
|
Nz::PidController<Nz::Vector3f> upController(1.f, 0.f, 0.1f);
|
||||||
|
|
||||||
|
std::optional<Nz::ChipmunkPivotConstraint2D> grabConstraint;
|
||||||
|
NazaraSlot(Nz::WindowEventHandler, OnMouseMoved, grabbedObjectMove);
|
||||||
|
|
||||||
|
Nz::WindowEventHandler& eventHandler = window.GetEventHandler();
|
||||||
|
eventHandler.OnMouseButtonPressed.Connect([&](const Nz::WindowEventHandler*, const Nz::WindowEvent::MouseButtonEvent& event)
|
||||||
|
{
|
||||||
|
if (event.button == Nz::Mouse::Left)
|
||||||
|
{
|
||||||
|
auto& viewerComponent = viewer.get<Nz::CameraComponent>();
|
||||||
|
|
||||||
|
Nz::Vector2f worldPos = Nz::Vector2f(viewerComponent.Unproject(Nz::Vector3f(event.x, event.y, 0.f)));
|
||||||
|
|
||||||
|
entt::handle nearestEntity;
|
||||||
|
if (physSytem.NearestBodyQuery(worldPos, 1.f, 0, 0xFFFFFFFF, 0xFFFFFFFF, &nearestEntity))
|
||||||
|
{
|
||||||
|
if (nearestEntity && nearestEntity != groundEntity)
|
||||||
|
{
|
||||||
|
grabConstraint.emplace(nearestEntity.get<Nz::ChipmunkRigidBody2DComponent>(), worldPos);
|
||||||
|
|
||||||
|
grabbedObjectMove.Connect(eventHandler.OnMouseMoved, [&, nearestEntity, viewer](const Nz::WindowEventHandler*, const Nz::WindowEvent::MouseMoveEvent& event)
|
||||||
|
{
|
||||||
|
auto& viewerComponent = viewer.get<Nz::CameraComponent>();
|
||||||
|
Nz::Vector2f worldPos = Nz::Vector2f(viewerComponent.Unproject(Nz::Vector3f(event.x, event.y, 0.f)));
|
||||||
|
|
||||||
|
auto& rigidBody = nearestEntity.get<Nz::ChipmunkRigidBody2DComponent>();
|
||||||
|
|
||||||
|
grabConstraint->SetFirstAnchor(worldPos);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
eventHandler.OnMouseButtonReleased.Connect([&](const Nz::WindowEventHandler*, const Nz::WindowEvent::MouseButtonEvent& event)
|
||||||
|
{
|
||||||
|
if (event.button == Nz::Mouse::Left)
|
||||||
|
{
|
||||||
|
grabConstraint.reset();
|
||||||
|
grabbedObjectMove.Disconnect();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
app.AddUpdaterFunc([&]
|
app.AddUpdaterFunc([&]
|
||||||
{
|
{
|
||||||
fps++;
|
fps++;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue