diff --git a/Main.tscn b/Main.tscn index 4c8f06a..7cad3a7 100644 --- a/Main.tscn +++ b/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/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/scene_transition.tscn" type="PackedScene" id=4] [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] extents = Vector2( 160, 90 ) [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__ = { "_edit_lock_": true } -[node name="PlayerE" parent="." instance=ExtResource( 1 )] +[node name="PlayerE" parent="ViewportContainer/Viewport" instance=ExtResource( 1 )] 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="."] +[node name="KinematicBody2D" type="KinematicBody2D" parent="ViewportContainer/Viewport"] position = Vector2( 160, 90 ) collision_layer = 0 collision_mask = 256 script = ExtResource( 5 ) -[node name="CollisionShape2D" type="CollisionShape2D" parent="KinematicBody2D"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="ViewportContainer/Viewport/KinematicBody2D"] visible = false shape = SubResource( 1 ) -[node name="Camera2D" type="Camera2D" parent="KinematicBody2D"] +[node name="Camera2D" type="Camera2D" parent="ViewportContainer/Viewport"] +position = Vector2( 160, 90 ) current = true -process_mode = 0 +script = ExtResource( 6 ) +tracking_node_path = NodePath("../KinematicBody2D") diff --git a/assets/UI/no_cam_tile.png b/assets/UI/no_cam_tile.png new file mode 100644 index 0000000..65efa00 Binary files /dev/null and b/assets/UI/no_cam_tile.png differ diff --git a/assets/UI/no_cam_tile.png.import b/assets/UI/no_cam_tile.png.import new file mode 100644 index 0000000..75dc3e5 --- /dev/null +++ b/assets/UI/no_cam_tile.png.import @@ -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 diff --git a/lib/singleton_autoloads/LevelInfo.gd b/lib/singleton_autoloads/LevelInfo.gd index 7944865..c38d562 100644 --- a/lib/singleton_autoloads/LevelInfo.gd +++ b/lib/singleton_autoloads/LevelInfo.gd @@ -9,6 +9,9 @@ onready var player_start_position := Vector2(50,50) 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 ): if 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): 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 new_level = load("res://src/levels/" + _level_name + ".tscn" ).instance() #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()) if l is Level: SceneTransition.transition_dissolve("foo") yield(SceneTransition,"done") print(l) - get_node("/root/Main").remove_child(l) - get_node("/root/Main").add_child(new_level) - get_node("/root/Main").move_child(new_level,1) + get_node("/root/Main/ViewportContainer/Viewport").remove_child(l) + get_node("/root/Main/ViewportContainer/Viewport").add_child(new_level) + get_node("/root/Main/ViewportContainer/Viewport").move_child(new_level,1) ##TODO: Probably set start position if new_level.entrances.has(_position_name): 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() #get_node("/root/Main").add_child_below_node(SceneTransition,new_level) diff --git a/project.godot b/project.godot index af138d7..ff4120c 100644 --- a/project.godot +++ b/project.godot @@ -164,12 +164,10 @@ shapes/collision/shape_color=Color( 1, 1, 1, 0.419608 ) [display] -window/size/width=320 -window/size/height=180 +window/size/width=640 +window/size/height=360 window/size/resizable=false -window/size/test_width=960 -window/size/test_height=540 -window/stretch/mode="viewport" +window/stretch/mode="2d" window/stretch/aspect="keep" [editor_plugins] diff --git a/src/actors/players/playerE/PlayerE.gd b/src/actors/players/playerE/PlayerE.gd index 159a1e4..370a277 100644 --- a/src/actors/players/playerE/PlayerE.gd +++ b/src/actors/players/playerE/PlayerE.gd @@ -14,9 +14,11 @@ func _ready(): global_position = LevelInfo.player_start_position + # Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass +func _process(delta): + PlayerInfo.player_position = global_position.round() + func hit_Receiver(damage): $Hurtbox_Component.set_hurtbox(false) $Health_Component.take_damage(damage) diff --git a/src/camera_control.gd b/src/camera_control.gd index 3dad6f1..e8251e6 100644 --- a/src/camera_control.gd +++ b/src/camera_control.gd @@ -4,12 +4,32 @@ extends KinematicBody2D # 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 # Called when the node enters the scene tree for the first time. func _ready(): 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) + +# UiManager.debug_text = ("PP: " + str(PlayerInfo.player_position.snapped(Vector2(0.01,0.01))) + +# "\nKB: " + str(global_position.snapped(Vector2(0.01,0.01))) + +# "\nCP: " + str (dir_to) +# ) -func _process(delta): - move_and_slide(Vector2(10,0)) + 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 diff --git a/src/game_camera.gd b/src/game_camera.gd new file mode 100644 index 0000000..6ec0d30 --- /dev/null +++ b/src/game_camera.gd @@ -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() diff --git a/src/levels/TestBox.tscn b/src/levels/TestBox.tscn index 3fed7fa..02a79a0 100644 --- a/src/levels/TestBox.tscn +++ b/src/levels/TestBox.tscn @@ -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://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://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/UI/no_cam_tile.png" type="Texture" id=6] [sub_resource type="CircleShape2D" id=1] radius = 5.09902 @@ -15,6 +16,33 @@ extents = Vector2( 4.5, 10 ) [sub_resource type="RectangleShape2D" id=3] 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 )] music_track = ExtResource( 5 ) @@ -79,10 +107,10 @@ __meta__ = { position = Vector2( 325, 127 ) [node name="CameraBounds" type="TileMap" parent="." index="8"] -tile_set = ExtResource( 2 ) -cell_size = Vector2( 16, 16 ) +tile_set = SubResource( 4 ) +cell_size = Vector2( 20, 20 ) show_collision = true collision_layer = 256 collision_mask = 0 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 )