Improved control scheme
This commit is contained in:
14
proto2/autoloads/characters.gd
Normal file
14
proto2/autoloads/characters.gd
Normal file
@@ -0,0 +1,14 @@
|
||||
extends Node
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a = 2
|
||||
# var b = "text"
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
var characters = [load("res://characters/male_2018.tscn"), load("res://characters/female_2018.tscn")]
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta):
|
||||
# pass
|
||||
@@ -1,4 +1,5 @@
|
||||
extends Node
|
||||
signal user_click
|
||||
|
||||
var frame_tf: Transform = Transform()
|
||||
# Declare member variables here. Examples:
|
||||
@@ -7,6 +8,7 @@ var frame_tf: Transform = Transform()
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
var master_node: Node
|
||||
var camera: Camera
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
@@ -15,11 +17,11 @@ func _process(delta):
|
||||
if !master_node:
|
||||
return
|
||||
if Input.is_action_pressed("move_north"):
|
||||
var n = lerp(master_node.get_walk_speed(), 2.8, 0.4 * delta)
|
||||
var n = lerp(master_node.get_walk_speed(), 1.4, 0.5 * delta)
|
||||
master_node.set_walk_speed(n)
|
||||
master_node.walk()
|
||||
else:
|
||||
var n = lerp(master_node.get_walk_speed(), 1.0, 0.4 * delta)
|
||||
elif !master_node._path || master_node._path.size() == 0:
|
||||
var n = lerp(master_node.get_walk_speed(), 1.0, 0.5 * delta)
|
||||
master_node.set_walk_speed(n)
|
||||
master_node.idle()
|
||||
if Input.is_action_pressed("move_east"):
|
||||
@@ -28,4 +30,25 @@ func _process(delta):
|
||||
if Input.is_action_pressed("move_west"):
|
||||
var tf_turn = Transform(Quat(Vector3(0, 1, 0), PI * 0.6 * delta))
|
||||
frame_tf *= tf_turn
|
||||
var click2d: Vector2 = Vector2()
|
||||
var click2d_update: bool = false
|
||||
var click3d: Vector3 = Vector3()
|
||||
var click3d_update: bool = false
|
||||
|
||||
func _unhandled_input(event):
|
||||
if event is InputEventMouse:
|
||||
if event.button_mask & BUTTON_MASK_LEFT:
|
||||
click2d = event.position
|
||||
click2d_update = true
|
||||
func _physics_process(delta):
|
||||
if click2d_update:
|
||||
var space := camera.get_world().direct_space_state
|
||||
var ray_origin : = camera.project_ray_origin(click2d)
|
||||
var ray_normal : = camera.project_ray_normal(click2d)
|
||||
var result := space.intersect_ray(ray_origin, ray_origin + ray_normal * 120.0, [], 512, true, false)
|
||||
if result.has("position"):
|
||||
click3d = result.position
|
||||
click3d_update = true
|
||||
emit_signal("user_click", click3d)
|
||||
click2d_update = false
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ var cheer_team = {}
|
||||
var room_events = {}
|
||||
var line = {}
|
||||
var training = false
|
||||
var nav: Navigation
|
||||
|
||||
func room_event(ev: String):
|
||||
if current_room:
|
||||
|
||||
@@ -26,6 +26,16 @@ func get_walk_speed() -> float:
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta):
|
||||
# pass
|
||||
var _path: Array
|
||||
|
||||
func walkto(target: Vector3, spd: float = 1.4):
|
||||
var cur = world.nav.get_closest_point(global_transform.origin)
|
||||
target = world.nav.get_closest_point(target)
|
||||
var path: PoolVector3Array = world.nav.get_simple_path(cur, target)
|
||||
_path = Array(path)
|
||||
set_walk_speed(spd)
|
||||
walk()
|
||||
|
||||
func _process(delta):
|
||||
orientation = global_transform
|
||||
orientation.origin = Vector3()
|
||||
@@ -41,6 +51,19 @@ func _process(delta):
|
||||
if is_in_group("master"):
|
||||
orientation *= controls.frame_tf
|
||||
controls.frame_tf = Transform()
|
||||
if _path && _path.size() > 0:
|
||||
while _path.size() > 0 && _path[0].distance_to(global_transform.origin) < 0.5:
|
||||
_path.pop_front()
|
||||
if _path.size() > 0:
|
||||
var next: Vector3 = _path[0]
|
||||
var direction: Vector3 = (next - global_transform.origin).normalized()
|
||||
var actual_direction: Vector3 = -global_transform.basis[2]
|
||||
var angle: float = Vector2(actual_direction.x, actual_direction.z).angle_to(Vector2(direction.x, direction.z))
|
||||
var tf_turn = Transform(Quat(Vector3(0, 1, 0), -angle * delta))
|
||||
orientation *= tf_turn
|
||||
if !_path || _path.size() == 0:
|
||||
idle()
|
||||
|
||||
orientation.origin = Vector3()
|
||||
orientation = orientation.orthonormalized()
|
||||
global_transform.basis = orientation.basis
|
||||
|
||||
@@ -7,14 +7,20 @@ extends Spatial
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
var frame_tf: Transform = Transform()
|
||||
|
||||
func master_control(pos):
|
||||
$master.walkto(pos)
|
||||
|
||||
func _ready():
|
||||
$master.add_to_group("master")
|
||||
controls.master_node = $master
|
||||
world.init_data()
|
||||
world.nav = $nav
|
||||
controls.camera = $Camera
|
||||
controls.connect("user_click", self, "master_control")
|
||||
for k in world.line.keys():
|
||||
var cd = world.line[k]
|
||||
if cd.type == 0:
|
||||
var char_sc = load("res://characters/male_2018.tscn").instance()
|
||||
var char_sc = characters.characters[0].instance()
|
||||
cd.scene = char_sc
|
||||
get_tree().get_root().add_child(char_sc)
|
||||
var nav: Navigation2D = get_node("nav")
|
||||
@@ -23,7 +29,7 @@ func _ready():
|
||||
# world.team[newkey] = cd
|
||||
# world.line.erase(k)
|
||||
else:
|
||||
var char_sc = load("res://characters/female_2018.tscn").instance()
|
||||
var char_sc = characters.characters[1].instance()
|
||||
cd.scene = char_sc
|
||||
get_tree().get_root().add_child(char_sc)
|
||||
var nav: Navigation2D = get_node("nav")
|
||||
@@ -37,4 +43,4 @@ func _ready():
|
||||
func _process(delta):
|
||||
var pos = $master.global_transform.origin
|
||||
pos.y = $Camera.global_transform.origin.y
|
||||
$Camera.global_transform.origin = $Camera.global_transform.origin.linear_interpolate(pos, 0.53 * delta)
|
||||
$Camera.global_transform.origin = $Camera.global_transform.origin.linear_interpolate(pos, 0.8 * delta)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[gd_scene load_steps=5 format=2]
|
||||
[gd_scene load_steps=7 format=2]
|
||||
|
||||
[ext_resource path="res://characters/male_2018.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://walls/walls.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://walls/walls.tscn" type="PackedScene" id=1]
|
||||
[ext_resource path="res://characters/male_2018.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://main.gd" type="Script" id=3]
|
||||
|
||||
[sub_resource type="NavigationMesh" id=1]
|
||||
@@ -12,6 +12,13 @@ agent/height = 1.8
|
||||
agent/radius = 0.1
|
||||
agent/max_climb = 0.8
|
||||
|
||||
[sub_resource type="ProceduralSky" id=2]
|
||||
|
||||
[sub_resource type="Environment" id=3]
|
||||
background_mode = 2
|
||||
background_sky = SubResource( 2 )
|
||||
ambient_light_color = Color( 0.227451, 0.2, 0.2, 1 )
|
||||
|
||||
[node name="main" type="Spatial"]
|
||||
script = ExtResource( 3 )
|
||||
|
||||
@@ -20,37 +27,13 @@ script = ExtResource( 3 )
|
||||
[node name="navmesh" type="NavigationMeshInstance" parent="nav"]
|
||||
navmesh = SubResource( 1 )
|
||||
|
||||
[node name="building" parent="nav/navmesh" instance=ExtResource( 2 )]
|
||||
[node name="building" parent="nav/navmesh" instance=ExtResource( 1 )]
|
||||
|
||||
[node name="Camera" type="Camera" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 22.648, 10, 17.621 )
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 22.648, 6, 17.621 )
|
||||
environment = SubResource( 3 )
|
||||
|
||||
[node name="light1" type="SpotLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 22.524, 4, 15.4789 )
|
||||
light_energy = 1.5
|
||||
spot_angle = 89.0
|
||||
|
||||
[node name="light2" type="SpotLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.102865, 4, 15.4789 )
|
||||
light_energy = 1.5
|
||||
spot_angle = 89.0
|
||||
|
||||
[node name="light3" type="SpotLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -23.3045, 4, 15.4789 )
|
||||
|
||||
[node name="light4" type="SpotLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -16.1032, 4, -3.9398 )
|
||||
|
||||
[node name="light5" type="SpotLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 14.9059, 4, -3.9398 )
|
||||
|
||||
[node name="light6" type="SpotLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 14.9059, 4, -27.6017 )
|
||||
|
||||
[node name="light7" type="SpotLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -16.7263, 4, -27.6017 )
|
||||
|
||||
[node name="master" parent="." instance=ExtResource( 1 )]
|
||||
[node name="master" parent="." instance=ExtResource( 2 )]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 22.208, 0, 18.6387 )
|
||||
|
||||
[node name="line_spawn" type="Spatial" parent="."]
|
||||
|
||||
@@ -26,6 +26,7 @@ run/main_scene="res://ui/menu_root.tscn"
|
||||
|
||||
world="*res://autoloads/world.gd"
|
||||
controls="*res://autoloads/controls.gd"
|
||||
characters="*res://autoloads/characters.gd"
|
||||
|
||||
[input]
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user