Added little pirate and better movement.
parent
5209657cef
commit
91863845c5
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -6,26 +6,70 @@ public class MovableComponent : Node
|
||||||
public Vector3 targetPosition = Vector3.Zero;
|
public Vector3 targetPosition = Vector3.Zero;
|
||||||
public Vector3 currentPosition = Vector3.Zero;
|
public Vector3 currentPosition = Vector3.Zero;
|
||||||
public Vector3 currentVelocity = Vector3.Zero;
|
public Vector3 currentVelocity = Vector3.Zero;
|
||||||
|
|
||||||
|
public float targetAngle = 0;
|
||||||
|
public float currentAngle = 0;
|
||||||
|
public float currentAngularVelocity = 0;
|
||||||
|
|
||||||
[Export] public float maxSpeed = 3;
|
[Export] public float maxSpeed = 3;
|
||||||
|
|
||||||
private SpringDamper _springDamper;
|
private SpringDamper _positionSpringDamper;
|
||||||
|
private SpringDamper _angleSpringDamper;
|
||||||
|
|
||||||
[Signal]
|
[Signal]
|
||||||
delegate void PositionUpdated(Vector3 newPosition);
|
delegate void PositionUpdated(Vector3 newPosition);
|
||||||
|
|
||||||
|
[Signal]
|
||||||
|
delegate void OrientationUpdated(float newAngle);
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
// Called when the node enters the scene tree for the first time.
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
_springDamper = new SpringDamper(4, 0.99f, 0.5f);
|
_positionSpringDamper = new SpringDamper(4, 0.99f, 0.5f);
|
||||||
|
_angleSpringDamper = new SpringDamper(4, 0.99f, 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
// Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
public override void _Process(float delta)
|
public override void _Process(float delta)
|
||||||
{
|
{
|
||||||
if ((targetPosition - currentPosition).LengthSquared() > 0.01)
|
Vector3 targetDir = Vector3.Zero;
|
||||||
|
Vector3 targetError = targetPosition - currentPosition;
|
||||||
|
|
||||||
|
if (targetError.LengthSquared() > 0.01)
|
||||||
|
{
|
||||||
|
targetDir = targetError.Normalized();
|
||||||
|
targetAngle = new Vector3(0, 0, 1).SignedAngleTo(targetDir, Vector3.Up);
|
||||||
|
|
||||||
|
if (currentAngle < Mathf.Pi && targetAngle > Mathf.Pi)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetAngle - currentAngle > Mathf.Pi)
|
||||||
|
{
|
||||||
|
currentAngle += 2 * Mathf.Pi;
|
||||||
|
}
|
||||||
|
else if (targetAngle - currentAngle < -Mathf.Pi)
|
||||||
|
{
|
||||||
|
currentAngle -= 2 * Mathf.Pi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Mathf.Abs(currentAngularVelocity) > 0.1 || Mathf.Abs(targetAngle - currentAngle) > 0.01)
|
||||||
|
{
|
||||||
|
var springDamperResult = _angleSpringDamper.Calc(currentAngle, currentAngularVelocity, targetAngle, delta);
|
||||||
|
|
||||||
|
currentAngle = springDamperResult.Item1;
|
||||||
|
currentAngularVelocity = springDamperResult.Item2;
|
||||||
|
|
||||||
|
EmitSignal("OrientationUpdated", this.currentAngle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (( Mathf.Abs(currentAngularVelocity) < 5 && Mathf.Abs(targetAngle - currentAngle) < 0.3)
|
||||||
|
&& (targetPosition - currentPosition).LengthSquared() > 0.01)
|
||||||
{
|
{
|
||||||
var springDamperResult =
|
var springDamperResult =
|
||||||
_springDamper.CalcClampedSpeed(currentPosition, currentVelocity, targetPosition, delta, maxSpeed);
|
_positionSpringDamper.CalcClampedSpeed(currentPosition, currentVelocity, targetPosition, delta, maxSpeed);
|
||||||
|
|
||||||
currentPosition = springDamperResult.Item1;
|
currentPosition = springDamperResult.Item1;
|
||||||
currentVelocity = springDamperResult.Item2;
|
currentVelocity = springDamperResult.Item2;
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System;
|
||||||
public class Player : KinematicBody
|
public class Player : KinematicBody
|
||||||
{
|
{
|
||||||
private MovableComponent _movable;
|
private MovableComponent _movable;
|
||||||
|
private Spatial _geometry;
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
// Called when the node enters the scene tree for the first time.
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
|
@ -12,7 +13,10 @@ public class Player : KinematicBody
|
||||||
if (_movable != null)
|
if (_movable != null)
|
||||||
{
|
{
|
||||||
_movable.Connect("PositionUpdated", this, nameof(OnPositionUpdated));
|
_movable.Connect("PositionUpdated", this, nameof(OnPositionUpdated));
|
||||||
|
_movable.Connect("OrientationUpdated", this, nameof(OnOrientationUpdated));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_geometry = (Spatial)FindNode("Geometry", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPositionUpdated(Vector3 newPosition)
|
private void OnPositionUpdated(Vector3 newPosition)
|
||||||
|
@ -21,4 +25,9 @@ public class Player : KinematicBody
|
||||||
transform.origin = newPosition;
|
transform.origin = newPosition;
|
||||||
Transform = transform;
|
Transform = transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnOrientationUpdated(float newOrientation)
|
||||||
|
{
|
||||||
|
_geometry.Transform = new Transform (new Quat(Vector3.Up, newOrientation), Vector3.Zero);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,17 +9,17 @@
|
||||||
config_version=4
|
config_version=4
|
||||||
|
|
||||||
_global_script_classes=[ {
|
_global_script_classes=[ {
|
||||||
"base": "Node",
|
"base": "Reference",
|
||||||
"class": "ClickableComponent",
|
"class": "ClickableComponent",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://components/ClickableComponent.gd"
|
"path": "res://components/ClickableComponent.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "KinematicBody2D",
|
"base": "Reference",
|
||||||
"class": "CollisionLine",
|
"class": "CollisionLine",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://utils/CollisionLine.gd"
|
"path": "res://utils/CollisionLine.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "Node",
|
"base": "Reference",
|
||||||
"class": "ColorComponent",
|
"class": "ColorComponent",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://components/ColorComponent.gd"
|
"path": "res://components/ColorComponent.gd"
|
||||||
|
@ -54,7 +54,7 @@ _global_script_classes=[ {
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://utils/SpringDamper.gd"
|
"path": "res://utils/SpringDamper.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "Sprite",
|
"base": "Reference",
|
||||||
"class": "TintedSpriteComponent",
|
"class": "TintedSpriteComponent",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://components/TintedSpriteComponent.gd"
|
"path": "res://components/TintedSpriteComponent.gd"
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
[gd_scene load_steps=13 format=2]
|
[gd_scene load_steps=14 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://scenes/AdaptiveWorldStream.cs" type="Script" id=1]
|
[ext_resource path="res://scenes/AdaptiveWorldStream.cs" type="Script" id=1]
|
||||||
|
[ext_resource path="res://assets/CreatusPiratePack/characters/Pirate1final.glb" type="PackedScene" id=2]
|
||||||
[ext_resource path="res://scenes/World.gd" type="Script" id=3]
|
[ext_resource path="res://scenes/World.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://scenes/StreamContainer.cs" type="Script" id=4]
|
[ext_resource path="res://scenes/StreamContainer.cs" type="Script" id=4]
|
||||||
[ext_resource path="res://entities/Player.cs" type="Script" id=5]
|
[ext_resource path="res://entities/Player.cs" type="Script" id=5]
|
||||||
|
@ -211,7 +212,13 @@ script = ExtResource( 6 )
|
||||||
|
|
||||||
[node name="MeshInstance" type="MeshInstance" parent="Player"]
|
[node name="MeshInstance" type="MeshInstance" parent="Player"]
|
||||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.5, 0 )
|
transform = Transform( 1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.5, 0 )
|
||||||
|
visible = false
|
||||||
mesh = SubResource( 8 )
|
mesh = SubResource( 8 )
|
||||||
|
|
||||||
[node name="Movable" type="Node" parent="Player"]
|
[node name="Movable" type="Node" parent="Player"]
|
||||||
script = ExtResource( 8 )
|
script = ExtResource( 8 )
|
||||||
|
|
||||||
|
[node name="Geometry" type="Spatial" parent="Player"]
|
||||||
|
|
||||||
|
[node name="Mesh" parent="Player/Geometry" instance=ExtResource( 2 )]
|
||||||
|
transform = Transform( 0.3, 0, 0, 0, 0.3, 0, 0, 0, 0.3, 0, 0, 0 )
|
||||||
|
|
|
@ -4,11 +4,8 @@ using Godot;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
public class SpringDamper : Node
|
public class SpringDamper
|
||||||
{
|
{
|
||||||
// Declare member variables here. Examples:
|
|
||||||
// private int a = 2;
|
|
||||||
// private string b = "text";
|
|
||||||
public float omega = 1;
|
public float omega = 1;
|
||||||
public float zeta = 1;
|
public float zeta = 1;
|
||||||
|
|
||||||
|
@ -19,10 +16,18 @@ public class SpringDamper : Node
|
||||||
zeta = Mathf.Log(1.0f - osc_red) / (-omega * osc_red_h);
|
zeta = Mathf.Log(1.0f - osc_red) / (-omega * osc_red_h);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
public (float, float) Calc(float x, float v, float xt, float h)
|
||||||
public override void _Ready()
|
|
||||||
{
|
{
|
||||||
|
float f = 1 + 2 * h * zeta * omega;
|
||||||
|
float oo = omega * omega;
|
||||||
|
float hoo = oo * h;
|
||||||
|
float hhoo = hoo * h;
|
||||||
|
|
||||||
|
float det_inv = 1.0f / (f + hhoo);
|
||||||
|
float det_x = f * x + h * v + hhoo * xt;
|
||||||
|
float det_v = v + hoo * (xt - x);
|
||||||
|
|
||||||
|
return (det_x * det_inv, det_v * det_inv);
|
||||||
}
|
}
|
||||||
|
|
||||||
public (Vector3, Vector3) Calc(Vector3 x, Vector3 v, Vector3 xt, float h)
|
public (Vector3, Vector3) Calc(Vector3 x, Vector3 v, Vector3 xt, float h)
|
||||||
|
|
Loading…
Reference in New Issue