/// <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); } } } }
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()); } }