summaryrefslogtreecommitdiff
path: root/scripts/basketball.gd
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/basketball.gd')
-rw-r--r--scripts/basketball.gd62
1 files changed, 20 insertions, 42 deletions
diff --git a/scripts/basketball.gd b/scripts/basketball.gd
index 6171410..feed262 100644
--- a/scripts/basketball.gd
+++ b/scripts/basketball.gd
@@ -3,16 +3,12 @@ extends RigidBody2D
export var spin_speed = -1
export var move_speed = 60
export var power_magnitude = 10
+export var drag_radius = 30
var start_position
var is_dragging = false
var waiting_for_shoot = true
-var ready_to_shoot
-var ready_to_hold
-var power
-var spin_rotation = 0
-var has_exited
-var exit_position
+var mouse_over_ball
func _ready():
start_position = position
@@ -20,7 +16,13 @@ func _ready():
func toggle_mode():
if waiting_for_shoot:
waiting_for_shoot = false
- shoot()
+
+ var shoot_power = -$Sprite.position * power_magnitude
+ apply_impulse(Vector2(2, 2), shoot_power)
+
+ is_dragging = false
+ $GhostSprite.visible = false
+ $Sprite.position = Vector2(0, 0)
else:
# Adds offset of ball's rotation to sprite AFTER the entire object has rotated from physics.
# Done to keep appearance of same rotation to add consistency when resetting the ball.
@@ -29,9 +31,6 @@ func toggle_mode():
waiting_for_shoot = true
set_use_custom_integrator(waiting_for_shoot)
-func shoot():
- apply_impulse(Vector2(2, 2), Vector2(power))
-
# Override the default physics when we want to manually set the position and rotation.
func _integrate_forces(state):
if waiting_for_shoot:
@@ -51,51 +50,30 @@ func _process(delta):
start_position.x = clamp(start_position.x, 0, get_viewport_rect().size.x)
func _input(event):
- if event.is_action_pressed("shoot") and ready_to_hold and waiting_for_shoot:
+ if event.is_action_pressed("shoot") and mouse_over_ball and waiting_for_shoot:
is_dragging = true
- $GhostSprite.visible = true
$Sprite.position = event.position - start_position
+ $GhostSprite.visible = true
$GhostSprite.rotation = $Sprite.rotation
if is_dragging and event is InputEventMouseMotion:
$Sprite.position = event.position - start_position
- if has_exited:
+ var hypot = sqrt(pow($Sprite.position.x, 2) + pow($Sprite.position.y, 2))
+ if hypot > drag_radius:
var angle = atan2($Sprite.position.y, $Sprite.position.x)
- $Sprite.position = Vector2(cos(angle), sin(angle)) * $OuterShape/CollisionShape2D.shape.radius
+ $Sprite.position = Vector2(cos(angle), sin(angle)) * drag_radius
if event.is_action_released("shoot"):
- if !waiting_for_shoot:
+ if !waiting_for_shoot || is_dragging:
toggle_mode()
- if is_dragging and ready_to_shoot:
- is_dragging = false
- $GhostSprite.visible = false
- $Sprite.position = Vector2()
- var basketball_position
- if has_exited:
- basketball_position = exit_position
- else:
- basketball_position = event.position
- power = (start_position - basketball_position) * power_magnitude
- toggle_mode()
-
-func on_OuterShape_mouse_entered():
- ready_to_shoot = true
- has_exited = false
-func _on_OuterShape_mouse_exited():
- if is_dragging:
- exit_position = get_global_mouse_position()
- $Sprite.position = get_local_mouse_position()
- has_exited = true
- else:
- ready_to_shoot = false
func _on_InnerShape_mouse_entered():
- ready_to_hold = true
+ mouse_over_ball = true
+
func _on_InnerShape_mouse_exited():
- ready_to_hold = false
+ mouse_over_ball = false
func position_changer():
- var clamp_minimum; var clamp_maximum
- clamp_minimum = $OuterShape/CollisionShape2D.shape.radius + 0
- clamp_maximum = global_variables.hoop_position - 40
+ var clamp_minimum = drag_radius + 0
+ var clamp_maximum = global_variables.hoop_position - 40
if global_variables.score < 5:
start_position.x -= 20
start_position.x = clamp(start_position.x, clamp_minimum, clamp_maximum)