Fixed spring impact registration, camera tilemap limit

The incoming velocity of bodies going onto the spring is,
now saved in a signal connection.

The players camera is now limited to the extends of the tilemap.

I also experimented on the viewport a bit.
It seems like I can't simply swap out the default viewport
with my own configured viewport and use it in the editor normally.
This commit is contained in:
Jakob Feldmann 2022-06-19 18:12:29 +02:00
parent 40ac349bf1
commit 9cef352fe2
14 changed files with 98 additions and 52 deletions

3
.gitignore vendored
View File

@ -24,4 +24,7 @@ export_presets.cfg
# Mono-specific ignores
.mono/
data_*/
# VSCode specific ignores
/.vscode
.vscode/launch.json

2
.vscode/launch.json vendored
View File

@ -8,7 +8,7 @@
"name": "GDScript Godot",
"type": "godot",
"request": "launch",
"project": "C:\\Users\\Jakob F\\Documents\\Godot\\Wumper",
"project": "C:\\Users\\Jakob\\Documents\\Godot\\Wumper",
"port": 6007,
"address": "127.0.0.1",
"launch_game_instance": true,

View File

@ -56,7 +56,7 @@ window/size/width=1920
window/size/height=1080
window/stretch/mode="2d"
window/stretch/aspect="keep"
window/stretch/shrink=8.0
window/stretch/shrink=3.59
[editor_plugins]
@ -141,10 +141,12 @@ boost_move={
quality/intended_usage/framebuffer_allocation=0
quality/intended_usage/framebuffer_allocation.mobile=0
2d/snapping/use_gpu_pixel_snap=true
quality/filters/use_nearest_mipmap_filter=true
quality/filters/msaa=1
environment/default_environment="res://default_env.tres"
quality/2d/use_pixel_snap=false
quality/2d/use_pixel_snap=true
environment/2d/use_nvidia_rect_flicker_workaround=true
environment/stretch/aspect="ignore"
environment/intended_usage/framebuffer_allocation.mobile=0
[world]
2d/cell_size=16

View File

@ -248,6 +248,8 @@ func calculate_wallslide_velocity(
linear_velocity.y = PhysicsFunc.two_step_euler(
0, acceleration_force["walljump"].y * -1, mass, delta
)
# TODO this is done 3 times for different states
# TODO make air strafe a portionable boost instead of a one time acceleration
elif is_correct_airstrafe_input():
linear_velocity.x = PhysicsFunc.two_step_euler(
linear_velocity.x,

View File

@ -23,18 +23,18 @@ polygon = PoolVector2Array( -6.7, -3.273, -2.676, -7.3, 3.939, -7.3, 8, -1.768,
[node name="Camera2D" type="Camera2D" parent="."]
position = Vector2( 80, 0 )
current = true
zoom = Vector2( 2, 2 )
limit_left = 0
limit_top = 0
limit_right = 0
limit_bottom = 0
limit_smoothed = true
drag_margin_h_enabled = true
drag_margin_v_enabled = true
drag_margin_left = 0.08
drag_margin_top = 0.08
drag_margin_right = 0.08
drag_margin_bottom = 0.07
editor_draw_limits = true
editor_draw_drag_margin = true
drag_margin_bottom = 0.08
editor_draw_screen = false
script = ExtResource( 2 )
[node name="ShiftTween" type="Tween" parent="Camera2D"]

View File

@ -158,11 +158,6 @@ func _enter_state(new_state, old_state):
# TODO This may be hard to keep track of if many states are added
if !["run", "walk", "idle"].has(old_state) && parent.is_on_floor():
emit_signal("got_grounded")
# if (
# (old_state == "run" || "walk" || "idle" || "wallslide")
# && ! parent.is_on_floor()
# ):
# emit_signal("got_ungrounded")
func _exit_state(old_state, new_state):

View File

@ -6,8 +6,22 @@ var camera_x_shift = 80
onready var prev_camera_pos = get_camera_position()
onready var tween = $ShiftTween
# Gets the camera limits from the tilemap of the level
# Requires "TileMap" to be a sibling of blobby
func _ready():
# TODO Pass Reference to child and do not traverse the tree upwards
# This is ok, because it only happens on initialization
# But it is also quite fickle
var tilemap = get_node("../../TileMap")
var rect = tilemap.get_used_rect()
var cell_size = tilemap.cell_size
# TODO Change camera zoom when level is smaller than camera
limit_right = rect.end.x * cell_size.x
limit_left = rect.position.x * cell_size.x
limit_top = rect.position.y * cell_size.y
limit_bottom = rect.end.y * cell_size.y
func _process(delta: float) -> void:
func _process(_delta: float) -> void:
_check_facing()
prev_camera_pos = get_camera_position()

View File

@ -20,7 +20,6 @@ onready var original_rotation = rotation
onready var rotation_speed_divider = 80
# TODO causes oscilation
onready var min_rotation_speed = deg2rad(0.3)
# TODO Bug when dying in the wrong state, missing prey instance
var prey_ref = weakref(null)
# Ray that goes from the turret to the target
var target_ray
@ -33,12 +32,11 @@ func searching():
# The collider returns not the area or body it hit, but the parent of them
var collider = sightline.get_collider()
if collider.is_in_group("player"):
print_debug(is_tracking_prey())
prey_ref = weakref(collider)
print_debug(is_tracking_prey())
# TODO should this stand still?
# TODO Use yield and coroutine instead
func start_locking():
target_ray = RayCast2D.new()
add_child(target_ray)
@ -68,12 +66,12 @@ func aiming():
rotation, original_rotation, original_rotation + angle_of_freedom
)
# TODO simplify/split this method
func shooting():
aiming()
if sightline.is_colliding():
# The collider returns not the area or body it hit, but the parent of them
# TODO Sight could be a cone instead of a ray
# TODO Sight should be a cone instead of a ray
# This could be done with a permanent target ray and the angle between it and the sightline
var collider = sightline.get_collider()
if collider.is_in_group("player"):
sight_lost_timer.stop()
@ -93,7 +91,7 @@ func shooting():
func spawn_projectile():
var b = Bullet.instance()
owner.add_child(b)
get_parent().add_child(b)
b.set_collision_mask_bit(1, false)
b.transform = $Muzzle.global_transform

View File

@ -75,6 +75,7 @@ func _enter_state(new_state, old_state):
# TODO Time for returning to 0 degrees is always the same
# Implement this using a tween
parent.get_node("FiringRateTimer").stop()
# TODO Go back to the tutorials and look for where to implement the animation queues and triggers
anim_player.play("Turret Returning")
anim_player.queue("Turret Rotation")
pass

View File

@ -4,10 +4,11 @@ const PhysicsConst = preload("res://src/Utilities/Physic/PhysicsConst.gd")
var mass = 1
var coupled_mass = mass
var spring_k = -660
var spring_k = -600
var start_y = 0
var y_velocity = 0
var friction = 0.91
# TODO Only store velocity coming to the springs orientation
var stored_incoming_velocity = 0
var coupled_body = null
var shock_ready = true
@ -17,19 +18,16 @@ func _ready() -> void:
start_y = self.position.y
# TODO extensively playtest to find problems
# TODO Shock doesn't get triggered when doing some smaller jumps
# TODO There is a limit to how high you can go(can't repeatedly increase hight)
# TODO Limit spring deformation
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta: float) -> void:
if !_body_contact():
_store_incoming_velocity()
var bc = _body_contact()
if !bc:
shock_ready = true
if _body_contact() && shock_ready:
if bc && shock_ready:
_Kinematic_Body_on_Spring()
shock_ready = false
var spring_force = spring_k * (self.position.y - self.start_y)
if coupled_body != null:
@ -48,14 +46,6 @@ func _physics_process(delta: float) -> void:
self.position.y += y_velocity * delta
func _store_incoming_velocity():
var areas: Array = $EnteringVelocityDetector.get_overlapping_areas()
for i in range(0, areas.size()):
if areas[i].name == "BlobbySkin":
if areas[i].get_parent().velocity.y > 0:
stored_incoming_velocity = areas[i].get_parent().velocity.y
func _body_contact() -> bool:
var areas: Array = $SpringSkin.get_overlapping_areas()
for i in range(0, areas.size()):
@ -74,9 +64,9 @@ func _Kinematic_Body_on_Spring() -> void:
y_velocity += PhysicsFunc.complete_unelastic_shock(
a_velocity, b_velocity, a_mass, b_mass
)
if sign(coupled_body.velocity.y) > 0:
coupled_body.velocity.y = y_velocity
print(y_velocity)
stored_incoming_velocity = 0
shock_ready = false
func _on_SpringSkin_area_exited(_area: Area2D) -> void:
@ -94,3 +84,9 @@ func _on_SpringSkin_area_exited(_area: Area2D) -> void:
)
if coupled_body != null:
coupled_body.velocity.y += kinetic_energy_in_velocity
func _on_EnteringVelocityDetector_area_entered(area: Area2D) -> void:
if area.name == "BlobbySkin":
if area.get_parent().velocity.y > 0:
stored_incoming_velocity = area.get_parent().velocity.y

View File

@ -4,13 +4,13 @@
[ext_resource path="res://assets/environment/blocks/Basic stone block.png" type="Texture" id=2]
[sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 11.6455, 1.51714 )
extents = Vector2( 11.6455, 2.10568 )
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 11.918, 1.57982 )
[sub_resource type="RectangleShape2D" id=3]
extents = Vector2( 11.7595, 0.755349 )
extents = Vector2( 11.7639, 2.06284 )
[node name="Spring" type="Node2D"]
script = ExtResource( 1 )
@ -24,7 +24,7 @@ collision_layer = 32
collision_mask = 3
[node name="CollisionShape2D" type="CollisionShape2D" parent="SpringSkin"]
position = Vector2( 0.0369902, -1.50376 )
position = Vector2( 0, -1.27843 )
shape = SubResource( 2 )
[node name="SpringBody" type="KinematicBody2D" parent="."]
@ -36,12 +36,13 @@ position = Vector2( 0.00390673, 0 )
shape = SubResource( 1 )
[node name="EnteringVelocityDetector" type="Area2D" parent="."]
position = Vector2( 0, -3.99571 )
position = Vector2( 0, -3.04889 )
collision_layer = 32
collision_mask = 41
[node name="CollisionShape2D" type="CollisionShape2D" parent="EnteringVelocityDetector"]
position = Vector2( 0.0106821, 0.748173 )
position = Vector2( 0.00390673, -1.07744 )
shape = SubResource( 3 )
[connection signal="area_exited" from="SpringSkin" to="." method="_on_SpringSkin_area_exited"]
[connection signal="area_entered" from="EnteringVelocityDetector" to="." method="_on_EnteringVelocityDetector_area_entered"]

View File

@ -1,11 +1,10 @@
[gd_scene load_steps=12 format=2]
[gd_scene load_steps=11 format=2]
[ext_resource path="res://src/Actors/Blobby/Blobby.tscn" type="PackedScene" id=1]
[ext_resource path="res://assets/environment/blocks/Basic stone block.png" type="Texture" id=2]
[ext_resource path="res://src/Contraptions/Platform/Spring.tscn" type="PackedScene" id=3]
[ext_resource path="res://src/Environment/Background.tscn" type="PackedScene" id=4]
[ext_resource path="res://src/Contraptions/Platform/Track.tscn" type="PackedScene" id=5]
[ext_resource path="res://src/Actors/Enemies/Machines/Turret.tscn" type="PackedScene" id=6]
[ext_resource path="res://src/UserInterface/Buttons/UI.tscn" type="PackedScene" id=7]
[sub_resource type="NavigationPolygon" id=1]
@ -43,7 +42,7 @@ points = PoolVector2Array( 16, 16, 0, 16, 0, 0, 16, 0 )
} ]
0/z_index = 0
[node name="LevelTemplate" type="Node2D"]
[node name="PlattformsLevel" type="Node2D"]
__meta__ = {
"_edit_horizontal_guides_": [ 464.0 ],
"_edit_vertical_guides_": [ 2880.0 ]
@ -71,6 +70,12 @@ position = Vector2( 50.7867, 604.063 )
position = Vector2( 170, 600.198 )
scale = Vector2( 1.88002, 1 )
[node name="CollisionShape2D" parent="Spring4/SpringSkin" index="0"]
position = Vector2( 0, -2.09229 )
[node name="CollisionShape2D" parent="Spring4/EnteringVelocityDetector" index="0"]
position = Vector2( 0, -6.14911 )
[node name="Track" parent="." instance=ExtResource( 5 )]
position = Vector2( 291.104, 535.161 )
scale = Vector2( 2.83999, 0.56 )
@ -78,10 +83,5 @@ scale = Vector2( 2.83999, 0.56 )
[node name="KinematicBody2D" parent="Track" index="0"]
position = Vector2( 25.0812, 0 )
[node name="Turret" parent="." instance=ExtResource( 6 )]
position = Vector2( 479, 466 )
scale = Vector2( 0.4, 0.4 )
[editable path="Spring4"]
[editable path="Track"]
[editable path="Turret"]

View File

@ -0,0 +1,15 @@
extends Node2D
onready var level_viewport_container = $ViewportContainer
onready var level_viewport = $ViewportContainer/Viewport
onready var screen_res = get_viewport().size
var scaling = Vector2()
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
scaling = screen_res / level_viewport.size
print(screen_res)
print(level_viewport.size)
print(scaling)
level_viewport_container.rect_scale *= scaling

View File

@ -0,0 +1,19 @@
[gd_scene load_steps=2 format=2]
[ext_resource path="res://src/Levels/Viewport Test Level.gd" type="Script" id=1]
[node name="ViewportTestLevel" type="Node2D"]
script = ExtResource( 1 )
[node name="ViewportContainer" type="ViewportContainer" parent="."]
margin_right = 1920.0
margin_bottom = 1080.0
rect_scale = Vector2( 1.0037, 0.999187 )
[node name="Viewport" type="Viewport" parent="ViewportContainer"]
size = Vector2( 1920, 1080 )
handle_input_locally = false
disable_3d = true
usage = 0
render_direct_to_screen = true
render_target_update_mode = 3