From 655862fc0fd939dd66017b3d7f9bbd48c96da5fe Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 29 Sep 2015 20:06:15 +0300 Subject: [PATCH] Simpler anim logic for off-screen characters (all limbs except refLimb are hidden) --- Subsurface/Source/Characters/Character.cs | 11 ++--- .../Source/Characters/FishAnimController.cs | 36 ++++++++++++++++- .../Characters/HumanoidAnimController.cs | 37 +++++++++++++++-- Subsurface/Source/Characters/Ragdoll.cs | 38 +++++++++++++++--- .../Source/Events/Quests/MonsterQuest.cs | 7 +--- .../Items/Components/Machines/Reactor.cs | 2 +- Subsurface/Source/Map/Levels/Level.cs | 17 ++------ .../Source/Screens/EditCharacterScreen.cs | 2 +- Subsurface/Source/Screens/GameScreen.cs | 2 +- Subsurface_Solution.v12.suo | Bin 746496 -> 746496 bytes 10 files changed, 116 insertions(+), 36 deletions(-) diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index f5a58ec55..1962bc932 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -601,11 +601,10 @@ namespace Subsurface /// public void ControlLocalPlayer(float deltaTime, Camera cam, bool moveCam = true) { - //if (isDead) - //{ - - // return; - //} + if (PlayerInput.KeyHit(Keys.U)) + { + AnimController.SimplePhysicsEnabled = !AnimController.SimplePhysicsEnabled; + } Limb head = AnimController.GetLimb(LimbType.Head); @@ -747,6 +746,8 @@ namespace Subsurface public virtual void Update(Camera cam, float deltaTime) { + AnimController.SimplePhysicsEnabled = (Character.controlled!=this && Vector2.Distance(cam.WorldViewCenter, Position)>2000.0f); + if (isDead) return; if (PressureProtection==0.0f && diff --git a/Subsurface/Source/Characters/FishAnimController.cs b/Subsurface/Source/Characters/FishAnimController.cs index 491c34364..9ef14ac76 100644 --- a/Subsurface/Source/Characters/FishAnimController.cs +++ b/Subsurface/Source/Characters/FishAnimController.cs @@ -4,6 +4,7 @@ using System.Xml.Linq; using FarseerPhysics; using FarseerPhysics.Dynamics.Joints; using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; namespace Subsurface { @@ -48,6 +49,11 @@ namespace Subsurface public override void UpdateAnim(float deltaTime) { + if (PlayerInput.KeyHit(Keys.I)) + { + SimplePhysicsEnabled = !SimplePhysicsEnabled; + } + if (character.IsDead) { UpdateDying(deltaTime); @@ -68,6 +74,10 @@ namespace Subsurface stunTimer -= deltaTime; return; } + else if (SimplePhysicsEnabled) + { + UpdateSimpleAnim(); + } else { if (inWater) @@ -80,7 +90,6 @@ namespace Subsurface } } - if (flip) { //targetDir = (movement.X > 0.0f) ? Direction.Right : Direction.Left; @@ -208,6 +217,31 @@ namespace Subsurface floorY = Limbs[0].SimPosition.Y; } } + + void UpdateSimpleAnim() + { + movement = MathUtils.SmoothStep(movement, TargetMovement*swimSpeed, 1.0f); + if (movement == Vector2.Zero) return; + + float movementAngle = MathUtils.VectorToAngle(movement) - MathHelper.PiOver2; + + RefLimb.body.SmoothRotate( + (rotateTowardsMovement) ? + RefLimb.body.Rotation + MathUtils.GetShortestAngle(RefLimb.body.Rotation, movementAngle) : + HeadAngle*Dir); + + RefLimb.pullJoint.Enabled = true; + RefLimb.pullJoint.WorldAnchorB = + RefLimb.SimPosition + movement * 0.1f; + + RefLimb.body.SmoothRotate(0.0f); + + foreach (Limb l in Limbs) + { + if (l == RefLimb) continue; + l.body.SetTransform(RefLimb.SimPosition, RefLimb.Rotation); + } + } void UpdateWalkAnim(float deltaTime) { diff --git a/Subsurface/Source/Characters/HumanoidAnimController.cs b/Subsurface/Source/Characters/HumanoidAnimController.cs index cc79e911a..0f19a120e 100644 --- a/Subsurface/Source/Characters/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/HumanoidAnimController.cs @@ -30,8 +30,8 @@ namespace Subsurface public override void UpdateAnim(float deltaTime) { - if (character.IsDead) return; - + if (character.IsDead) return; + Vector2 colliderPos = GetLimb(LimbType.Torso).SimPosition; //if (inWater) stairs = null; @@ -136,6 +136,15 @@ namespace Subsurface return; } + if (TargetDir != dir) Flip(); + + if (SimplePhysicsEnabled) + { + UpdateStandingSimple(); + return; + } + + switch (Anim) { case Animation.Climbing: @@ -152,7 +161,6 @@ namespace Subsurface break; } - if (TargetDir != dir) Flip(); foreach (Limb limb in Limbs) { @@ -389,6 +397,29 @@ namespace Subsurface } + void UpdateStandingSimple() + { + movement = MathUtils.SmoothStep(movement, TargetMovement, movementLerp); + + if (inWater && movement != Vector2.Zero) + { + movement = Vector2.Normalize(movement); + } + + RefLimb.pullJoint.Enabled = true; + RefLimb.pullJoint.WorldAnchorB = + RefLimb.SimPosition + movement*0.15f; + + RefLimb.body.SmoothRotate(0.0f); + + foreach (Limb l in Limbs) + { + if (l==RefLimb) continue; + l.body.SetTransform(RefLimb.SimPosition, RefLimb.Rotation); + } + //new Vector2(movement.X, floorY + HeadPosition), 0.5f); + } + void UpdateSwimming() { IgnorePlatforms = true; diff --git a/Subsurface/Source/Characters/Ragdoll.cs b/Subsurface/Source/Characters/Ragdoll.cs index bff201eea..849d84a57 100644 --- a/Subsurface/Source/Characters/Ragdoll.cs +++ b/Subsurface/Source/Characters/Ragdoll.cs @@ -22,7 +22,9 @@ namespace Subsurface private Dictionary limbDictionary; public RevoluteJoint[] limbJoints; - Character character; + private bool simplePhysicsEnabled; + + private Character character; private Limb lowestLimb; @@ -76,6 +78,29 @@ namespace Subsurface private set; } + public bool SimplePhysicsEnabled + { + get { return simplePhysicsEnabled; } + set + { + if (value == simplePhysicsEnabled) return; + + simplePhysicsEnabled = value; + + foreach (Limb limb in Limbs) + { + limb.body.Enabled = !simplePhysicsEnabled; + } + + foreach (RevoluteJoint joint in limbJoints) + { + joint.Enabled = !simplePhysicsEnabled; + } + + refLimb.body.Enabled = true; + } + } + public Vector2 TargetMovement { get @@ -473,11 +498,11 @@ namespace Subsurface } } - public static void UpdateAll(float deltaTime) + public static void UpdateAll(Camera cam, float deltaTime) { foreach (Ragdoll r in list) { - r.Update(deltaTime); + r.Update(cam, deltaTime); } } @@ -491,10 +516,12 @@ namespace Subsurface currentHull); } - public void Update(float deltaTime) + public void Update(Camera cam, float deltaTime) { UpdateNetplayerPosition(); + + Vector2 flowForce = Vector2.Zero; FindLowestLimb(); @@ -537,8 +564,7 @@ namespace Subsurface limb.inWater = true; } else if (limbHull.Volume > 0.0f && Submarine.RectContains(limbHull.Rect, limbPosition)) - { - + { if (limbPosition.Y < limbHull.Surface) { limb.inWater = true; diff --git a/Subsurface/Source/Events/Quests/MonsterQuest.cs b/Subsurface/Source/Events/Quests/MonsterQuest.cs index f88110803..686ae94ac 100644 --- a/Subsurface/Source/Events/Quests/MonsterQuest.cs +++ b/Subsurface/Source/Events/Quests/MonsterQuest.cs @@ -18,10 +18,7 @@ namespace Subsurface public override Vector2 RadarPosition { - get - { - return monster.Position; - } + get { return monster.Position; } } public MonsterQuest(XElement element) @@ -34,7 +31,7 @@ namespace Subsurface { Vector2 position = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)]; - monster = new Character(monsterFile, ConvertUnits.ToSimUnits(position+level.Position)); + monster = new AICharacter(monsterFile, ConvertUnits.ToSimUnits(position+level.Position)); } public override void End() diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index 7420c9342..8cfc099b9 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -206,7 +206,7 @@ namespace Subsurface.Items.Components if (item.CurrentHull != null) { //the sound can be heard from 20 000 display units away when everything running at 100% - item.CurrentHull.SoundRange += (coolingRate + fissionRate) * 100; + item.CurrentHull.SoundRange = (coolingRate + fissionRate) * 100; } UpdateGraph(deltaTime); diff --git a/Subsurface/Source/Map/Levels/Level.cs b/Subsurface/Source/Map/Levels/Level.cs index ef8664c0e..2ccacad2f 100644 --- a/Subsurface/Source/Map/Levels/Level.cs +++ b/Subsurface/Source/Map/Levels/Level.cs @@ -728,19 +728,10 @@ int currentTargetIndex = 1; } } - foreach (MapEntity mapEntity in MapEntity.mapEntityList) - { - Item item = mapEntity as Item; - if (item == null) - { - //if (!mapEntity.MoveWithLevel) continue; - //mapEntity.Move(velocity); - } - else if (item.body!=null) - { - if (item.CurrentHull != null) continue; - item.body.LinearVelocity += simVelocity; - } + foreach (Item item in Item.itemList) + { + if (item.body==null || item.CurrentHull != null) continue; + item.body.LinearVelocity += simVelocity; } AtStartPosition = Vector2.Distance(startPosition, -Position) < ExitDistance; diff --git a/Subsurface/Source/Screens/EditCharacterScreen.cs b/Subsurface/Source/Screens/EditCharacterScreen.cs index adcc4fda8..dec16e249 100644 --- a/Subsurface/Source/Screens/EditCharacterScreen.cs +++ b/Subsurface/Source/Screens/EditCharacterScreen.cs @@ -110,7 +110,7 @@ namespace Subsurface { Character.UpdateAnimAll((float)Physics.step * 1000.0f); - Ragdoll.UpdateAll((float)Physics.step); + Ragdoll.UpdateAll(cam, (float)Physics.step); GameMain.World.Step((float)Physics.step); diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 9d88a2f84..891779d48 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -132,7 +132,7 @@ namespace Subsurface Debug.WriteLine(" char: " + sw.ElapsedTicks); sw.Restart(); - Ragdoll.UpdateAll((float)Physics.step); + Ragdoll.UpdateAll(cam, (float)Physics.step); if (GameMain.GameSession != null && GameMain.GameSession.Level != null) { diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index a32fa03b6a0d2699278e7bc1697982d0ba693fb4..3932c192e0688e87a1ecb480c15c1884e611aa48 100644 GIT binary patch delta 2778 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 bEl!&BvL{YrWX8yt7&BvGBKRJ*b{GB!$f`*^