Simpler anim logic for off-screen characters (all limbs except refLimb are hidden)
This commit is contained in:
@@ -601,11 +601,10 @@ namespace Subsurface
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void ControlLocalPlayer(float deltaTime, Camera cam, bool moveCam = true)
|
public void ControlLocalPlayer(float deltaTime, Camera cam, bool moveCam = true)
|
||||||
{
|
{
|
||||||
//if (isDead)
|
if (PlayerInput.KeyHit(Keys.U))
|
||||||
//{
|
{
|
||||||
|
AnimController.SimplePhysicsEnabled = !AnimController.SimplePhysicsEnabled;
|
||||||
// return;
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
Limb head = AnimController.GetLimb(LimbType.Head);
|
Limb head = AnimController.GetLimb(LimbType.Head);
|
||||||
|
|
||||||
@@ -747,6 +746,8 @@ namespace Subsurface
|
|||||||
|
|
||||||
public virtual void Update(Camera cam, float deltaTime)
|
public virtual void Update(Camera cam, float deltaTime)
|
||||||
{
|
{
|
||||||
|
AnimController.SimplePhysicsEnabled = (Character.controlled!=this && Vector2.Distance(cam.WorldViewCenter, Position)>2000.0f);
|
||||||
|
|
||||||
if (isDead) return;
|
if (isDead) return;
|
||||||
|
|
||||||
if (PressureProtection==0.0f &&
|
if (PressureProtection==0.0f &&
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Xml.Linq;
|
|||||||
using FarseerPhysics;
|
using FarseerPhysics;
|
||||||
using FarseerPhysics.Dynamics.Joints;
|
using FarseerPhysics.Dynamics.Joints;
|
||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Input;
|
||||||
|
|
||||||
namespace Subsurface
|
namespace Subsurface
|
||||||
{
|
{
|
||||||
@@ -48,6 +49,11 @@ namespace Subsurface
|
|||||||
|
|
||||||
public override void UpdateAnim(float deltaTime)
|
public override void UpdateAnim(float deltaTime)
|
||||||
{
|
{
|
||||||
|
if (PlayerInput.KeyHit(Keys.I))
|
||||||
|
{
|
||||||
|
SimplePhysicsEnabled = !SimplePhysicsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
if (character.IsDead)
|
if (character.IsDead)
|
||||||
{
|
{
|
||||||
UpdateDying(deltaTime);
|
UpdateDying(deltaTime);
|
||||||
@@ -68,6 +74,10 @@ namespace Subsurface
|
|||||||
stunTimer -= deltaTime;
|
stunTimer -= deltaTime;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if (SimplePhysicsEnabled)
|
||||||
|
{
|
||||||
|
UpdateSimpleAnim();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (inWater)
|
if (inWater)
|
||||||
@@ -80,7 +90,6 @@ namespace Subsurface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (flip)
|
if (flip)
|
||||||
{
|
{
|
||||||
//targetDir = (movement.X > 0.0f) ? Direction.Right : Direction.Left;
|
//targetDir = (movement.X > 0.0f) ? Direction.Right : Direction.Left;
|
||||||
@@ -208,6 +217,31 @@ namespace Subsurface
|
|||||||
floorY = Limbs[0].SimPosition.Y;
|
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)
|
void UpdateWalkAnim(float deltaTime)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ namespace Subsurface
|
|||||||
|
|
||||||
public override void UpdateAnim(float deltaTime)
|
public override void UpdateAnim(float deltaTime)
|
||||||
{
|
{
|
||||||
if (character.IsDead) return;
|
if (character.IsDead) return;
|
||||||
|
|
||||||
Vector2 colliderPos = GetLimb(LimbType.Torso).SimPosition;
|
Vector2 colliderPos = GetLimb(LimbType.Torso).SimPosition;
|
||||||
|
|
||||||
//if (inWater) stairs = null;
|
//if (inWater) stairs = null;
|
||||||
@@ -136,6 +136,15 @@ namespace Subsurface
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TargetDir != dir) Flip();
|
||||||
|
|
||||||
|
if (SimplePhysicsEnabled)
|
||||||
|
{
|
||||||
|
UpdateStandingSimple();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (Anim)
|
switch (Anim)
|
||||||
{
|
{
|
||||||
case Animation.Climbing:
|
case Animation.Climbing:
|
||||||
@@ -152,7 +161,6 @@ namespace Subsurface
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TargetDir != dir) Flip();
|
|
||||||
|
|
||||||
foreach (Limb limb in Limbs)
|
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()
|
void UpdateSwimming()
|
||||||
{
|
{
|
||||||
IgnorePlatforms = true;
|
IgnorePlatforms = true;
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ namespace Subsurface
|
|||||||
private Dictionary<LimbType, Limb> limbDictionary;
|
private Dictionary<LimbType, Limb> limbDictionary;
|
||||||
public RevoluteJoint[] limbJoints;
|
public RevoluteJoint[] limbJoints;
|
||||||
|
|
||||||
Character character;
|
private bool simplePhysicsEnabled;
|
||||||
|
|
||||||
|
private Character character;
|
||||||
|
|
||||||
private Limb lowestLimb;
|
private Limb lowestLimb;
|
||||||
|
|
||||||
@@ -76,6 +78,29 @@ namespace Subsurface
|
|||||||
private set;
|
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
|
public Vector2 TargetMovement
|
||||||
{
|
{
|
||||||
get
|
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)
|
foreach (Ragdoll r in list)
|
||||||
{
|
{
|
||||||
r.Update(deltaTime);
|
r.Update(cam, deltaTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,10 +516,12 @@ namespace Subsurface
|
|||||||
currentHull);
|
currentHull);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(float deltaTime)
|
public void Update(Camera cam, float deltaTime)
|
||||||
{
|
{
|
||||||
UpdateNetplayerPosition();
|
UpdateNetplayerPosition();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Vector2 flowForce = Vector2.Zero;
|
Vector2 flowForce = Vector2.Zero;
|
||||||
|
|
||||||
FindLowestLimb();
|
FindLowestLimb();
|
||||||
@@ -537,8 +564,7 @@ namespace Subsurface
|
|||||||
limb.inWater = true;
|
limb.inWater = true;
|
||||||
}
|
}
|
||||||
else if (limbHull.Volume > 0.0f && Submarine.RectContains(limbHull.Rect, limbPosition))
|
else if (limbHull.Volume > 0.0f && Submarine.RectContains(limbHull.Rect, limbPosition))
|
||||||
{
|
{
|
||||||
|
|
||||||
if (limbPosition.Y < limbHull.Surface)
|
if (limbPosition.Y < limbHull.Surface)
|
||||||
{
|
{
|
||||||
limb.inWater = true;
|
limb.inWater = true;
|
||||||
|
|||||||
@@ -18,10 +18,7 @@ namespace Subsurface
|
|||||||
|
|
||||||
public override Vector2 RadarPosition
|
public override Vector2 RadarPosition
|
||||||
{
|
{
|
||||||
get
|
get { return monster.Position; }
|
||||||
{
|
|
||||||
return monster.Position;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MonsterQuest(XElement element)
|
public MonsterQuest(XElement element)
|
||||||
@@ -34,7 +31,7 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
Vector2 position = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)];
|
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()
|
public override void End()
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ namespace Subsurface.Items.Components
|
|||||||
if (item.CurrentHull != null)
|
if (item.CurrentHull != null)
|
||||||
{
|
{
|
||||||
//the sound can be heard from 20 000 display units away when everything running at 100%
|
//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);
|
UpdateGraph(deltaTime);
|
||||||
|
|||||||
@@ -728,19 +728,10 @@ int currentTargetIndex = 1;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (MapEntity mapEntity in MapEntity.mapEntityList)
|
foreach (Item item in Item.itemList)
|
||||||
{
|
{
|
||||||
Item item = mapEntity as Item;
|
if (item.body==null || item.CurrentHull != null) continue;
|
||||||
if (item == null)
|
item.body.LinearVelocity += simVelocity;
|
||||||
{
|
|
||||||
//if (!mapEntity.MoveWithLevel) continue;
|
|
||||||
//mapEntity.Move(velocity);
|
|
||||||
}
|
|
||||||
else if (item.body!=null)
|
|
||||||
{
|
|
||||||
if (item.CurrentHull != null) continue;
|
|
||||||
item.body.LinearVelocity += simVelocity;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AtStartPosition = Vector2.Distance(startPosition, -Position) < ExitDistance;
|
AtStartPosition = Vector2.Distance(startPosition, -Position) < ExitDistance;
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ namespace Subsurface
|
|||||||
{
|
{
|
||||||
Character.UpdateAnimAll((float)Physics.step * 1000.0f);
|
Character.UpdateAnimAll((float)Physics.step * 1000.0f);
|
||||||
|
|
||||||
Ragdoll.UpdateAll((float)Physics.step);
|
Ragdoll.UpdateAll(cam, (float)Physics.step);
|
||||||
|
|
||||||
GameMain.World.Step((float)Physics.step);
|
GameMain.World.Step((float)Physics.step);
|
||||||
|
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ namespace Subsurface
|
|||||||
Debug.WriteLine(" char: " + sw.ElapsedTicks);
|
Debug.WriteLine(" char: " + sw.ElapsedTicks);
|
||||||
sw.Restart();
|
sw.Restart();
|
||||||
|
|
||||||
Ragdoll.UpdateAll((float)Physics.step);
|
Ragdoll.UpdateAll(cam, (float)Physics.step);
|
||||||
|
|
||||||
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
|
if (GameMain.GameSession != null && GameMain.GameSession.Level != null)
|
||||||
{
|
{
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user