コード例 #1
0
 public BaseObject(Game game, World physicsWorld)
     : this(game)
 {
     this.physicsWorld = physicsWorld;
     if (!(this is PhysicsAdapter))
     {
         physicsAdapter                = new BoxAdapter(game, this, physicsWorld, Vector3.Zero, Vector3.One);
         physicsAdapterType            = typeof(BoxAdapter);
         physicsAdapterChangeRequested = false;
     }
     OnRotationChanged(this, null);
 }
コード例 #2
0
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);

            if (physicsAdapterChangeRequested)
            {
                bool reenableCharacterController = false, isStatic = false, isActive = false;
                if (physicsAdapter != null)
                {
                    if (physicsAdapter.CharacterController != null)
                    {
                        reenableCharacterController = true;
                    }
                    isStatic = physicsAdapter.Body.IsStatic;
                    isActive = physicsAdapter.Body.IsActive;
                }
                physicsAdapter = (PhysicsAdapter)Activator.CreateInstance(physicsAdapterType, physicsAdapterParameters);
                if (reenableCharacterController)
                {
                    physicsAdapter.EnableCharacterController();
                }
                physicsAdapter.Body.IsActive  = isActive;
                physicsAdapter.Body.IsStatic  = isStatic;
                physicsAdapterChangeRequested = false;
            }

            foreach (ControllerScript script in scripts)
            {
                script.Update(gameTime);
            }

            if (physicsAdapter != null)
            {
                if (physicsEnabled)
                {
                    if (!physicsWorld.RigidBodies.Contains(physicsAdapter.Body))
                    {
                        physicsWorld.AddBody(physicsAdapter.Body);
                    }

                    physicsAdapter.Update(gameTime);
                    Vector3 v = Vector3.Transform(physicsAdapter.RelativePosition, Matrix.CreateFromQuaternion(physicsAdapter.Rotation));
                    position = physicsAdapter.Position - v;
                    rotation = physicsAdapter.Rotation;

                    OnRotationChanged(this, new BodyGeoEventArgs(false));
                    OnPositionChanged(this, new BodyGeoEventArgs(false));
                }
                else
                {
                    if (physicsWorld.RigidBodies.Contains(physicsAdapter.Body))
                    {
                        physicsWorld.RemoveBody(physicsAdapter.Body);
                    }
                }
            }

            foreach (ControllerScript script in scripts)
            {
                script.LateUpdate();
            }
        }