Implemented player interaction with command queue
This commit is contained in:
parent
ef17945a59
commit
76a057943b
5 changed files with 106 additions and 12 deletions
|
@ -25,7 +25,7 @@ tracks/0/keys = {
|
|||
|
||||
[sub_resource type="Animation" id="Animation_8sdfx"]
|
||||
resource_name = "shoot"
|
||||
length = 0.20001
|
||||
length = 0.30001
|
||||
step = 0.1
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
|
@ -39,6 +39,20 @@ tracks/0/keys = {
|
|||
"update": 1,
|
||||
"values": [ExtResource("2_7ptt8"), ExtResource("3_1w3ab"), ExtResource("4_gt0rj")]
|
||||
}
|
||||
tracks/1/type = "method"
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/path = NodePath("../..")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0.3),
|
||||
"transitions": PackedFloat32Array(1),
|
||||
"values": [{
|
||||
"args": [],
|
||||
"method": &"shoot_animation_ended"
|
||||
}]
|
||||
}
|
||||
|
||||
[sub_resource type="Animation" id="Animation_ma1q3"]
|
||||
resource_name = "static"
|
||||
|
|
|
@ -37,3 +37,7 @@ size = Vector3(0.2, 3.98877, 3.95068)
|
|||
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.82441, 0.835289, 0.522302)
|
||||
size = Vector3(0.2, 4, 4)
|
||||
|
||||
[node name="SpotLight3D" type="SpotLight3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 2.6, 0)
|
||||
spot_angle = 90.0
|
||||
|
|
|
@ -15,8 +15,8 @@ enum Command {
|
|||
SMOKE
|
||||
}
|
||||
|
||||
signal command_pushed(Side, Command)
|
||||
signal command_popped(Side, Command)
|
||||
signal command_pushed(sides: Array[CommandQueue.Side], commands: Array[CommandQueue.Command])
|
||||
signal command_popped(commands: Array[CommandQueue.Command])
|
||||
|
||||
## Human-readable hand numbers. You could even make extra hands with it, if you wish
|
||||
enum Side { LEFT, RIGHT }
|
||||
|
@ -32,21 +32,26 @@ func _init() -> void:
|
|||
var arr: Array[Command] = []
|
||||
command_queue[side] = arr
|
||||
|
||||
func push(commands: Array[Command], sides: Array[Side]):
|
||||
for i in range(len(commands)):
|
||||
command_queue[sides[i]].push_back(commands[i])
|
||||
command_pushed.emit(sides[i], commands[i])
|
||||
## Add command to queue and signal about it
|
||||
func push(commands: Array[CommandQueue.Command], sides: Array[CommandQueue.Side]):
|
||||
assert(sides.size() == Side.size())
|
||||
|
||||
for i in range(commands.size()):
|
||||
command_queue[sides[i]].push_back(commands[i])
|
||||
command_pushed.emit(sides, commands)
|
||||
|
||||
## Remove first command from queue and signal about it
|
||||
func pop():
|
||||
# Checking if stack is actually empty (arrays must have same size)
|
||||
if command_queue[Side.LEFT].size() == 0:
|
||||
return
|
||||
var commands = []
|
||||
for side in Side.values():
|
||||
var command = command_queue[side].pop_front()
|
||||
command_popped.emit(side, command)
|
||||
commands.push_back(command_queue[side].pop_front())
|
||||
command_popped.emit(commands)
|
||||
|
||||
func current_command(side: Side):
|
||||
var command = command_queue[side].front()
|
||||
if command == null:
|
||||
func current_command(side: CommandQueue.Side):
|
||||
if command_queue[side].is_empty():
|
||||
return DEFAULT_COMMAND
|
||||
var command = command_queue[side].front()
|
||||
return command
|
||||
|
|
|
@ -12,10 +12,25 @@ var queue: CommandQueue = CommandQueue.new()
|
|||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
queue.command_pushed.connect(on_queue_command_pushed)
|
||||
queue.command_popped.connect(on_queue_command_popped)
|
||||
weapon_player.current_animation = "static"
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
# TODO: use proper weapon system, this is just for testing command queue
|
||||
if Input.is_action_pressed("shoot") \
|
||||
and queue.current_command(CommandQueue.Side.RIGHT) \
|
||||
== CommandQueue.DEFAULT_COMMAND:
|
||||
queue.push([
|
||||
CommandQueue.Command.NONE,
|
||||
CommandQueue.Command.SHOOT
|
||||
], [
|
||||
CommandQueue.Side.LEFT,
|
||||
CommandQueue.Side.RIGHT
|
||||
])
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
func _physics_process(delta: float) -> void:
|
||||
var direction = Vector3.ZERO
|
||||
|
@ -38,3 +53,54 @@ func _input(event):
|
|||
)
|
||||
camera.rotation.x = new_rotation
|
||||
rotation.y -= event.relative.x * horizontal_sensivity
|
||||
|
||||
func on_queue_command_pushed(sides, commands):
|
||||
for i in sides.size():
|
||||
match sides[i]:
|
||||
CommandQueue.Side.LEFT:
|
||||
handle_new_left_command(commands[i])
|
||||
CommandQueue.Side.RIGHT:
|
||||
handle_new_right_command(commands[i])
|
||||
|
||||
func handle_new_left_command(command: CommandQueue.Command):
|
||||
match command:
|
||||
CommandQueue.Command.NONE:
|
||||
pass
|
||||
_:
|
||||
print('New command %s is not implemented for left hand.' % str(command))
|
||||
|
||||
func handle_new_right_command(command: CommandQueue.Command):
|
||||
match command:
|
||||
CommandQueue.Command.NONE:
|
||||
pass
|
||||
CommandQueue.Command.SHOOT:
|
||||
weapon_player.play('shoot')
|
||||
_:
|
||||
print('New command %s is not implemented for right hand.' % str(command))
|
||||
|
||||
func shoot_animation_ended():
|
||||
queue.pop()
|
||||
|
||||
func on_queue_command_popped(commands):
|
||||
for i in CommandQueue.Side.size():
|
||||
match CommandQueue.Side.values()[i]:
|
||||
CommandQueue.Side.LEFT:
|
||||
handle_ended_left_command(commands[i])
|
||||
CommandQueue.Side.RIGHT:
|
||||
handle_ended_right_command(commands[i])
|
||||
|
||||
func handle_ended_left_command(command: CommandQueue.Command):
|
||||
match command:
|
||||
CommandQueue.Command.NONE:
|
||||
pass
|
||||
_:
|
||||
print('Ended command %s is not implemented for left hand.' % str(command))
|
||||
|
||||
func handle_ended_right_command(command: CommandQueue.Command):
|
||||
match command:
|
||||
CommandQueue.Command.NONE:
|
||||
pass
|
||||
CommandQueue.Command.SHOOT:
|
||||
weapon_player.play('static')
|
||||
_:
|
||||
print('Ended command %s is not implemented for right hand.' % str(command))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue