Simple player entity

WorldChunkRefactoring
Martin Felis 2022-08-19 18:48:54 +02:00
parent 69b66e0511
commit 3525ef2ecd
14 changed files with 406 additions and 49 deletions

203
Assets/pirate.svg Normal file
View File

@ -0,0 +1,203 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="67.73333mm"
height="67.73333mm"
viewBox="0 0 67.73333 67.73333"
version="1.1"
id="svg1420"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
sodipodi:docname="pirate.svg">
<defs
id="defs1414" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="193.12383"
inkscape:cy="128.13748"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1916"
inkscape:window-height="1041"
inkscape:window-x="0"
inkscape:window-y="37"
inkscape:window-maximized="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
showguides="false" />
<metadata
id="metadata1417">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-22.735567,-21.843752)">
<rect
style="fill:none;fill-opacity:1;stroke:none;stroke-width:1.16499996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect2086"
width="67.73333"
height="67.73333"
x="22.735567"
y="21.843752" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.97067016;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1965"
cx="58.817451"
cy="69.21006"
rx="12.306589"
ry="13.607285" />
<ellipse
style="fill:#ffccaa;fill-opacity:1;stroke:#000000;stroke-width:0.97067016;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1967"
cx="58.517292"
cy="43.996555"
rx="12.806856"
ry="13.807391" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.64763337;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 45.064956,44.376975 70.573747,37.843264"
id="path1971"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:#1a1a1a;fill-rule:evenodd;stroke:#000000;stroke-width:0.57276243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 51.618464,41.275314 0.383478,2.521691 1.51754,1.03021 2.8015,-0.100052 c 1.76379,-0.867768 1.776356,-2.027407 2.001071,-3.151687 z"
id="path1975"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccc" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.64763337;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 66.571604,49.474492 c -10e-7,0.870314 -5.010624,3.777022 -8.229406,3.777022 -3.218781,0 -8.129351,-3.156842 -8.129352,-4.027156 -10e-7,-0.870314 4.91057,0.875469 8.129352,0.875469 3.218782,0 8.229406,-1.495649 8.229406,-0.625335 z"
id="path1982"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssss" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.64763337;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1985"
cx="64.220352"
cy="42.645832"
rx="2.501339"
ry="1.4507767" />
<ellipse
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.64763337;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path1987"
cx="64.320404"
cy="42.370686"
rx="0.95050877"
ry="0.92549545" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.87224609;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 58.317186,44.346745 c -0.48074,1.110566 -2.780721,3.873885 0.100053,3.501876"
id="path1991"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<g
id="g2020"
transform="matrix(0.7487091,0,0,0.7487091,22.011525,15.311364)">
<rect
y="60.764866"
x="34.11235"
height="4.7613068"
width="29.098907"
id="rect1993"
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.16499996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="70.426895"
x="31.608257"
height="5.3861618"
width="33.261906"
id="rect1993-3"
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.16499996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
inkscape:transform-center-y="-1.7953869"
inkscape:transform-center-x="4.2522321"
y="80.801094"
x="34.773071"
height="3.9466267"
width="27.487846"
id="rect1993-6"
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.16499996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<path
style="fill:#ff0000;fill-rule:evenodd;stroke:#000000;stroke-width:1.24660063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 42.10851,46.397844 11.91124,-6.273146 17.704613,-3.131888 -1.152956,-4.88569 -3.659617,-4.307194 -6.593533,-2.41333 -6.560565,1.23882 -6.046183,2.763322 -4.202251,12.206536 -5.602999,-3.001607 -1.400748,5.803105 5.002677,4.602464 z"
id="path1969"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccc" />
<ellipse
style="fill:#ffff00;fill-opacity:1;stroke:#241c1c;stroke-width:0.59499997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.28632483"
id="path891"
cx="71.115189"
cy="57.663963"
rx="4.9444861"
ry="7.4835467" />
<ellipse
style="fill:#ffff00;fill-opacity:1;stroke:#241c1c;stroke-width:0.59499997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.28632483"
id="path893"
cx="70.914734"
cy="46.973183"
rx="3.4076865"
ry="4.4099469" />
<path
style="fill:#ffff00;fill-opacity:1;stroke:#241c1c;stroke-width:0.59499997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.28632483"
d="m 76.576478,56.227926 c 0.974202,3.635771 0.665907,6.877365 -0.688596,7.240302 -1.354503,0.362937 -3.24229,-2.290218 -4.216492,-5.925988 -0.974202,-3.635771 -0.665907,-6.877365 0.688596,-7.240302 1.354503,-0.362937 3.24229,2.290218 4.216492,5.925988 z"
id="path895"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sssss" />
<path
style="fill:#ffff00;fill-rule:evenodd;stroke:#c0be08;stroke-width:0.59500003;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 67.774315,45.866354 c 0,0 -2.666291,1.274117 -3.073598,2.53906 -0.268239,0.833048 0.668174,2.539061 0.668174,2.539061 l 1.202713,-1.469983 2.004521,-0.400904 z"
id="path897"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscccc" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.59499997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.28632483"
id="path899"
sodipodi:type="arc"
sodipodi:cx="-70.017845"
sodipodi:cy="-46.00531"
sodipodi:rx="1.0151163"
sodipodi:ry="1.603617"
sodipodi:start="0"
sodipodi:end="6.2530804"
d="m -69.002729,-46.00531 a 1.0151163,1.603617 0 0 1 -1.007476,1.603571 1.0151163,1.603617 0 0 1 -1.022641,-1.579434 1.0151163,1.603617 0 0 1 0.992083,-1.627345 1.0151163,1.603617 0 0 1 1.037574,1.554938 l -1.014656,0.04827 z"
transform="scale(-1)" />
<path
style="fill:#ffffff;fill-opacity:0.28627451;stroke:#000000;stroke-width:0.59499997;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path901"
sodipodi:type="arc"
sodipodi:cx="69.808182"
sodipodi:cy="46.459103"
sodipodi:rx="0.20966499"
sodipodi:ry="0.45379427"
sodipodi:start="0"
sodipodi:end="6.2530784"
d="m 70.017847,46.459103 a 0.20966499,0.45379427 0 0 1 -0.208087,0.453781 0.20966499,0.45379427 0 0 1 -0.211219,-0.44695 0.20966499,0.45379427 0 0 1 0.204907,-0.46051 0.20966499,0.45379427 0 0 1 0.214304,0.440018 l -0.20957,0.01366 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.6 KiB

35
Assets/pirate.svg.import Normal file
View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/pirate.svg-3b2dea93c8f9ecaa3dd364c5dc991522.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Assets/pirate.svg"
dest_files=[ "res://.import/pirate.svg-3b2dea93c8f9ecaa3dd364c5dc991522.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=true
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
process/normal_map_invert_y=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

View File

@ -7,10 +7,22 @@ export var collision_size = Vector2(1, 1)
onready var collision_shape = $Area2D
var is_mouseover = false
# Called when the node enters the scene tree for the first time.
func _ready():
collision_shape.scale = collision_size
func _on_Area2D_input_event(viewport, event, shape_idx):
if event is InputEventMouseButton and event.pressed:
func _input(event):
if event is InputEventMouseButton and event.pressed and is_mouseover:
emit_signal ("clicked")
get_tree().get_root().set_input_as_handled()
func _on_Area2D_mouse_entered():
is_mouseover = true
func _on_Area2D_mouse_exited():
is_mouseover = false

View File

@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=2]
[ext_resource path="res://Components/ClickableComponent.gd" type="Script" id=1]
[sub_resource type="CircleShape2D" id=1]
radius = 31.4006
[node name="Clickable" type="Node2D"]
script = ExtResource( 1 )
[node name="Area2D" type="Area2D" parent="."]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
shape = SubResource( 1 )
[connection signal="mouse_entered" from="Area2D" to="." method="_on_Area2D_mouse_entered"]
[connection signal="mouse_exited" from="Area2D" to="." method="_on_Area2D_mouse_exited"]

View File

@ -1,12 +1,16 @@
extends Node2D
var SpringDamper = preload("res://Utils/SpringDamper.gd")
export var target = Vector2 (0, 0)
export var pos = Vector2 (0, 0)
export var vel = Vector2 (0, 0)
export var max_speed = 50
export var spring_k = 10
export var spring_b = 0.5
onready var spring_damper = SpringDamper.new(4, .99, 0.5)
var velocity = Vector2(0, 0)
const pos_error_eps = 0.01
@ -20,8 +24,9 @@ func _ready():
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if (target - pos).length_squared() > pos_error_eps * pos_error_eps:
var acceleration = spring_k * (target - pos) - spring_b * velocity
velocity = velocity + acceleration * delta
pos = pos + velocity * delta
var spring_res = spring_damper.calc(pos, vel, target, delta)
pos = spring_res[0]
vel = spring_res[1]
emit_signal("position_updated", pos)

44
Entities/PlayerEntity.gd Normal file
View File

@ -0,0 +1,44 @@
extends Node2D
onready var color_component = $Components/Color
onready var tinted_sprite_component = $Components/TintedSprite
onready var clickable_component = $Components/Clickable
onready var movable_component = $Components/Movable
onready var is_active = false
# Called when the node enters the scene tree for the first time.
func _ready():
if color_component and tinted_sprite_component:
print ("Connecting signals")
color_component.connect("color_changed", tinted_sprite_component, "set_color_tint")
if clickable_component:
clickable_component.connect("clicked", self, "_on_entity_clicked")
if movable_component:
movable_component.connect("position_updated", self, "_on_position_updated")
movable_component.target = self.transform.origin
movable_component.pos = self.transform.origin
func _process(delta):
if is_active and color_component:
var color = Color(
(sin(float(OS.get_system_time_msecs()) / 1000.0) + 1.0) / 2.0,
(sin(float(OS.get_system_time_msecs()) / 300.0) + 1.0) / 2.0,
(sin(float(OS.get_system_time_msecs()) / 100.0) + 1.0) / 2.0
)
color_component.set_color(color)
pass
func _on_entity_clicked():
is_active = not is_active
func _on_position_updated(new_position):
transform.origin = new_position
update()
func on_world_location_clicked(position):
assert(movable_component)
movable_component.target = position

View File

@ -0,0 +1,25 @@
[gd_scene load_steps=7 format=2]
[ext_resource path="res://Entities/PlayerEntity.gd" type="Script" id=1]
[ext_resource path="res://Components/TintedSpriteComponent.gd" type="Script" id=2]
[ext_resource path="res://Components/ColorComponent.gd" type="Script" id=3]
[ext_resource path="res://Components/ClickableComponent.tscn" type="PackedScene" id=4]
[ext_resource path="res://Components/MovableComponent.gd" type="Script" id=5]
[ext_resource path="res://Assets/pirate.svg" type="Texture" id=6]
[node name="PlayerEntity" type="Node2D"]
script = ExtResource( 1 )
[node name="Components" type="Node2D" parent="."]
[node name="Movable" type="Node2D" parent="Components"]
script = ExtResource( 5 )
[node name="Clickable" parent="Components" instance=ExtResource( 4 )]
[node name="TintedSprite" type="Sprite" parent="Components"]
texture = ExtResource( 6 )
script = ExtResource( 2 )
[node name="Color" type="Node" parent="Components"]
script = ExtResource( 3 )

View File

@ -1,9 +1,9 @@
extends Node
extends Node2D
onready var color_component = $Components/Color
onready var tinted_sprite_component = $Components/TintedSprite
onready var clickable_component = $Components/Clickable
onready var undef_component = $ebvlerb
onready var movable_component = $Components/Movable
onready var is_active = false
@ -12,15 +12,12 @@ func _ready():
if color_component and tinted_sprite_component:
print ("Connecting signals")
color_component.connect("color_changed", tinted_sprite_component, "set_color_tint")
tinted_sprite_component.set_color_tint(color_component.color)
if clickable_component:
clickable_component.connect("clicked", self, "_on_entity_clicked")
func _process(delta):
if Engine.editor_hint:
tinted_sprite_component.tint_color = color_component.color
if is_active and color_component:
var color = Color(
(sin(float(OS.get_system_time_msecs()) / 1000.0) + 1.0) / 2.0,

View File

@ -1,26 +1,17 @@
[gd_scene load_steps=7 format=2]
[gd_scene load_steps=6 format=2]
[ext_resource path="res://Components/TintedSpriteComponent.gd" type="Script" id=1]
[ext_resource path="res://PlayerNode.gd" type="Script" id=2]
[ext_resource path="res://Entities/SimpleEntity.gd" type="Script" id=2]
[ext_resource path="res://Components/ColorComponent.gd" type="Script" id=3]
[ext_resource path="res://Components/ClickableComponent.gd" type="Script" id=4]
[ext_resource path="res://Components/ClickableComponent.tscn" type="PackedScene" id=4]
[ext_resource path="res://icon.png" type="Texture" id=5]
[sub_resource type="CircleShape2D" id=1]
radius = 31.4006
[node name="SimpleEntity" type="Node2D"]
script = ExtResource( 2 )
[node name="Components" type="Node2D" parent="."]
[node name="Clickable" type="Node2D" parent="Components"]
script = ExtResource( 4 )
[node name="Area2D" type="Area2D" parent="Components/Clickable"]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Components/Clickable/Area2D"]
shape = SubResource( 1 )
[node name="Clickable" parent="Components" instance=ExtResource( 4 )]
[node name="TintedSprite" type="Sprite" parent="Components"]
texture = ExtResource( 5 )
@ -29,5 +20,3 @@ script = ExtResource( 1 )
[node name="Color" type="Node" parent="Components"]
script = ExtResource( 3 )
color = Color( 1, 1, 1, 1 )
[connection signal="input_event" from="Components/Clickable/Area2D" to="Components/Clickable" method="_on_Area2D_input_event"]

View File

@ -1,15 +1,12 @@
[gd_scene load_steps=8 format=2]
[gd_scene load_steps=7 format=2]
[ext_resource path="res://Components/TintedSpriteComponent.gd" type="Script" id=1]
[ext_resource path="res://Entities/WanderingEntity.gd" type="Script" id=2]
[ext_resource path="res://Components/ColorComponent.gd" type="Script" id=3]
[ext_resource path="res://Components/ClickableComponent.gd" type="Script" id=4]
[ext_resource path="res://Components/ClickableComponent.tscn" type="PackedScene" id=4]
[ext_resource path="res://icon.png" type="Texture" id=5]
[ext_resource path="res://Components/MovableComponent.gd" type="Script" id=6]
[sub_resource type="CircleShape2D" id=1]
radius = 31.4006
[node name="WanderingEntity" type="Node2D"]
script = ExtResource( 2 )
@ -18,13 +15,7 @@ script = ExtResource( 2 )
[node name="Movable" type="Node2D" parent="Components"]
script = ExtResource( 6 )
[node name="Clickable" type="Node2D" parent="Components"]
script = ExtResource( 4 )
[node name="Area2D" type="Area2D" parent="Components/Clickable"]
[node name="CollisionShape2D" type="CollisionShape2D" parent="Components/Clickable/Area2D"]
shape = SubResource( 1 )
[node name="Clickable" parent="Components" instance=ExtResource( 4 )]
[node name="TintedSprite" type="Sprite" parent="Components"]
texture = ExtResource( 5 )
@ -32,5 +23,3 @@ script = ExtResource( 1 )
[node name="Color" type="Node" parent="Components"]
script = ExtResource( 3 )
[connection signal="input_event" from="Components/Clickable/Area2D" to="Components/Clickable" method="_on_Area2D_input_event"]

15
Game.gd
View File

@ -3,17 +3,14 @@ extends Node2D
onready var SimpleEntity = preload("res://Entities/SimpleEntity.tscn")
onready var WanderingEntity = preload("res://Entities/WanderingEntity.tscn")
onready var player = $PlayerEntity
onready var entities = $Entities
signal world_location_clicked
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
#func _process(delta):
# pass
self.connect("world_location_clicked", player, "on_world_location_clicked")
func _on_AddEntityButton_pressed():
var entity_instance = SimpleEntity.instance()
@ -27,3 +24,9 @@ func _on_AddWanderingEntity_pressed():
entity_instance.transform.origin = Vector2(randf() * viewport_rect.size[0], randf() * viewport_rect.size[1])
entities.add_child(entity_instance)
entity_instance.set_target(Vector2(randf() * viewport_rect.size[0], randf() * viewport_rect.size[1]))
func _unhandled_input(event):
if event is InputEventMouseButton and event.pressed:
#get_tree().get_root().set_input_as_handled()
emit_signal("world_location_clicked", event.position)
pass

View File

@ -1,6 +1,7 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://Entities/SimpleEntity.tscn" type="PackedScene" id=1]
[ext_resource path="res://Entities/PlayerEntity.tscn" type="PackedScene" id=2]
[ext_resource path="res://Game.gd" type="Script" id=6]
[node name="Game" type="Node2D"]
@ -34,15 +35,18 @@ __meta__ = {
[node name="SimpleEntity" parent="Entities" instance=ExtResource( 1 )]
position = Vector2( 360, 118 )
[node name="Color" parent="Entities/SimpleEntity/Components" index="3"]
[node name="Color" parent="Entities/SimpleEntity/Components" index="2"]
color = Color( 0.298039, 0.745098, 0.368627, 1 )
[node name="SimpleEntity2" parent="Entities" instance=ExtResource( 1 )]
position = Vector2( 157, 306 )
[node name="Color" parent="Entities/SimpleEntity2/Components" index="3"]
[node name="Color" parent="Entities/SimpleEntity2/Components" index="2"]
color = Color( 0, 0.0156863, 1, 1 )
[node name="PlayerEntity" parent="." instance=ExtResource( 2 )]
position = Vector2( 263, 225 )
[connection signal="pressed" from="Control/AddEntityButton" to="." method="_on_AddEntityButton_pressed"]
[connection signal="pressed" from="Control/AddWanderingEntity" to="." method="_on_AddWanderingEntity_pressed"]

28
Utils/SpringDamper.gd Normal file
View File

@ -0,0 +1,28 @@
# Based on: allenchou.net/2015/04/game-math-precise-control-over-numeric-springing/
extends Object
class_name SpringDamper
var omega
var zeta
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
func _init(osc_freq:float = 1.0, osc_red:float = 0.1, osc_red_h:float = 1.0):
assert (osc_red > 0.001 and osc_red < 0.999)
omega = osc_freq * 2 * PI
zeta = log(1.0 - osc_red) / (-omega * osc_red_h)
print ("omega: ", omega, " zeta: ", zeta)
func calc(x, v, xt, h:float):
var f = 1.0 + 2.0 * h * zeta * omega
var oo = omega * omega
var hoo = oo * h
var hhoo = hoo * h
var det_inv = 1.0 / (f + hhoo)
var det_x = f * x + h * v + hhoo * xt
var det_v = v + hoo * (xt - x)
return [det_x * det_inv, det_v * det_inv]

View File

@ -19,6 +19,11 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://Components/ColorComponent.gd"
}, {
"base": "Object",
"class": "SpringDamper",
"language": "GDScript",
"path": "res://Utils/SpringDamper.gd"
}, {
"base": "Sprite",
"class": "TintedSpriteComponent",
"language": "GDScript",
@ -27,6 +32,7 @@ _global_script_classes=[ {
_global_script_class_icons={
"ClickableComponent": "",
"ColorComponent": "",
"SpringDamper": "",
"TintedSpriteComponent": ""
}