12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- extends Navigation
- const SPEED = 10.0
- var camrot = 0.0
- var m = SpatialMaterial.new()
- var path = []
- var show_path = true
- onready var robot = get_node("RobotBase")
- onready var camera = get_node("CameraBase/Camera")
- func _ready():
- set_process_input(true)
- m.flags_unshaded = true
- m.flags_use_point_size = true
- m.albedo_color = Color.white
- func _physics_process(delta):
- var direction = Vector3()
- # We need to scale the movement speed by how much delta has passed,
- # otherwise the motion won't be smooth.
- var step_size = delta * SPEED
- if path.size() > 0:
- # Direction is the difference between where we are now
- # and where we want to go.
- var destination = path[0]
- direction = destination - robot.translation
- # If the next node is closer than we intend to 'step', then
- # take a smaller step. Otherwise we would go past it and
- # potentially go through a wall or over a cliff edge!
- if step_size > direction.length():
- step_size = direction.length()
- # We should also remove this node since we're about to reach it.
- path.remove(0)
- # Move the robot towards the path node, by how far we want to travel.
- # Note: For a KinematicBody, we would instead use move_and_slide
- # so collisions work properly.
- robot.translation += direction.normalized() * step_size
- # Lastly let's make sure we're looking in the direction we're traveling.
- # Clamp y to 0 so the robot only looks left and right, not up/down.
- direction.y = 0
- if direction:
- # Direction is relative, so apply it to the robot's location to
- # get a point we can actually look at.
- var look_at_point = robot.translation + direction.normalized()
- # Make the robot look at the point.
- robot.look_at(look_at_point, Vector3.UP)
- func _unhandled_input(event):
- if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.pressed:
- var from = camera.project_ray_origin(event.position)
- var to = from + camera.project_ray_normal(event.position) * 1000
- var target_point = get_closest_point_to_segment(from, to)
- # Set the path between the robots current location and our target.
- path = get_simple_path(robot.translation, target_point, true)
- if show_path:
- draw_path(path)
- if event is InputEventMouseMotion:
- if event.button_mask & (BUTTON_MASK_MIDDLE + BUTTON_MASK_RIGHT):
- camrot += event.relative.x * 0.005
- get_node("CameraBase").set_rotation(Vector3(0, camrot, 0))
- print("Camera Rotation: ", camrot)
- func draw_path(path_array):
- var im = get_node("Draw")
- im.set_material_override(m)
- im.clear()
- im.begin(Mesh.PRIMITIVE_POINTS, null)
- im.add_vertex(path_array[0])
- im.add_vertex(path_array[path_array.size() - 1])
- im.end()
- im.begin(Mesh.PRIMITIVE_LINE_STRIP, null)
- for x in path:
- im.add_vertex(x)
- im.end()
|