diff --git a/Material_001.material b/Material_001.material new file mode 100644 index 0000000..8447d7e Binary files /dev/null and b/Material_001.material differ diff --git a/Material_003.material b/Material_003.material new file mode 100644 index 0000000..70a1f57 Binary files /dev/null and b/Material_003.material differ diff --git a/Material_004.material b/Material_004.material new file mode 100644 index 0000000..7a94dd4 Binary files /dev/null and b/Material_004.material differ diff --git a/Material_005.material b/Material_005.material new file mode 100644 index 0000000..7075257 Binary files /dev/null and b/Material_005.material differ diff --git a/character.gd b/character.gd new file mode 100644 index 0000000..f5a746e --- /dev/null +++ b/character.gd @@ -0,0 +1,21 @@ +extends KinematicBody + +onready var anim = $testman/AnimationPlayer +var cur_anim = "" + +func animation(a): + if a != cur_anim: + if a == "stand": + anim.play(a) + if a == "climb": + anim.play(a) + anim.get_animation(a).loop = true + elif a == "walk": + anim.play(a,0.1) + anim.get_animation(a).loop = true + elif a == "run": + anim.play("walk",0.1,2) + anim.get_animation("walk").loop = true + elif a == "jump": + anim.play(a,0.2,1.5) + cur_anim = a diff --git a/character.tscn b/character.tscn new file mode 100644 index 0000000..df343c6 --- /dev/null +++ b/character.tscn @@ -0,0 +1,18 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://character.gd" type="Script" id=1] +[ext_resource path="res://testman.tscn" type="PackedScene" id=2] + +[sub_resource type="BoxShape" id=1] + +[node name="character" type="KinematicBody"] +script = ExtResource( 1 ) + +[node name="camera" type="Position3D" parent="."] +transform = Transform( 1, 0, 0, 0, 0.958606, 0.284735, 0, -0.284735, 0.958606, 0, 1.381, 3.22 ) + +[node name="CollisionShape" type="CollisionShape" parent="."] +transform = Transform( 0.4, 0, 0, 0, 1, 0, 0, 0, 0.4, 0, -0.477703, 0 ) +shape = SubResource( 1 ) + +[node name="testman" parent="." instance=ExtResource( 2 )] diff --git a/default_env.tres b/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..4298523 --- /dev/null +++ b/project.godot @@ -0,0 +1,39 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +[application] + +config/name="Basic action tpv" +run/main_scene="res://scenes/main.tscn" + +[global] + +hide=false + +[input] + +ui_accept={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777221,"unicode":0,"echo":false,"script":null) + ] +} +jump={ +"deadzone": 0.5, +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) + ] +} + +[physics] + +common/enable_pause_aware_picking=true + +[rendering] + +environment/default_environment="res://default_env.tres" diff --git a/scenes/main.tscn b/scenes/main.tscn new file mode 100644 index 0000000..78c1f5f --- /dev/null +++ b/scenes/main.tscn @@ -0,0 +1,211 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://scenes/player.tscn" type="PackedScene" id=3] + +[sub_resource type="CubeMesh" id=1] + +[sub_resource type="SpatialMaterial" id=2] +albedo_color = Color( 0, 0.67451, 0.0705882, 1 ) +uv1_scale = Vector3( 30, 10, 10 ) + +[sub_resource type="BoxShape" id=3] + +[node name="main" type="Spatial"] + +[node name="player" parent="." instance=ExtResource( 3 )] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.1238, 0 ) + +[node name="MeshInstance" type="MeshInstance" parent="."] +transform = Transform( 10, 0, 0, 0, 1, 0, 0, 0, 10, -7.93551, 0, 0 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance2" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.713478, 2.05397, 0 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance2"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance2/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance8" type="MeshInstance" parent="."] +transform = Transform( 0.440349, 0, 0, 0, 2.2152, 0, 0, 0, 4.94169, -10.0459, 3.03512, -4.18925 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance8"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance8/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance3" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.713478, 3.96189, -2.21065 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance3"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance3/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance4" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.713478, 5.82525, -4.38806 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance4"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance4/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance10" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0.734278, 5.82525, -9.18736 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance10"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance10/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance11" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -1.73668, 1.81503, -7.97215 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance11"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance11/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance15" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 2.68466, 0, 0, 0, 1, -5.49597, 3.55687, 8.09793 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance15"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance15/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance12" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -7.54833, 7.58894, -8.48983 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance12"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance12/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance14" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -3.88969, 7.58894, -14.2398 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance14"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance14/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance17" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -12.2264, 7.58894, 8.05409 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance17"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance17/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance18" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -11.493, 14.414, 0.329737 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance18"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance18/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance19" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -6.35312, 18.8925, 0.329737 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance19"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance19/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance13" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 5.15891, 0, 0, 0, 7.9319, -16.7023, 5.80396, -2.09961 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance13"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance13/StaticBody"] +shape = SubResource( 3 ) + +[node name="MeshInstance16" type="MeshInstance" parent="."] +transform = Transform( 1, 0, 0, 0, 5.15891, 0, 0, 0, 3.24947, -11.4569, 6.11296, -6.769 ) +mesh = SubResource( 1 ) +material/0 = SubResource( 2 ) +__meta__ = { +"_edit_group_": true +} + +[node name="StaticBody" type="StaticBody" parent="MeshInstance16"] + +[node name="CollisionShape" type="CollisionShape" parent="MeshInstance16/StaticBody"] +shape = SubResource( 3 ) diff --git a/scenes/player.gd b/scenes/player.gd new file mode 100644 index 0000000..08528c2 --- /dev/null +++ b/scenes/player.gd @@ -0,0 +1,208 @@ +extends Spatial + +onready var character = $character +var cam = { + "speed":10, + "current_speed":20, + "mode":2, +} +var action = { + "air_speed":0, + "climb":false, +} + +var direction = Vector3() +var direction2 = Vector3() +var velocity = Vector3() +var gravity = -27 +var linear_speed = 6 +var jump_height = 12 +var walk_speed = 8 +var run_speed = 16 +var speed = 8 +var fpv_camera_angle = 0 +var fpv_mouse_sensitivity = 0.3 +var tpv_camera_speed = 0.001 + +func _ready(): + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + OS.set_window_position(Vector2(0,0)) + + +func rotating(dir): + var a = atan2(dir.x* -1, dir.z* -1) + var rot = character.get_rotation() + if abs(rot.y-a) > PI: + var m = PI * 2 + var d = fmod(a-rot.y,m) + a = rot.y + (fmod(2 * d,m)-d)*0.2 + else: + a = lerp(rot.y,a,0.1) + character.rotation.y = a + +func _input(event): + if Input.is_action_just_pressed("ui_cancel"): + get_tree().quit() + if event is InputEventMouseMotion: + if cam.mode == 1: +# == First player view + rotate_y(deg2rad(-event.relative.x * fpv_mouse_sensitivity)) + var change = -event.relative.y * fpv_mouse_sensitivity + if change + fpv_camera_angle < 90 and change + fpv_camera_angle > -90: + $head/Camera.rotate_x(deg2rad(change)) + fpv_camera_angle += change + elif cam.mode == 2: +# == Third player view + $head.rotate_y(-event.relative.x * tpv_camera_speed) + $head/tpv.rotate_x(-event.relative.y * tpv_camera_speed) + + +func _process(delta): + direction = Vector3() + var aim = $head/tpv.get_global_transform().basis + var walk = false + var run = false + if Input.is_key_pressed(KEY_ESCAPE): + get_tree().quit() + if Input.is_key_pressed(KEY_W): + direction -= aim.z + walk = true + if Input.is_key_pressed(KEY_S): + direction += aim.z + walk = true + if Input.is_key_pressed(KEY_A): + direction -= aim.x + walk = true + if Input.is_key_pressed(KEY_D): + direction += aim.x + walk = true + if Input.is_key_pressed(KEY_SHIFT): + run = true + direction = direction.normalized() + if walk and action.climb == false: + direction2 = direction + + +#===On ground + if character.is_on_floor(): + action.air_speed = 0 + action.walljump = Vector3() + +#Jump + if Input.is_key_pressed(KEY_SPACE) and character.cur_anim != "kong":#Input.is_action_just_pressed("jump"): + velocity.y = jump_height + character.animation("jump") +#Walk + elif walk: + rotating(direction) + if velocity.y < 0.1: + if run: + speed = run_speed + character.animation("run") + if Input.is_key_pressed(KEY_E): + character.cur_anim = "dive" + else: + speed = walk_speed + character.animation("walk") + if cam.current_speed > 2: + cam.current_speed -= delta*5 +#idle + else: + character.animation("stand") + if cam.current_speed < cam.speed: + cam.current_speed += delta*10 + else: +#camera + if cam.current_speed > 2: + cam.current_speed -= delta*10 + +#moves=========== + + +#climb + if run == false and action.climb == false and $character/climb1.is_colliding() and velocity.y <= 0 and $character/ground.is_colliding() == false: + var p = $character/climb1.get_collision_point() + $character/climb2.global_transform.origin.y=p.y + $character/climb2.force_update_transform() + $character/climb2.force_raycast_update() + if $character/climb2.is_colliding() and $character/climb1.get_collider() == $character/climb2.get_collider(): + character.animation("climb") + speed = walk_speed + action.climb = true + p = $character/climb2.get_collision_point() + var n = $character/climb2.get_collision_normal()*-1 + direction = n + direction2 = n + character.global_transform.origin = p + (character.global_transform.origin-$character/armhook.global_transform.origin) +#walljump + elif $character/climb2.is_colliding() and action.climb == false and direction2 != Vector3() and Input.is_key_pressed(KEY_SPACE) and velocity.y < 0 and $character/ground.is_colliding() == false: + var d = todir(direction) + if d != action.walljump: + speed = walk_speed + action.air_speed = 1 + direction = direction2 *-20 + velocity.y = jump_height + rotating(direction) + character.animation("jump") + action.walljump = d +#jump from climb + elif Input.is_action_just_pressed("jump"): + if action.climb: + speed = walk_speed + action.climb = false + velocity.y = jump_height + character.animation("jump") + direction*=20 + rotating(direction2) + +#moves=========== + + +#climb + if action.climb: + velocity = Vector3() + if run: + action.climb = false + var n = $character/climb2.get_collision_normal() + var r = Vector2(n.x,n.z).angle() + if Input.is_key_pressed(KEY_A) and $character/armhook/armclimbL.is_colliding(): + direction = Vector3(-sin(r),0,cos(r))*3 + elif Input.is_key_pressed(KEY_D) and $character/armhook/armclimbR.is_colliding(): + direction = Vector3(sin(r),0,-cos(r))*3 + else: + return + else: +#move & gravity + velocity.y += gravity * delta + var tv = velocity + if action.air_speed == 0 or action.air_speed == 1: + action.air_speed *=2 + tv = velocity.linear_interpolate(direction * speed,6 * delta) + else: + tv = velocity.linear_interpolate(direction * speed,1 * delta) + + velocity.x = tv.x + velocity.z = tv.z + velocity = character.move_and_slide(velocity,Vector3(0,1,0)) + +#camera + $head.transform.origin += (character.transform.origin-$head.transform.origin)/cam.current_speed + + if character.transform.origin.y < -50: + character.transform.origin = Vector3(0,0,0) + +func todir(a): + + if a.x != 0: + a.x = a.x/abs(a.x) + else: + a.x = 0 + if a.y != 0: + a.y = a.y/abs(a.y) + else: + a.y = 0 + if a.z != 0: + a.z = a.z/abs(a.z) + else: + a.z = 0 + return a \ No newline at end of file diff --git a/scenes/player.tscn b/scenes/player.tscn new file mode 100644 index 0000000..15a6481 --- /dev/null +++ b/scenes/player.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://scenes/player.gd" type="Script" id=1] +[ext_resource path="res://character.tscn" type="PackedScene" id=2] + +[node name="player" type="Spatial"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.50274, 0 ) +script = ExtResource( 1 ) + +[node name="head" type="Spatial" parent="."] + +[node name="tpv" type="Camera" parent="head"] +transform = Transform( 1, 0, 0, 0, 0.958606, 0.284735, 0, -0.284735, 0.958606, 0, 1.381, 3.22 ) + +[node name="character" parent="." instance=ExtResource( 2 )] + +[node name="armhook" type="Position3D" parent="character"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.721224, -0.386238 ) + +[node name="armclimbL" type="RayCast" parent="character/armhook"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -1, -0.1, 0.2 ) +enabled = true +cast_to = Vector3( 0, 0, -0.4 ) + +[node name="armclimbR" type="RayCast" parent="character/armhook"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, -0.1, 0.2 ) +enabled = true +cast_to = Vector3( 0, 0, -0.4 ) + +[node name="climb2" type="RayCast" parent="character"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.314461 ) +enabled = true +cast_to = Vector3( 0, 0, -1 ) + +[node name="climb1" type="RayCast" parent="character"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.853106, -0.720601 ) +enabled = true + +[node name="ground" type="RayCast" parent="character"] +enabled = true +cast_to = Vector3( 0, -2, 0 ) diff --git a/testman.blend b/testman.blend new file mode 100644 index 0000000..bfa3be9 Binary files /dev/null and b/testman.blend differ diff --git a/testman.glb b/testman.glb new file mode 100644 index 0000000..82fe54b Binary files /dev/null and b/testman.glb differ diff --git a/testman.tscn b/testman.tscn new file mode 100644 index 0000000..fc2d50e --- /dev/null +++ b/testman.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://testman.glb" type="PackedScene" id=1] + +[node name="testman" instance=ExtResource( 1 )] + +[node name="Armature001" parent="." index="0"] +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 )