コード例 #1
0
ファイル: GamePlay.cs プロジェクト: DioMuller/defend-uranus
        /// <summary>
        /// Update all the entities and handle collisions.
        /// </summary>
        /// <param name="gameTime">Current game time.</param>
        void UpdateEntities(GameTime gameTime)
        {
            _baseEntity.Update(gameTime);

            var camera = GetCamera();

            var upEnt = _entities.ToList();

            //Updates non physics
            _nonPhysicsEntities.ForEach(e => e.Update(gameTime));

            for (int i = 0; i < upEnt.Count; i++)
            {
                var ent = upEnt[i];
                if (!IsValidEntity(camera, ent))
                {
                    continue;
                }

                ent.UpdateContext.RunLoop(gameTime);

                if (!ent.InteractWithEntities)
                {
                    continue;
                }

                for (int j = i + 1; j < upEnt.Count; j++)
                {
                    var cEnt = upEnt[j];
                    if (!cEnt.InteractWithEntities)
                    {
                        continue;
                    }

                    var dist = ent.Position - cEnt.Position;

                    var minDist = ent.Size.Y / 2 + cEnt.Size.Y / 2;

                    // Handle gravity
                    if (dist != Vector2.Zero)
                    {
                        var distSquare = Math.Max(dist.LengthSquared(), 4096);
                        var direction  = Vector2.Normalize(dist);

                        var intensity = 1000 * (ent.Mass * cEnt.Mass) / distSquare;

                        ent.ApplyAcceleration(-direction * intensity);
                        cEnt.ApplyAcceleration(direction * intensity);
                    }

                    // Handle collisions
                    if (dist.Length() < minDist)
                    {
                        ResolveCollision(ent, cEnt, gameTime);
                    }
                }
            }
        }
コード例 #2
0
 public void PhysicsUpdate()
 {
     if (physicsEntity == null)
     {
         Debug.LogError("Character: PhysicsUpdate(): physics entity is null");
         return;
     }
     // Based on input, accelerate in direction that's being pressed
     // Horizontal
     if (isMovingLeft)
     {
         inputVelocityX -= stats.accelerationSpeed;
     }
     else if (isMovingRight)
     {
         inputVelocityX += stats.accelerationSpeed;
     }
     else
     {
         inputVelocityX /= MOVEMENT_INPUT_FRICTION;
         // If inputVelocity is sufficiently close to 0
         if (inputVelocityX < 0.001)
         {
             // snap to 0
             inputVelocityX = 0;
         }
     }
     // Vertical
     if (isMovingDown)
     {
         inputVelocityY -= stats.accelerationSpeed;
     }
     else if (isMovingUp)
     {
         inputVelocityY += stats.accelerationSpeed;
     }
     else
     {
         inputVelocityY /= MOVEMENT_INPUT_FRICTION;
         // If inputVelocity is sufficiently close to 0
         if (inputVelocityY < 0.001)
         {
             // snap to 0
             inputVelocityY = 0;
         }
     }
     // Clamp to maximum input speed
     inputVelocityX = Mathf.Clamp(inputVelocityX, -stats.movementSpeed, stats.movementSpeed);
     inputVelocityY = Mathf.Clamp(inputVelocityY, -stats.movementSpeed, stats.movementSpeed);
     // Pass calculated velocity to physics entity
     physicsEntity.AddInputVelocity(inputVelocityX, inputVelocityY);
     physicsEntity.Update();
     if (HasAuthority())
     {
         // Update the local position based on physics simulation
         transform.position = physicsEntity.transformPosition;
     }
     else
     {
         // Move visual representation a bit closer to the correct position
         transform.position = Vector3.Lerp(transform.position, physicsEntity.transformPosition, GetCurrentLerpFactor());
     }
 }