Improved control scheme

This commit is contained in:
Segey Lapin
2019-07-22 01:32:12 +03:00
parent 90d2938eca
commit 225dcb805f
8 changed files with 90 additions and 38 deletions

View 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

View File

@@ -1,4 +1,5 @@
extends Node extends Node
signal user_click
var frame_tf: Transform = Transform() var frame_tf: Transform = Transform()
# Declare member variables here. Examples: # 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. # Called when the node enters the scene tree for the first time.
var master_node: Node var master_node: Node
var camera: Camera
func _ready(): func _ready():
pass # Replace with function body. pass # Replace with function body.
@@ -15,11 +17,11 @@ func _process(delta):
if !master_node: if !master_node:
return return
if Input.is_action_pressed("move_north"): 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.set_walk_speed(n)
master_node.walk() master_node.walk()
else: elif !master_node._path || master_node._path.size() == 0:
var n = lerp(master_node.get_walk_speed(), 1.0, 0.4 * delta) var n = lerp(master_node.get_walk_speed(), 1.0, 0.5 * delta)
master_node.set_walk_speed(n) master_node.set_walk_speed(n)
master_node.idle() master_node.idle()
if Input.is_action_pressed("move_east"): if Input.is_action_pressed("move_east"):
@@ -28,4 +30,25 @@ func _process(delta):
if Input.is_action_pressed("move_west"): if Input.is_action_pressed("move_west"):
var tf_turn = Transform(Quat(Vector3(0, 1, 0), PI * 0.6 * delta)) var tf_turn = Transform(Quat(Vector3(0, 1, 0), PI * 0.6 * delta))
frame_tf *= tf_turn 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

View File

@@ -12,6 +12,7 @@ var cheer_team = {}
var room_events = {} var room_events = {}
var line = {} var line = {}
var training = false var training = false
var nav: Navigation
func room_event(ev: String): func room_event(ev: String):
if current_room: if current_room:

View File

@@ -26,6 +26,16 @@ func get_walk_speed() -> float:
# 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 # 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): func _process(delta):
orientation = global_transform orientation = global_transform
orientation.origin = Vector3() orientation.origin = Vector3()
@@ -41,6 +51,19 @@ func _process(delta):
if is_in_group("master"): if is_in_group("master"):
orientation *= controls.frame_tf orientation *= controls.frame_tf
controls.frame_tf = Transform() 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.origin = Vector3()
orientation = orientation.orthonormalized() orientation = orientation.orthonormalized()
global_transform.basis = orientation.basis global_transform.basis = orientation.basis

View File

@@ -7,14 +7,20 @@ extends Spatial
# Called when the node enters the scene tree for the first time. # Called when the node enters the scene tree for the first time.
var frame_tf: Transform = Transform() var frame_tf: Transform = Transform()
func master_control(pos):
$master.walkto(pos)
func _ready(): func _ready():
$master.add_to_group("master") $master.add_to_group("master")
controls.master_node = $master controls.master_node = $master
world.init_data() world.init_data()
world.nav = $nav
controls.camera = $Camera
controls.connect("user_click", self, "master_control")
for k in world.line.keys(): for k in world.line.keys():
var cd = world.line[k] var cd = world.line[k]
if cd.type == 0: 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 cd.scene = char_sc
get_tree().get_root().add_child(char_sc) get_tree().get_root().add_child(char_sc)
var nav: Navigation2D = get_node("nav") var nav: Navigation2D = get_node("nav")
@@ -23,7 +29,7 @@ func _ready():
# world.team[newkey] = cd # world.team[newkey] = cd
# world.line.erase(k) # world.line.erase(k)
else: else:
var char_sc = load("res://characters/female_2018.tscn").instance() var char_sc = characters.characters[1].instance()
cd.scene = char_sc cd.scene = char_sc
get_tree().get_root().add_child(char_sc) get_tree().get_root().add_child(char_sc)
var nav: Navigation2D = get_node("nav") var nav: Navigation2D = get_node("nav")
@@ -37,4 +43,4 @@ func _ready():
func _process(delta): func _process(delta):
var pos = $master.global_transform.origin var pos = $master.global_transform.origin
pos.y = $Camera.global_transform.origin.y 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)

View File

@@ -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=1]
[ext_resource path="res://walls/walls.tscn" type="PackedScene" id=2] [ext_resource path="res://characters/male_2018.tscn" type="PackedScene" id=2]
[ext_resource path="res://main.gd" type="Script" id=3] [ext_resource path="res://main.gd" type="Script" id=3]
[sub_resource type="NavigationMesh" id=1] [sub_resource type="NavigationMesh" id=1]
@@ -12,6 +12,13 @@ agent/height = 1.8
agent/radius = 0.1 agent/radius = 0.1
agent/max_climb = 0.8 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"] [node name="main" type="Spatial"]
script = ExtResource( 3 ) script = ExtResource( 3 )
@@ -20,37 +27,13 @@ script = ExtResource( 3 )
[node name="navmesh" type="NavigationMeshInstance" parent="nav"] [node name="navmesh" type="NavigationMeshInstance" parent="nav"]
navmesh = SubResource( 1 ) 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="."] [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="."] [node name="master" parent="." instance=ExtResource( 2 )]
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 )]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 22.208, 0, 18.6387 ) transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 22.208, 0, 18.6387 )
[node name="line_spawn" type="Spatial" parent="."] [node name="line_spawn" type="Spatial" parent="."]

View File

@@ -26,6 +26,7 @@ run/main_scene="res://ui/menu_root.tscn"
world="*res://autoloads/world.gd" world="*res://autoloads/world.gd"
controls="*res://autoloads/controls.gd" controls="*res://autoloads/controls.gd"
characters="*res://autoloads/characters.gd"
[input] [input]

File diff suppressed because one or more lines are too long