-
Notifications
You must be signed in to change notification settings - Fork 3
/
Player.tscn
90 lines (73 loc) · 2.49 KB
/
Player.tscn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
[gd_scene load_steps=3 format=2]
[ext_resource path="res://demo_assets/icon.png" type="Texture" id=1]
[sub_resource type="CSharpScript" id=1]
script/source = "using Godot;
using System;
using System.Linq;
using Godot.Collections;
public class Player : Sprite, INetworkable, INetworkedInputs
{
float Lerp(float firstFloat, float secondFloat, float by)
{
return firstFloat * (1 - by) + secondFloat * by;
}
Vector2 Lerp(Vector2 firstVector, Vector2 secondVector, float by)
{
float retX = Lerp(firstVector.x, secondVector.x, by);
float retY = Lerp(firstVector.y, secondVector.y, by);
return new Vector2(retX, retY);
}
public Vector2 ReadString (string str)
{
return new Vector2
(
float.Parse(str.Split('|')[0]),
float.Parse(str.Split('|')[1])
);
}
public Dictionary<string, string> SaveState ()
{
return new Dictionary<string, string>
{
{\"position\", Position.x + \"|\" + Position.y}
};
}
public void LoadState (Dictionary<string, string> state)
{
Position = ReadString(state[\"position\"]);
}
public void InterpolateState (Dictionary<string, string> oldState, Dictionary<string, string> newState, float weight)
{
Position = Lerp(ReadString(oldState[\"position\"]), ReadString(newState[\"position\"]), weight);
}
public Dictionary<int, string> GetLocalInput ()
{
Vector2 axis = new Vector2(
Input.GetActionStrength(\"player_right\") - Input.GetActionStrength(\"player_left\"),
Input.GetActionStrength(\"player_down\") - Input.GetActionStrength(\"player_up\"));
Dictionary<int, string> input = new Dictionary<int, string>();
if (axis != Vector2.Zero)
input[0] = axis.x + \"|\" + axis.y;
return input;
}
public Dictionary<int, string> PredictRemoteInput (Dictionary<int, string> previousInput, int ticksSinceRealInput)
{
Dictionary<int, string> inputs = previousInput.Duplicate();
if (ticksSinceRealInput > 5)
inputs.Remove(0);
return inputs;
}
public void NetworkTick (float delta, Dictionary<int, string> input)
{
Vector2 axis = new Vector2();
if(input.Count > 0)
axis = ReadString(input.First().Value);
Position += axis * 8;
}
}
"
[node name="Player" type="Sprite" groups=[
"network_sync",
]]
texture = ExtResource( 1 )
script = SubResource( 1 )