Camera smoothing and boundaries
This commit is contained in:
parent
0bfe983c87
commit
29ca00a8a0
51
Main.tscn
51
Main.tscn
|
|
@ -1,40 +1,69 @@
|
||||||
[gd_scene load_steps=7 format=2]
|
[gd_scene load_steps=10 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://src/actors/players/playerE/PlayerE.tscn" type="PackedScene" id=1]
|
[ext_resource path="res://src/actors/players/playerE/PlayerE.tscn" type="PackedScene" id=1]
|
||||||
[ext_resource path="res://src/levels/TestBox.tscn" type="PackedScene" id=2]
|
[ext_resource path="res://src/levels/TestBox.tscn" type="PackedScene" id=2]
|
||||||
[ext_resource path="res://src/ui/HUD.tscn" type="PackedScene" id=3]
|
[ext_resource path="res://src/ui/HUD.tscn" type="PackedScene" id=3]
|
||||||
[ext_resource path="res://src/ui/scene_transition.tscn" type="PackedScene" id=4]
|
[ext_resource path="res://src/ui/scene_transition.tscn" type="PackedScene" id=4]
|
||||||
[ext_resource path="res://src/camera_control.gd" type="Script" id=5]
|
[ext_resource path="res://src/camera_control.gd" type="Script" id=5]
|
||||||
|
[ext_resource path="res://src/game_camera.gd" type="Script" id=6]
|
||||||
|
|
||||||
|
[sub_resource type="Shader" id=2]
|
||||||
|
code = "shader_type canvas_item;
|
||||||
|
|
||||||
|
uniform vec2 cam_offset = vec2(0.0,0.0);
|
||||||
|
|
||||||
|
void vertex() {
|
||||||
|
VERTEX += cam_offset;
|
||||||
|
}"
|
||||||
|
|
||||||
|
[sub_resource type="ShaderMaterial" id=3]
|
||||||
|
shader = SubResource( 2 )
|
||||||
|
shader_param/cam_offset = Vector2( 0, 0 )
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
extents = Vector2( 160, 90 )
|
extents = Vector2( 160, 90 )
|
||||||
|
|
||||||
[node name="Main" type="Node2D"]
|
[node name="Main" type="Node2D"]
|
||||||
|
|
||||||
[node name="SceneTransition" parent="." instance=ExtResource( 4 )]
|
[node name="MusicPlayer" type="AudioStreamPlayer" parent="."]
|
||||||
|
|
||||||
[node name="TestBox" parent="." instance=ExtResource( 2 )]
|
[node name="ViewportContainer" type="ViewportContainer" parent="."]
|
||||||
|
material = SubResource( 3 )
|
||||||
|
margin_left = -2.0
|
||||||
|
margin_top = -2.0
|
||||||
|
margin_right = 320.0
|
||||||
|
margin_bottom = 180.0
|
||||||
|
rect_scale = Vector2( 2, 2 )
|
||||||
|
|
||||||
|
[node name="Viewport" type="Viewport" parent="ViewportContainer"]
|
||||||
|
size = Vector2( 322, 182 )
|
||||||
|
handle_input_locally = false
|
||||||
|
render_target_update_mode = 3
|
||||||
|
|
||||||
|
[node name="SceneTransition" parent="ViewportContainer/Viewport" instance=ExtResource( 4 )]
|
||||||
|
|
||||||
|
[node name="TestBox" parent="ViewportContainer/Viewport" instance=ExtResource( 2 )]
|
||||||
__meta__ = {
|
__meta__ = {
|
||||||
"_edit_lock_": true
|
"_edit_lock_": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[node name="PlayerE" parent="." instance=ExtResource( 1 )]
|
[node name="PlayerE" parent="ViewportContainer/Viewport" instance=ExtResource( 1 )]
|
||||||
position = Vector2( 112, 56 )
|
position = Vector2( 112, 56 )
|
||||||
|
|
||||||
[node name="UI_Layer" parent="." instance=ExtResource( 3 )]
|
[node name="UI_Layer" parent="ViewportContainer/Viewport" instance=ExtResource( 3 )]
|
||||||
|
|
||||||
[node name="MusicPlayer" type="AudioStreamPlayer" parent="."]
|
[node name="KinematicBody2D" type="KinematicBody2D" parent="ViewportContainer/Viewport"]
|
||||||
|
|
||||||
[node name="KinematicBody2D" type="KinematicBody2D" parent="."]
|
|
||||||
position = Vector2( 160, 90 )
|
position = Vector2( 160, 90 )
|
||||||
collision_layer = 0
|
collision_layer = 0
|
||||||
collision_mask = 256
|
collision_mask = 256
|
||||||
script = ExtResource( 5 )
|
script = ExtResource( 5 )
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="KinematicBody2D"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/KinematicBody2D"]
|
||||||
visible = false
|
visible = false
|
||||||
shape = SubResource( 1 )
|
shape = SubResource( 1 )
|
||||||
|
|
||||||
[node name="Camera2D" type="Camera2D" parent="KinematicBody2D"]
|
[node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"]
|
||||||
|
position = Vector2( 160, 90 )
|
||||||
current = true
|
current = true
|
||||||
process_mode = 0
|
script = ExtResource( 6 )
|
||||||
|
tracking_node_path = NodePath("../KinematicBody2D")
|
||||||
|
|
|
||||||
BIN
assets/UI/no_cam_tile.png
Normal file
BIN
assets/UI/no_cam_tile.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 237 B |
35
assets/UI/no_cam_tile.png.import
Normal file
35
assets/UI/no_cam_tile.png.import
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="StreamTexture"
|
||||||
|
path="res://.import/no_cam_tile.png-aa593baf34cdb8ad03f64fc21f010c45.stex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://assets/UI/no_cam_tile.png"
|
||||||
|
dest_files=[ "res://.import/no_cam_tile.png-aa593baf34cdb8ad03f64fc21f010c45.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=false
|
||||||
|
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
|
||||||
|
|
@ -9,6 +9,9 @@ onready var player_start_position := Vector2(50,50)
|
||||||
|
|
||||||
onready var current_music_track :AudioStream
|
onready var current_music_track :AudioStream
|
||||||
|
|
||||||
|
onready var viewport_container = get_node("/root/Main/ViewportContainer") #$ViewportContainer
|
||||||
|
onready var viewport = get_node("/root/Main/ViewportContainer/Viewport") # $ViewportContainer/Viewport
|
||||||
|
|
||||||
func change_music_track(_music_track :AudioStream ):
|
func change_music_track(_music_track :AudioStream ):
|
||||||
if current_music_track != _music_track:
|
if current_music_track != _music_track:
|
||||||
current_music_track = _music_track
|
current_music_track = _music_track
|
||||||
|
|
@ -29,23 +32,23 @@ func stop_music():
|
||||||
|
|
||||||
func change_level(_level_name :String, _position_name :String):
|
func change_level(_level_name :String, _position_name :String):
|
||||||
print("res://src/levels/" + _level_name + ".tscn" )
|
print("res://src/levels/" + _level_name + ".tscn" )
|
||||||
var SceneTransition = get_node("/root/Main/SceneTransition")
|
var SceneTransition = get_node("/root/Main/ViewportContainer/Viewport/SceneTransition")
|
||||||
#var simultaneous_scene = preload("res://levels/level2.tscn").instance()
|
#var simultaneous_scene = preload("res://levels/level2.tscn").instance()
|
||||||
var new_level = load("res://src/levels/" + _level_name + ".tscn" ).instance()
|
var new_level = load("res://src/levels/" + _level_name + ".tscn" ).instance()
|
||||||
#print (get_tree().get_root().get_children())
|
#print (get_tree().get_root().get_children())
|
||||||
for l in get_node("/root/Main").get_children():
|
for l in get_node("/root/Main/ViewportContainer/Viewport").get_children():
|
||||||
#print (get_node("/root/Main").get_children())
|
#print (get_node("/root/Main").get_children())
|
||||||
if l is Level:
|
if l is Level:
|
||||||
SceneTransition.transition_dissolve("foo")
|
SceneTransition.transition_dissolve("foo")
|
||||||
yield(SceneTransition,"done")
|
yield(SceneTransition,"done")
|
||||||
print(l)
|
print(l)
|
||||||
get_node("/root/Main").remove_child(l)
|
get_node("/root/Main/ViewportContainer/Viewport").remove_child(l)
|
||||||
get_node("/root/Main").add_child(new_level)
|
get_node("/root/Main/ViewportContainer/Viewport").add_child(new_level)
|
||||||
get_node("/root/Main").move_child(new_level,1)
|
get_node("/root/Main/ViewportContainer/Viewport").move_child(new_level,1)
|
||||||
##TODO: Probably set start position
|
##TODO: Probably set start position
|
||||||
if new_level.entrances.has(_position_name):
|
if new_level.entrances.has(_position_name):
|
||||||
player_start_position = new_level.entrances[_position_name].transform.origin
|
player_start_position = new_level.entrances[_position_name].transform.origin
|
||||||
print (get_node("/root/Main").get_children())
|
print (get_node("/root/Main/ViewportContainer/Viewport").get_children())
|
||||||
SceneTransition.reset()
|
SceneTransition.reset()
|
||||||
#get_node("/root/Main").add_child_below_node(SceneTransition,new_level)
|
#get_node("/root/Main").add_child_below_node(SceneTransition,new_level)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -164,12 +164,10 @@ shapes/collision/shape_color=Color( 1, 1, 1, 0.419608 )
|
||||||
|
|
||||||
[display]
|
[display]
|
||||||
|
|
||||||
window/size/width=320
|
window/size/width=640
|
||||||
window/size/height=180
|
window/size/height=360
|
||||||
window/size/resizable=false
|
window/size/resizable=false
|
||||||
window/size/test_width=960
|
window/stretch/mode="2d"
|
||||||
window/size/test_height=540
|
|
||||||
window/stretch/mode="viewport"
|
|
||||||
window/stretch/aspect="keep"
|
window/stretch/aspect="keep"
|
||||||
|
|
||||||
[editor_plugins]
|
[editor_plugins]
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,11 @@ func _ready():
|
||||||
global_position = LevelInfo.player_start_position
|
global_position = LevelInfo.player_start_position
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
#func _process(delta):
|
func _process(delta):
|
||||||
# pass
|
PlayerInfo.player_position = global_position.round()
|
||||||
|
|
||||||
func hit_Receiver(damage):
|
func hit_Receiver(damage):
|
||||||
$Hurtbox_Component.set_hurtbox(false)
|
$Hurtbox_Component.set_hurtbox(false)
|
||||||
$Health_Component.take_damage(damage)
|
$Health_Component.take_damage(damage)
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,32 @@ extends KinematicBody2D
|
||||||
# Declare member variables here. Examples:
|
# Declare member variables here. Examples:
|
||||||
# var a = 2
|
# var a = 2
|
||||||
# var b = "text"
|
# var b = "text"
|
||||||
|
var game_size := Vector2(320,180)
|
||||||
|
onready var window_scale :float = (OS.window_size / game_size).x
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready():
|
func _ready():
|
||||||
pass # Replace with function body.
|
pass # Replace with function body.
|
||||||
|
|
||||||
|
var flip_tracker = 0.0
|
||||||
|
func _physics_process(delta):
|
||||||
|
var pos = global_position
|
||||||
|
#pos = pos.move_toward(PlayerInfo.player_position, delta)
|
||||||
|
pos = lerp(pos, PlayerInfo.player_position, delta )
|
||||||
|
var dir_to = pos.direction_to(PlayerInfo.player_position)
|
||||||
|
|
||||||
func _process(delta):
|
# UiManager.debug_text = ("PP: " + str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) +
|
||||||
move_and_slide(Vector2(10,0))
|
# "\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) +
|
||||||
|
# "\nCP: " + str (dir_to)
|
||||||
|
# )
|
||||||
|
|
||||||
|
move_and_slide(dir_to * 90.0 )
|
||||||
|
|
||||||
|
# flip_tracker += delta
|
||||||
|
# if flip_tracker < 10:
|
||||||
|
# move_and_slide(Vector2(60.2,0))
|
||||||
|
# elif flip_tracker < 20:
|
||||||
|
# move_and_slide(Vector2(-60.2,0))
|
||||||
|
# else:
|
||||||
|
# flip_tracker = 0.0
|
||||||
|
|
|
||||||
53
src/game_camera.gd
Normal file
53
src/game_camera.gd
Normal file
|
|
@ -0,0 +1,53 @@
|
||||||
|
extends Camera2D
|
||||||
|
|
||||||
|
|
||||||
|
# Declare member variables here. Examples:
|
||||||
|
# var a = 2
|
||||||
|
# var b = "text"
|
||||||
|
|
||||||
|
var game_size := Vector2(320,180)
|
||||||
|
onready var window_scale :float = (OS.window_size / game_size).x
|
||||||
|
|
||||||
|
onready var actual_cam_pos := global_position
|
||||||
|
|
||||||
|
export var tracking_node_path :NodePath
|
||||||
|
var _tracking_node :KinematicBody2D
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
_tracking_node = get_node(tracking_node_path)
|
||||||
|
|
||||||
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
|
func _process(delta):
|
||||||
|
#var tracking_pos = PlayerInfo.player_position
|
||||||
|
var tracking_pos = _tracking_node.global_position
|
||||||
|
|
||||||
|
actual_cam_pos = lerp(position, tracking_pos, delta * 3)
|
||||||
|
#position = actual_cam_pos.round()
|
||||||
|
position = actual_cam_pos
|
||||||
|
var cam_subpixel_pos = actual_cam_pos.round() - position
|
||||||
|
|
||||||
|
LevelInfo.viewport_container.material.set_shader_param("cam_offset", cam_subpixel_pos )
|
||||||
|
|
||||||
|
UiManager.debug_text = ("SP: " + str(cam_subpixel_pos.snapped(Vector2(0.01,0.01))) +
|
||||||
|
"\nCP: " + str (position.snapped(Vector2(0.01,0.01))) +
|
||||||
|
"\nTP: " + str(tracking_pos.snapped(Vector2(0.01,0.01)))
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
## The original Algo
|
||||||
|
# # First we get the "real" position of the mouse cursor and then the offset to the player
|
||||||
|
# # To do that, we need to divide the mouse position inside the local viewport by the game window scale
|
||||||
|
# # Then substract half of the game size and add the player position
|
||||||
|
#
|
||||||
|
# var mouse_pos = _global.viewport.get_mouse_position() / window_scale - (game_size/2) + player.global_position
|
||||||
|
# # Use another lerp to make the movement smooth
|
||||||
|
# actual_cam_pos = lerp(actual_cam_pos, cam_pos, 5*delta)
|
||||||
|
#
|
||||||
|
# # Calculate the "subpixel" position of the new camera position
|
||||||
|
# var cam_subpixel_pos = actual_cam_pos.round() - actual_cam_pos
|
||||||
|
#
|
||||||
|
# # Update the Main ViewportContainer's shader uniform
|
||||||
|
# _global.viewport_container.material.set_shader_param("cam_offset", cam_subpixel_pos )
|
||||||
|
#
|
||||||
|
# # Set the camera's position to the new position and round it.
|
||||||
|
# global_position = actual_cam_pos.round()
|
||||||
|
|
@ -1,10 +1,11 @@
|
||||||
[gd_scene load_steps=9 format=2]
|
[gd_scene load_steps=12 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://src/templates/level_templates/LevelTemplate.tscn" type="PackedScene" id=1]
|
[ext_resource path="res://src/templates/level_templates/LevelTemplate.tscn" type="PackedScene" id=1]
|
||||||
[ext_resource path="res://assets/levels/LegacyFantasy-High_Forest/tileset.tres" type="TileSet" id=2]
|
[ext_resource path="res://assets/levels/LegacyFantasy-High_Forest/tileset.tres" type="TileSet" id=2]
|
||||||
[ext_resource path="res://lib/components/Hitbox_Component.tscn" type="PackedScene" id=3]
|
[ext_resource path="res://lib/components/Hitbox_Component.tscn" type="PackedScene" id=3]
|
||||||
[ext_resource path="res://src/Interactables/LevelTransition.tscn" type="PackedScene" id=4]
|
[ext_resource path="res://src/Interactables/LevelTransition.tscn" type="PackedScene" id=4]
|
||||||
[ext_resource path="res://assets_tmp/Music/summer nights.ogg" type="AudioStream" id=5]
|
[ext_resource path="res://assets_tmp/Music/summer nights.ogg" type="AudioStream" id=5]
|
||||||
|
[ext_resource path="res://assets/UI/no_cam_tile.png" type="Texture" id=6]
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=1]
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
radius = 5.09902
|
radius = 5.09902
|
||||||
|
|
@ -15,6 +16,33 @@ extents = Vector2( 4.5, 10 )
|
||||||
[sub_resource type="RectangleShape2D" id=3]
|
[sub_resource type="RectangleShape2D" id=3]
|
||||||
extents = Vector2( 8, 40 )
|
extents = Vector2( 8, 40 )
|
||||||
|
|
||||||
|
[sub_resource type="ConvexPolygonShape2D" id=5]
|
||||||
|
points = PoolVector2Array( 20, 20, 0.326027, 20, 0.326027, 0.605103, 20, 0.605103 )
|
||||||
|
|
||||||
|
[sub_resource type="TileSet" id=4]
|
||||||
|
resource_name = "NoCam"
|
||||||
|
0/name = "no_cam_tile.png 0"
|
||||||
|
0/texture = ExtResource( 6 )
|
||||||
|
0/tex_offset = Vector2( 0, 0 )
|
||||||
|
0/modulate = Color( 1, 1, 1, 1 )
|
||||||
|
0/region = Rect2( 0, 0, 20, 20 )
|
||||||
|
0/tile_mode = 0
|
||||||
|
0/occluder_offset = Vector2( 0, 0 )
|
||||||
|
0/navigation_offset = Vector2( 0, 0 )
|
||||||
|
0/shape_offset = Vector2( 0, 0 )
|
||||||
|
0/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 )
|
||||||
|
0/shape = SubResource( 5 )
|
||||||
|
0/shape_one_way = false
|
||||||
|
0/shape_one_way_margin = 1.0
|
||||||
|
0/shapes = [ {
|
||||||
|
"autotile_coord": Vector2( 0, 0 ),
|
||||||
|
"one_way": false,
|
||||||
|
"one_way_margin": 1.0,
|
||||||
|
"shape": SubResource( 5 ),
|
||||||
|
"shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 )
|
||||||
|
} ]
|
||||||
|
0/z_index = 0
|
||||||
|
|
||||||
[node name="TestBox" instance=ExtResource( 1 )]
|
[node name="TestBox" instance=ExtResource( 1 )]
|
||||||
music_track = ExtResource( 5 )
|
music_track = ExtResource( 5 )
|
||||||
|
|
||||||
|
|
@ -79,10 +107,10 @@ __meta__ = {
|
||||||
position = Vector2( 325, 127 )
|
position = Vector2( 325, 127 )
|
||||||
|
|
||||||
[node name="CameraBounds" type="TileMap" parent="." index="8"]
|
[node name="CameraBounds" type="TileMap" parent="." index="8"]
|
||||||
tile_set = ExtResource( 2 )
|
tile_set = SubResource( 4 )
|
||||||
cell_size = Vector2( 16, 16 )
|
cell_size = Vector2( 20, 20 )
|
||||||
show_collision = true
|
show_collision = true
|
||||||
collision_layer = 256
|
collision_layer = 256
|
||||||
collision_mask = 0
|
collision_mask = 0
|
||||||
format = 1
|
format = 1
|
||||||
tile_data = PoolIntArray( -65526, 4, 0, 327679, 4, 0, 262164, 4, 0, 262170, 4, 0, 786444, 4, 0 )
|
tile_data = PoolIntArray( -65536, 0, 0, -65521, 0, 0, 65535, 0, 0, 524287, 0, 0, 589824, 0, 0, 589838, 0, 0 )
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user