void HandleMouseButtonDown(MouseButtonDownEventArgs args) { Input input = Input; PhysicsWorld2D physicsWorld = scene.GetComponent <PhysicsWorld2D>(); RigidBody2D rigidBody = physicsWorld.GetRigidBody(input.MousePosition.X, input.MousePosition.Y, uint.MaxValue); // Raycast for RigidBody2Ds to pick if (rigidBody != null) { pickedNode = rigidBody.Node; //log.Info(pickedNode.name); StaticSprite2D staticSprite = pickedNode.GetComponent <StaticSprite2D>(); staticSprite.Color = (new Color(1.0f, 0.0f, 0.0f, 1.0f)); // Temporary modify color of the picked sprite // Create a ConstraintMouse2D - Temporary apply this constraint to the pickedNode to allow grasping and moving with the mouse ConstraintMouse2D constraintMouse = pickedNode.CreateComponent <ConstraintMouse2D>(); constraintMouse.Target = GetMousePositionXY(); constraintMouse.MaxForce = 1000 * rigidBody.Mass; constraintMouse.CollideConnected = true; constraintMouse.OtherBody = dummyBody; // Use dummy body instead of rigidBody. It's better to create a dummy body automatically in ConstraintMouse2D constraintMouse.DampingRatio = 0.0f; } mouseMoveEventToken = Input.SubscribeToMouseMoved(HandleMouseMove); mouseButtonUpToken = Input.SubscribeToMouseButtonUp(HandleMouseButtonUp); }
void HandleTouchBegin3(TouchBeginEventArgs args) { var graphics = Graphics; PhysicsWorld2D physicsWorld = scene.GetComponent <PhysicsWorld2D>(); RigidBody2D rigidBody = physicsWorld.GetRigidBody(new Vector2(args.X, args.Y), uint.MaxValue); // Raycast for RigidBody2Ds to pick if (rigidBody != null) { pickedNode = rigidBody.Node; StaticSprite2D staticSprite = pickedNode.GetComponent <StaticSprite2D>(); staticSprite.Color = (new Color(1.0f, 0.0f, 0.0f, 1.0f)); // Temporary modify color of the picked sprite rigidBody = pickedNode.GetComponent <RigidBody2D>(); // Create a ConstraintMouse2D - Temporary apply this constraint to the pickedNode to allow grasping and moving with touch ConstraintMouse2D constraintMouse = pickedNode.CreateComponent <ConstraintMouse2D>(); Vector3 pos = camera.ScreenToWorldPoint(new Vector3((float)args.X / graphics.Width, (float)args.Y / graphics.Height, 0.0f)); constraintMouse.Target = new Vector2(pos.X, pos.Y); constraintMouse.MaxForce = 1000 * rigidBody.Mass; constraintMouse.CollideConnected = true; constraintMouse.OtherBody = dummyBody; // Use dummy body instead of rigidBody. It's better to create a dummy body automatically in ConstraintMouse2D constraintMouse.DampingRatio = 0; } touchMoveEventToken = Input.SubscribeToTouchMove(HandleTouchMove3); touchEndEventToken = Input.SubscribeToTouchEnd(HandleTouchEnd3); }
public override void Start() { // We setup our scene, main camera and viewport _viewport = GetSubsystem <Renderer>().GetViewport(0); _scene = new Scene(); _scene.CreateComponent <Octree>().SetSize(new BoundingBox(1, 100), 3); _viewport.Scene = _scene; _camera = _scene.CreateChild("Camera").CreateComponent <Camera>(); _camera.Node.Position = new Vector3(50, 10, -1); _camera.Orthographic = true; _camera.OrthoSize = 26; _viewport.Camera = _camera; // We create a sound source for the music and the music SoundSource musicSource = _scene.CreateComponent <SoundSource>(); Sound music = Cache.Get <Sound>("music/Happy_Bee.ogg"); music.SetLooped(true); musicSource.Play(music); musicSource.SetSoundType("Music"); // We don't need a sound listener for the above, but we add one for the sounds and adjust the music gain Audio audioSystem = GetSubsystem <Audio>(); audioSystem.SetListener(_camera.Node.CreateComponent <SoundListener>()); audioSystem.SetMasterGain("Music", 0.3f); // We create a background node which is a child of the camera so it won't move relative to it Node bg = _camera.Node.CreateChild("Background"); StaticSprite2D bgspr = bg.CreateComponent <StaticSprite2D>(); bgspr.SetSprite(Cache.Get <Sprite2D>("scenarios/grasslands/bg.png")); bg.SetPosition(new Vector3(0, 0, 100)); bg.SetScale2D(Vector2.One * 5); // We add a physics world so we can simulate physics, and enable CCD PhysicsWorld2D pw = _scene.CreateComponent <PhysicsWorld2D>(); pw.SetContinuousPhysics(true); // We create a terrain, vehicle and cloud system _terrain = new Terrain(_scene); _vehicle = CreateVehicle(new Vector2(50, 10)); _clouds = new Clouds(50, 5, 40, 16, 40); // We subscribe to the PostUpdateEvent SubscribeToEvent <PostUpdateEvent>(PostUpdate); // If we're building a debug release, we draw debug data #if DEBUG DebugRenderer dbr = _scene.CreateComponent <DebugRenderer>(); pw.SetDrawCenterOfMass(true); pw.SetDrawJoint(true); pw.SetDrawPair(true); pw.SetDrawShape(true); SubscribeToEvent <PostRenderUpdateEvent>(e => { _scene.GetComponent <PhysicsWorld2D>().DrawDebugGeometry(dbr, false); }); #endif }
private void Awake() { if (instance == null) { instance = this; } else { Destroy(gameObject); } }
private void CreatePhysicsWorld(PhysicsWorld2D physicsWorld) { AABB worldAABB = new AABB(); worldAABB.LowerBound.Set(-10000, -10000); worldAABB.UpperBound.Set(10000, 10000); Vec2 gravity = physicsWorld.Gravity; Box2DX.Dynamics.World world = new Box2DX.Dynamics.World(worldAABB, gravity, false); physicsWorld.World = world; physicsWorld.SetBulletListner(); }
public static void DefineBody(EntityID entity, Registry registry, PhysicsWorld2D physicsWorld, TransformComponent transform) { var rigidBody = registry.GetComponent <RigidBody2D>(entity); BodyDef bodyDef = new BodyDef(); bodyDef.Position = Util.UtilFunctions.ToVec2(transform.Position / PhysicsWorld2D.PixelToMeter); bodyDef.Angle = transform.Rotation.Z; bodyDef.AngularDamping = rigidBody.AngularDamping; bodyDef.LinearDamping = rigidBody.LinearDamping; bodyDef.FixedRotation = rigidBody.FixedRotation; bodyDef.IsSleeping = false; bodyDef.IsBullet = rigidBody.IsBullet; Body body = physicsWorld.World.CreateBody(bodyDef); FixtureDef shapeDef = null; if (registry.TryGetComponent(entity, out BoxCollider box)) { shapeDef = new PolygonDef(); ((PolygonDef)shapeDef).SetAsBox((box.Width / 2) / PhysicsWorld2D.PixelToMeter, (box.Height / 2) / PhysicsWorld2D.PixelToMeter); } else if (registry.TryGetComponent(entity, out CircleCollider circle)) { shapeDef = new CircleDef(); ((CircleDef)shapeDef).Radius = circle.Radius; } shapeDef.Density = rigidBody.Density; shapeDef.Friction = rigidBody.Friction; shapeDef.Restitution = rigidBody.Restitution; body.CreateFixture(shapeDef); if (rigidBody.Mass > 0) { MassData massData = new MassData(); massData.Mass = rigidBody.Mass; massData.Center = body.GetLocalCenter(); body.SetMass(massData); } else { body.SetMassFromShapes(); } body.SetUserData(entity); if (rigidBody.StartVelocity != Vector2.Zero) { body.SetLinearVelocity(Util.UtilFunctions.ToVec2(rigidBody.StartVelocity)); } rigidBody.SetBody(body); }
void CreateScene() { scene = new Scene(); scene.CreateComponent <Octree>(); scene.CreateComponent <DebugRenderer>(); PhysicsWorld2D physicsWorld = scene.CreateComponent <PhysicsWorld2D>(); // Create 2D physics world component physicsWorld.DrawJoint = true; // Display the joints (Note that DrawDebugGeometry() must be set to true to acually draw the joints) drawDebug = true; // Set DrawDebugGeometry() to true // Create camera CameraNode = scene.CreateChild("Camera"); // Set camera's position CameraNode.Position = (new Vector3(0.0f, 0.0f, 0.0f)); // Note that Z setting is discarded; use camera.zoom instead (see MoveCamera() below for example) camera = CameraNode.CreateComponent <Camera>(); camera.Orthographic = true; var graphics = Graphics; camera.OrthoSize = (float)graphics.Height * PixelSize; camera.Zoom = 1.2f * Math.Min((float)graphics.Width / 1280.0f, (float)graphics.Height / 800.0f); // Set zoom according to user's resolution to ensure full visibility (initial zoom (1.2) is set for full visibility at 1280x800 resolution) // Set up a viewport to the Renderer subsystem so that the 3D scene can be seen Viewport viewport = new Viewport(Context, scene, camera, null); Renderer renderer = Renderer; renderer.SetViewport(0, viewport); Zone zone = renderer.DefaultZone; zone.FogColor = (new Color(0.1f, 0.1f, 0.1f)); // Set background color for the scene // Create 4x3 grid for (uint i = 0; i < 5; ++i) { Node edgeNode = scene.CreateChild("VerticalEdge"); RigidBody2D edgeBody = edgeNode.CreateComponent <RigidBody2D>(); if (dummyBody == null) { dummyBody = edgeBody; // Mark first edge as dummy body (used by mouse pick) } CollisionEdge2D edgeShape = edgeNode.CreateComponent <CollisionEdge2D>(); edgeShape.SetVertices(new Vector2(i * 2.5f - 5.0f, -3.0f), new Vector2(i * 2.5f - 5.0f, 3.0f)); edgeShape.Friction = 0.5f; // Set friction } for (uint j = 0; j < 4; ++j) { Node edgeNode = scene.CreateChild("HorizontalEdge"); /*RigidBody2D edgeBody = */ edgeNode.CreateComponent <RigidBody2D>(); CollisionEdge2D edgeShape = edgeNode.CreateComponent <CollisionEdge2D>(); edgeShape.SetVertices(new Vector2(-5.0f, j * 2.0f - 3.0f), new Vector2(5.0f, j * 2.0f - 3.0f)); edgeShape.Friction = 0.5f; // Set friction } var cache = ResourceCache; // Create a box (will be cloned later) Node box = scene.CreateChild("Box"); box.Position = (new Vector3(0.8f, -2.0f, 0.0f)); StaticSprite2D boxSprite = box.CreateComponent <StaticSprite2D>(); boxSprite.Sprite = cache.GetSprite2D("Urho2D/Box.png"); RigidBody2D boxBody = box.CreateComponent <RigidBody2D>(); boxBody.BodyType = BodyType2D.Dynamic; boxBody.LinearDamping = 0.0f; boxBody.AngularDamping = 0.0f; CollisionBox2D shape = box.CreateComponent <CollisionBox2D>(); // Create box shape shape.Size = new Vector2(0.32f, 0.32f); // Set size shape.Density = 1.0f; // Set shape density (kilograms per meter squared) shape.Friction = 0.5f; // Set friction shape.Restitution = 0.1f; // Set restitution (slight bounce) // Create a ball (will be cloned later) Node ball = scene.CreateChild("Ball"); ball.Position = (new Vector3(1.8f, -2.0f, 0.0f)); StaticSprite2D ballSprite = ball.CreateComponent <StaticSprite2D>(); ballSprite.Sprite = cache.GetSprite2D("Urho2D/Ball.png"); RigidBody2D ballBody = ball.CreateComponent <RigidBody2D>(); ballBody.BodyType = BodyType2D.Dynamic; ballBody.LinearDamping = 0.0f; ballBody.AngularDamping = 0.0f; CollisionCircle2D ballShape = ball.CreateComponent <CollisionCircle2D>(); // Create circle shape ballShape.Radius = 0.16f; // Set radius ballShape.Density = 1.0f; // Set shape density (kilograms per meter squared) ballShape.Friction = 0.5f; // Set friction ballShape.Restitution = 0.6f; // Set restitution: make it bounce // Create a polygon Node polygon = scene.CreateChild("Polygon"); polygon.Position = (new Vector3(1.6f, -2.0f, 0.0f)); polygon.SetScale(0.7f); StaticSprite2D polygonSprite = polygon.CreateComponent <StaticSprite2D>(); polygonSprite.Sprite = cache.GetSprite2D("Urho2D/Aster.png"); RigidBody2D polygonBody = polygon.CreateComponent <RigidBody2D>(); polygonBody.BodyType = BodyType2D.Dynamic; CollisionPolygon2D polygonShape = polygon.CreateComponent <CollisionPolygon2D>(); polygonShape.VertexCount = 6; // Set number of vertices (mandatory when using SetVertex()) polygonShape.SetVertex(0, new Vector2(-0.8f, -0.3f)); polygonShape.SetVertex(1, new Vector2(0.5f, -0.8f)); polygonShape.SetVertex(2, new Vector2(0.8f, -0.3f)); polygonShape.SetVertex(3, new Vector2(0.8f, 0.5f)); polygonShape.SetVertex(4, new Vector2(0.5f, 0.9f)); polygonShape.SetVertex(5, new Vector2(-0.5f, 0.7f)); polygonShape.Density = 1.0f; // Set shape density (kilograms per meter squared) polygonShape.Friction = 0.3f; // Set friction polygonShape.Restitution = 0.0f; // Set restitution (no bounce) // Create a ConstraintDistance2D CreateFlag("ConstraintDistance2D", -4.97f, 3.0f); // Display Text3D flag Node boxDistanceNode = box.Clone(CreateMode.Replicated); Node ballDistanceNode = ball.Clone(CreateMode.Replicated); RigidBody2D ballDistanceBody = ballDistanceNode.GetComponent <RigidBody2D>(); boxDistanceNode.Position = (new Vector3(-4.5f, 2.0f, 0.0f)); ballDistanceNode.Position = (new Vector3(-3.0f, 2.0f, 0.0f)); ConstraintDistance2D constraintDistance = boxDistanceNode.CreateComponent <ConstraintDistance2D>(); // Apply ConstraintDistance2D to box constraintDistance.OtherBody = ballDistanceBody; // Constrain ball to box constraintDistance.OwnerBodyAnchor = boxDistanceNode.Position2D; constraintDistance.OtherBodyAnchor = ballDistanceNode.Position2D; // Make the constraint soft (comment to make it rigid, which is its basic behavior) constraintDistance.FrequencyHz = 4.0f; constraintDistance.DampingRatio = 0.5f; // Create a ConstraintFriction2D ********** Not functional. From Box2d samples it seems that 2 anchors are required, Urho2D only provides 1, needs investigation *********** CreateFlag("ConstraintFriction2D", 0.03f, 1.0f); // Display Text3D flag Node boxFrictionNode = box.Clone(CreateMode.Replicated); Node ballFrictionNode = ball.Clone(CreateMode.Replicated); boxFrictionNode.Position = (new Vector3(0.5f, 0.0f, 0.0f)); ballFrictionNode.Position = (new Vector3(1.5f, 0.0f, 0.0f)); ConstraintFriction2D constraintFriction = boxFrictionNode.CreateComponent <ConstraintFriction2D>(); // Apply ConstraintDistance2D to box constraintFriction.OtherBody = ballFrictionNode.GetComponent <RigidBody2D>(); // Constraint ball to box // Create a ConstraintGear2D CreateFlag("ConstraintGear2D", -4.97f, -1.0f); // Display Text3D flag Node baseNode = box.Clone(CreateMode.Replicated); RigidBody2D tempBody = baseNode.GetComponent <RigidBody2D>(); // Get body to make it static tempBody.BodyType = BodyType2D.Static; baseNode.Position = (new Vector3(-3.7f, -2.5f, 0.0f)); Node ball1Node = ball.Clone(CreateMode.Replicated); ball1Node.Position = (new Vector3(-4.5f, -2.0f, 0.0f)); RigidBody2D ball1Body = ball1Node.GetComponent <RigidBody2D>(); Node ball2Node = ball.Clone(CreateMode.Replicated); ball2Node.Position = (new Vector3(-3.0f, -2.0f, 0.0f)); RigidBody2D ball2Body = ball2Node.GetComponent <RigidBody2D>(); ConstraintRevolute2D gear1 = baseNode.CreateComponent <ConstraintRevolute2D>(); // Apply constraint to baseBox gear1.OtherBody = ball1Body; // Constrain ball1 to baseBox gear1.Anchor = ball1Node.Position2D; ConstraintRevolute2D gear2 = baseNode.CreateComponent <ConstraintRevolute2D>(); // Apply constraint to baseBox gear2.OtherBody = ball2Body; // Constrain ball2 to baseBox gear2.Anchor = ball2Node.Position2D; ConstraintGear2D constraintGear = ball1Node.CreateComponent <ConstraintGear2D>(); // Apply constraint to ball1 constraintGear.OtherBody = ball2Body; // Constrain ball2 to ball1 constraintGear.OwnerConstraint = gear1; constraintGear.OtherConstraint = gear2; constraintGear.Ratio = 1.0f; ball1Body.ApplyAngularImpulse(0.015f, true); // Animate // Create a vehicle from a compound of 2 ConstraintWheel2Ds CreateFlag("ConstraintWheel2Ds compound", -2.45f, -1.0f); // Display Text3D flag Node car = box.Clone(CreateMode.Replicated); car.Scale = new Vector3(4.0f, 1.0f, 0.0f); car.Position = (new Vector3(-1.2f, -2.3f, 0.0f)); StaticSprite2D tempSprite = car.GetComponent <StaticSprite2D>(); // Get car Sprite in order to draw it on top tempSprite.OrderInLayer = 0; // Draw car on top of the wheels (set to -1 to draw below) Node ball1WheelNode = ball.Clone(CreateMode.Replicated); ball1WheelNode.Position = (new Vector3(-1.6f, -2.5f, 0.0f)); Node ball2WheelNode = ball.Clone(CreateMode.Replicated); ball2WheelNode.Position = (new Vector3(-0.8f, -2.5f, 0.0f)); ConstraintWheel2D wheel1 = car.CreateComponent <ConstraintWheel2D>(); wheel1.OtherBody = ball1WheelNode.GetComponent <RigidBody2D>(); wheel1.Anchor = ball1WheelNode.Position2D; wheel1.Axis = new Vector2(0.0f, 1.0f); wheel1.MaxMotorTorque = 20.0f; wheel1.FrequencyHz = 4.0f; wheel1.DampingRatio = 0.4f; ConstraintWheel2D wheel2 = car.CreateComponent <ConstraintWheel2D>(); wheel2.OtherBody = ball2WheelNode.GetComponent <RigidBody2D>(); wheel2.Anchor = ball2WheelNode.Position2D; wheel2.Axis = new Vector2(0.0f, 1.0f); wheel2.MaxMotorTorque = 10.0f; wheel2.FrequencyHz = 4.0f; wheel2.DampingRatio = 0.4f; // ConstraintMotor2D CreateFlag("ConstraintMotor2D", 2.53f, -1.0f); // Display Text3D flag Node boxMotorNode = box.Clone(CreateMode.Replicated); tempBody = boxMotorNode.GetComponent <RigidBody2D>(); // Get body to make it static tempBody.BodyType = BodyType2D.Static; Node ballMotorNode = ball.Clone(CreateMode.Replicated); boxMotorNode.Position = (new Vector3(3.8f, -2.1f, 0.0f)); ballMotorNode.Position = (new Vector3(3.8f, -1.5f, 0.0f)); ConstraintMotor2D constraintMotor = boxMotorNode.CreateComponent <ConstraintMotor2D>(); constraintMotor.OtherBody = ballMotorNode.GetComponent <RigidBody2D>(); // Constrain ball to box constraintMotor.LinearOffset = new Vector2(0.0f, 0.8f); // Set ballNode position relative to boxNode position = (0,0) constraintMotor.AngularOffset = 0.1f; constraintMotor.MaxForce = 5.0f; constraintMotor.MaxTorque = 10.0f; constraintMotor.CorrectionFactor = 1.0f; constraintMotor.CollideConnected = true; // doesn't work // ConstraintMouse2D is demonstrated in HandleMouseButtonDown() function. It is used to "grasp" the sprites with the mouse. CreateFlag("ConstraintMouse2D", 0.03f, -1.0f); // Display Text3D flag // Create a ConstraintPrismatic2D CreateFlag("ConstraintPrismatic2D", 2.53f, 3.0f); // Display Text3D flag Node boxPrismaticNode = box.Clone(CreateMode.Replicated); tempBody = boxPrismaticNode.GetComponent <RigidBody2D>(); // Get body to make it static tempBody.BodyType = BodyType2D.Static; Node ballPrismaticNode = ball.Clone(CreateMode.Replicated); boxPrismaticNode.Position = new Vector3(3.3f, 2.5f, 0.0f); ballPrismaticNode.Position = new Vector3(4.3f, 2.0f, 0.0f); ConstraintPrismatic2D constraintPrismatic = boxPrismaticNode.CreateComponent <ConstraintPrismatic2D>(); constraintPrismatic.OtherBody = ballPrismaticNode.GetComponent <RigidBody2D>(); // Constrain ball to box constraintPrismatic.Axis = new Vector2(1.0f, 1.0f); // Slide from [0,0] to [1,1] constraintPrismatic.Anchor = new Vector2(4.0f, 2.0f); constraintPrismatic.LowerTranslation = -1.0f; constraintPrismatic.UpperTranslation = 0.5f; constraintPrismatic.EnableLimit = true; constraintPrismatic.MaxMotorForce = 1.0f; constraintPrismatic.MotorSpeed = 0.0f; // ConstraintPulley2D CreateFlag("ConstraintPulley2D", 0.03f, 3.0f); // Display Text3D flag Node boxPulleyNode = box.Clone(CreateMode.Replicated); Node ballPulleyNode = ball.Clone(CreateMode.Replicated); boxPulleyNode.Position = (new Vector3(0.5f, 2.0f, 0.0f)); ballPulleyNode.Position = (new Vector3(2.0f, 2.0f, 0.0f)); ConstraintPulley2D constraintPulley = boxPulleyNode.CreateComponent <ConstraintPulley2D>(); // Apply constraint to box constraintPulley.OtherBody = ballPulleyNode.GetComponent <RigidBody2D>(); // Constrain ball to box constraintPulley.OwnerBodyAnchor = boxPulleyNode.Position2D; constraintPulley.OtherBodyAnchor = ballPulleyNode.Position2D; constraintPulley.OwnerBodyGroundAnchor = boxPulleyNode.Position2D + new Vector2(0.0f, 1.0f); constraintPulley.OtherBodyGroundAnchor = ballPulleyNode.Position2D + new Vector2(0.0f, 1.0f); constraintPulley.Ratio = 1.0f; // Weight ratio between ownerBody and otherBody // Create a ConstraintRevolute2D CreateFlag("ConstraintRevolute2D", -2.45f, 3.0f); // Display Text3D flag Node boxRevoluteNode = box.Clone(CreateMode.Replicated); tempBody = boxRevoluteNode.GetComponent <RigidBody2D>(); // Get body to make it static tempBody.BodyType = BodyType2D.Static; Node ballRevoluteNode = ball.Clone(CreateMode.Replicated); boxRevoluteNode.Position = (new Vector3(-2.0f, 1.5f, 0.0f)); ballRevoluteNode.Position = (new Vector3(-1.0f, 2.0f, 0.0f)); ConstraintRevolute2D constraintRevolute = boxRevoluteNode.CreateComponent <ConstraintRevolute2D>(); // Apply constraint to box constraintRevolute.OtherBody = ballRevoluteNode.GetComponent <RigidBody2D>(); // Constrain ball to box constraintRevolute.Anchor = new Vector2(-1.0f, 1.5f); constraintRevolute.LowerAngle = -1.0f; // In radians constraintRevolute.UpperAngle = 0.5f; // In radians constraintRevolute.EnableLimit = true; constraintRevolute.MaxMotorTorque = 10.0f; constraintRevolute.MotorSpeed = 0.0f; constraintRevolute.EnableMotor = true; // Create a ConstraintRope2D CreateFlag("ConstraintRope2D", -4.97f, 1.0f); // Display Text3D flag Node boxRopeNode = box.Clone(CreateMode.Replicated); tempBody = boxRopeNode.GetComponent <RigidBody2D>(); tempBody.BodyType = BodyType2D.Static; Node ballRopeNode = ball.Clone(CreateMode.Replicated); boxRopeNode.Position = (new Vector3(-3.7f, 0.7f, 0.0f)); ballRopeNode.Position = (new Vector3(-4.5f, 0.0f, 0.0f)); ConstraintRope2D constraintRope = boxRopeNode.CreateComponent <ConstraintRope2D>(); constraintRope.OtherBody = ballRopeNode.GetComponent <RigidBody2D>(); // Constrain ball to box constraintRope.OwnerBodyAnchor = new Vector2(0.0f, -0.5f); // Offset from box (OwnerBody) : the rope is rigid from OwnerBody center to this ownerBodyAnchor constraintRope.MaxLength = 0.9f; // Rope length constraintRope.CollideConnected = true; // Create a ConstraintWeld2D CreateFlag("ConstraintWeld2D", -2.45f, 1.0f); // Display Text3D flag Node boxWeldNode = box.Clone(CreateMode.Replicated); Node ballWeldNode = ball.Clone(CreateMode.Replicated); boxWeldNode.Position = (new Vector3(-0.5f, 0.0f, 0.0f)); ballWeldNode.Position = (new Vector3(-2.0f, 0.0f, 0.0f)); ConstraintWeld2D constraintWeld = boxWeldNode.CreateComponent <ConstraintWeld2D>(); constraintWeld.OtherBody = ballWeldNode.GetComponent <RigidBody2D>(); // Constrain ball to box constraintWeld.Anchor = boxWeldNode.Position2D; constraintWeld.FrequencyHz = 4.0f; constraintWeld.DampingRatio = 0.5f; // Create a ConstraintWheel2D CreateFlag("ConstraintWheel2D", 2.53f, 1.0f); // Display Text3D flag Node boxWheelNode = box.Clone(CreateMode.Replicated); Node ballWheelNode = ball.Clone(CreateMode.Replicated); boxWheelNode.Position = (new Vector3(3.8f, 0.0f, 0.0f)); ballWheelNode.Position = (new Vector3(3.8f, 0.9f, 0.0f)); ConstraintWheel2D constraintWheel = boxWheelNode.CreateComponent <ConstraintWheel2D>(); constraintWheel.OtherBody = ballWheelNode.GetComponent <RigidBody2D>(); // Constrain ball to box constraintWheel.Anchor = ballWheelNode.Position2D; constraintWheel.Axis = new Vector2(0.0f, 1.0f); constraintWheel.EnableMotor = true; constraintWheel.MaxMotorTorque = 1.0f; constraintWheel.MotorSpeed = 0.0f; constraintWheel.FrequencyHz = 4.0f; constraintWheel.DampingRatio = 0.5f; constraintWheel.CollideConnected = true; // doesn't work }
void CreateScene() { scene = new Scene(); scene.CreateComponent <Octree>(); scene.CreateComponent <DebugRenderer>(); // Create camera node CameraNode = scene.CreateChild("Camera"); // Set camera's position CameraNode.Position = new Vector3(0.0f, 5.0f, -10.0f); Camera camera = CameraNode.CreateComponent <Camera>(); camera.Orthographic = true; var graphics = Graphics; camera.OrthoSize = graphics.Height * 0.05f; camera.Zoom = 1.5f * Math.Min(graphics.Width / 1280.0f, graphics.Height / 800.0f); // Set zoom according to user's resolution to ensure full visibility (initial zoom (1.5) is set for full visibility at 1280x800 resolution) // Create 2D physics world component PhysicsWorld2D physicsWorld = scene.CreateComponent <PhysicsWorld2D>(); physicsWorld.DrawJoint = (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(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f)); const float y = 15.0f; RigidBody2D prevBody = groundBody; for (uint i = 0; i < NumObjects; ++i) { Node node = scene.CreateChild("RigidBody"); // Create rigid body RigidBody2D body = node.CreateComponent <RigidBody2D>(); body.BodyType = BodyType2D.Dynamic; // Create box CollisionBox2D box = node.CreateComponent <CollisionBox2D>(); // Set friction box.Friction = 0.2f; // Set mask bits. box.MaskBits = 0xFFFF & ~0x0002; if (i == NumObjects - 1) { node.Position = new Vector3(1.0f * i, y, 0.0f); body.AngularDamping = 0.4f; box.SetSize(3.0f, 3.0f); box.Density = 100.0f; box.CategoryBits = 0x0002; } else { node.Position = new Vector3(0.5f + 1.0f * i, y, 0.0f); box.SetSize(1.0f, 0.25f); box.Density = 20.0f; box.CategoryBits = 0x0001; } ConstraintRevolute2D joint = node.CreateComponent <ConstraintRevolute2D>(); joint.OtherBody = prevBody; joint.Anchor = new Vector2(i, y); joint.CollideConnected = false; prevBody = body; } ConstraintRope2D constraintRope = groundNode.CreateComponent <ConstraintRope2D>(); constraintRope.OtherBody = prevBody; constraintRope.OwnerBodyAnchor = new Vector2(0.0f, y); constraintRope.MaxLength = NumObjects - 1.0f + 0.01f; }
public override void Start() { cache = GetSubsystem <ResourceCache>(); input = GetSubsystem <Input>(); Renderer renderer = GetSubsystem <Renderer>(); graphics = GetSubsystem <Graphics>(); viewport = renderer.GetViewport(0); scene = new Scene(); scene.CreateComponent <Octree>().SetSize(new BoundingBox(1, 100), 3); viewport.Scene = scene; camera = scene.CreateChild("Camera").CreateComponent <Camera>(); camera.Node.Position = new Vector3(15, 0, -1); camera.Orthographic = true; camera.OrthoSize = 26; viewport.Camera = camera; Node bg = camera.Node.CreateChild("bg"); var bgspr = bg.CreateComponent <StaticSprite2D>(); bgspr.SetSprite(cache.GetResource <Sprite2D>("scenarios/grasslands/bg.png")); bg.SetPosition(new Vector3(0, 0, 100)); bg.SetScale2D(Vector2.One * 5); chunkmat = cache.GetResource <Material>("_DBG/Unlit.xml"); chunkmat.SetTexture(0, cache.GetResource <Texture2D>("scenarios/grasslands/ground.png")); surfMat = cache.GetResource <Material>("_DBG/UnlitAlpha.xml"); surfMat.SetTexture(0, cache.GetResource <Texture2D>("scenarios/grasslands/surface.png")); //surfMat.SetTexture(0, cache.GetResource<Texture2D>("_DBG/dbg.png")); PhysicsWorld2D pw = scene.CreateComponent <PhysicsWorld2D>(); pw.SetContinuousPhysics(true); #if DEBUG scene.CreateComponent <DebugRenderer>(); SubscribeToEvent <PostRenderUpdateEvent>(e => RenderDebug()); #endif SubscribeToEvent <UpdateEvent>(e => Update()); // decors quick crappy hack decors.Add(GetSprite("scenarios/grasslands/Object/Bush (1).png")); decors.Add(GetSprite("scenarios/grasslands/Object/Bush (2).png")); decors.Add(GetSprite("scenarios/grasslands/Object/Bush (3).png")); decors.Add(GetSprite("scenarios/grasslands/Object/Bush (4).png")); decors.Add(GetSprite("scenarios/grasslands/Object/Mushroom_1.png")); decors.Add(GetSprite("scenarios/grasslands/Object/Mushroom_2.png")); decors.Add(GetSprite("scenarios/grasslands/Object/Stone.png")); decors.Add(GetSprite("scenarios/grasslands/Object/Sign_2.png")); decors.Add(GetSprite("scenarios/grasslands/Object/Tree_1.png")); decors.Add(GetSprite("scenarios/grasslands/Object/Tree_2.png")); decors.Add(GetSprite("scenarios/grasslands/Object/Tree_3.png")); foreach (Sprite2D d in decors) { d.SetHotSpot(new Vector2(0.5f, 0.1f)); } Sprite2D crateSprite = GetSprite("scenarios/grasslands/Object/Crate.png"); Sprite2D[] cloudSprites = { GetSprite("scenarios/cloud1.png"), GetSprite("scenarios/cloud2.png"), GetSprite("scenarios/cloud3.png"), }; Random rng = new Random(); for (int i = 0; i < chunksize * 200; i += chunksize) { GenerateChunk(i); //innefficient clouds :P var n = CreateSpriteNode(scene, cloudSprites[rng.Next(3)], 5, false); n.SetPosition(new Vector3(i + rng.Next(8), rng.Next(15) + 15, 15)); clouds.Add(n); //boxes if (rng.Next(10) == 0) { var c = CreateSpriteNode(scene, crateSprite, 2, true); c.SetPosition(new Vector3(i + rng.Next(8), 20, -5)); var box = c.CreateComponent <CollisionBox2D>(); box.SetSize(.8f, .8f); box.SetDensity(0.1f); box.SetRestitution(0.2f); box.SetFriction(0.05f); } } //for (float i = 0; i < chunksize*200; i+=0.2f) //{ // CreateDecor(i); //} //foreach (CollisionChain2D col in chunks) //{ // col.SetEnabled(false); //} currentVehicle = CreateTruck(new Vector2(2, 3)); }