|
- tool
- extends Node2D
-
- const PUSH_VEC_DEFAULT = Vector2(0.0, -1.0)
-
- export var pulse_color:Color = Color(1.0, 1.0, 1.0, 1.0) setget _set_color
- export(float, 0, 400) var push_force = 128
- export(float, 0, 1.0) var push_frequency = 0.2
- export(float, -180.0, 180) var push_angle = 0 setget _set_angle
-
- var _bodies = []
- var _delay = 1.1
-
- func _set_angle(a):
- push_angle = a
- $Body.rotation_degrees = push_angle
-
- func _set_color(c):
- pulse_color = c
- for i in range(6):
- get_node("Body/PulseArrow" + String(i + 1)).set_color(pulse_color)
- $Body/Particles.process_material.color = c
-
- func _dominant_color(c):
- if c.r > c.g and c.r > c.b:
- return "r"
- elif c.g > c.r and c.g > c.b:
- return "g"
- elif c.b > c.r and c.b > c.g:
- return "b"
- return "n"
-
- func _ready():
- set_process(true)
- for i in range(6):
- get_node("Body/PulseArrow" + String(i + 1)).set_color(pulse_color)
-
-
- func _rim_match(body):
- if body.has_method("get_rim_color"):
- var rdc = _dominant_color(body.get_rim_color())
- var dc = _dominant_color(pulse_color)
- print ("RIM: ", rdc, " | Push: ", dc)
- if (rdc == dc):
- return true
- return false
-
- func _process(delta):
- if _bodies.size() > 0 and _delay >= push_frequency:
- _delay = 0.0
- var v = PUSH_VEC_DEFAULT.rotated(deg2rad(push_angle))
- for i in range(_bodies.size()):
- if _rim_match(_bodies[i]):
- _bodies[i].apply_central_impulse(v * push_force)
- else:
- _delay = min(1.1, _delay + delta)
-
- func _has_body(body):
- for i in range(_bodies.size()):
- if _bodies[i] == body:
- return i
- return -1
-
- func _on_Area2D_body_entered(body):
- if body.is_in_group("Player") and _has_body(body) < 0:
- _bodies.append(body)
-
-
- func _on_Area2D_body_exited(body):
- var id = _has_body(body)
- if (id >= 0):
- _bodies.remove(id)
|