void Urho2DPhysicsRope::CreateScene() { scene_ = new Scene(context_); scene_->CreateComponent<Octree>(); scene_->CreateComponent<DebugRenderer>(); // Create camera node cameraNode_ = scene_->CreateChild("Camera"); // Set camera's position cameraNode_->SetPosition(Vector3(0.0f, 5.0f, -10.0f)); Camera* camera = cameraNode_->CreateComponent<Camera>(); camera->SetOrthographic(true); Graphics* graphics = GetSubsystem<Graphics>(); float width = (float)graphics->GetWidth(); float height = (float)graphics->GetHeight(); camera->SetOrthoSize(Vector2(width, height) * 0.05f); // Create 2D physics world component PhysicsWorld2D* physicsWorld = scene_->CreateComponent<PhysicsWorld2D>(); physicsWorld->SetDrawJoint(true); // Create ground Node* groundNode = scene_->CreateChild("Ground"); // Create 2D rigid body for gound RigidBody2D* groundBody = groundNode->CreateComponent<RigidBody2D>(); // Create edge collider for ground CollisionEdge2D* groundShape = groundNode->CreateComponent<CollisionEdge2D>(); groundShape->SetVertices(Vector2(-40.0f, 0.0f), Vector2(40.0f, 0.0f)); const float y = 15.0f; RigidBody2D* prevBody = groundBody; for (unsigned i = 0; i < NUM_OBJECTS; ++i) { Node* node = scene_->CreateChild("RigidBody"); // Create rigid body RigidBody2D* body = node->CreateComponent<RigidBody2D>(); body->SetBodyType(BT_DYNAMIC); // Create box CollisionBox2D* box = node->CreateComponent<CollisionBox2D>(); // Set friction box->SetFriction(0.2f); // Set mask bits. box->SetMaskBits(0xFFFF & ~0x0002); if (i == NUM_OBJECTS - 1) { node->SetPosition(Vector3(1.0f * i, y, 0.0f)); body->SetAngularDamping(0.4f); box->SetSize(3.0f, 3.0f); box->SetDensity(100.0f); box->SetCategoryBits(0x0002); } else { node->SetPosition(Vector3(0.5f + 1.0f * i, y, 0.0f)); box->SetSize(1.0f, 0.25f); box->SetDensity(20.0f); box->SetCategoryBits(0x0001); } ConstraintRevolute2D* joint = node->CreateComponent<ConstraintRevolute2D>(); joint->SetOtherBody(prevBody); joint->SetAnchor(Vector2(float(i), y)); joint->SetCollideConnected(false); prevBody = body; } ConstraintRope2D* constraintRope = groundNode->CreateComponent<ConstraintRope2D>(); constraintRope->SetOtherBody(prevBody); constraintRope->SetOwnerBodyAnchor(Vector2(0.0f, y)); constraintRope->SetMaxLength(NUM_OBJECTS - 1.0f + 0.01f); }