Cards now tween and don't overlap as badly
This commit is contained in:
parent
763c187cdd
commit
d553492e00
5 changed files with 67 additions and 26 deletions
|
@ -31,5 +31,3 @@ material/0 = null
|
||||||
[node name="BoardUI" parent="." instance=ExtResource( 4 )]
|
[node name="BoardUI" parent="." instance=ExtResource( 4 )]
|
||||||
|
|
||||||
[node name="Cards" type="Spatial" parent="."]
|
[node name="Cards" type="Spatial" parent="."]
|
||||||
|
|
||||||
[node name="Tween" type="Tween" parent="."]
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ signal card_selected()
|
||||||
signal card_unselected()
|
signal card_unselected()
|
||||||
signal card_picked()
|
signal card_picked()
|
||||||
signal card_dropped()
|
signal card_dropped()
|
||||||
|
signal card_dropped_anim()
|
||||||
signal card_menu()
|
signal card_menu()
|
||||||
|
|
||||||
var clicked := false
|
var clicked := false
|
||||||
|
@ -28,19 +29,18 @@ func _input_event(camera, event, click_position, click_normal, shape_idx):
|
||||||
# Mouse motion
|
# Mouse motion
|
||||||
if clicked and event is InputEventMouseMotion:
|
if clicked and event is InputEventMouseMotion:
|
||||||
if not lifted:
|
if not lifted:
|
||||||
animation.play("lift")
|
|
||||||
if inHand:
|
|
||||||
animation.advance(1.0)
|
|
||||||
emit_signal("card_picked")
|
emit_signal("card_picked")
|
||||||
lifted = true
|
lifted = true
|
||||||
var origin: Vector3 = camera.project_ray_origin(event.position)
|
var origin: Vector3 = camera.project_ray_origin(event.position)
|
||||||
var direction: Vector3 = camera.project_ray_normal(event.position)
|
var direction: Vector3 = camera.project_ray_normal(event.position)
|
||||||
if inHand:
|
if inHand:
|
||||||
transform.origin = Vector3.ZERO + Vector3.RIGHT * direction * 3.0
|
translation = Vector3(direction.x * 3.0, 0.25, -0.25)
|
||||||
|
# Fix rotation if coming from hand
|
||||||
|
rotation = Vector3.ZERO
|
||||||
else:
|
else:
|
||||||
var denom := Vector3.UP.dot(direction)
|
var denom := Vector3.UP.dot(direction)
|
||||||
var t: float = (-camera.transform.origin).dot(Vector3.UP) / denom;
|
var t: float = (-camera.transform.origin).dot(Vector3.UP) / denom;
|
||||||
transform.origin = origin + direction * t
|
translation = origin + direction * t
|
||||||
# Right click
|
# Right click
|
||||||
if event is InputEventMouseButton and event.pressed and event.button_index == BUTTON_RIGHT:
|
if event is InputEventMouseButton and event.pressed and event.button_index == BUTTON_RIGHT:
|
||||||
# Show menu
|
# Show menu
|
||||||
|
@ -52,15 +52,11 @@ func _input_event(camera, event, click_position, click_normal, shape_idx):
|
||||||
|
|
||||||
# Check for card dropped
|
# Check for card dropped
|
||||||
if not clicked and lifted:
|
if not clicked and lifted:
|
||||||
if inHand:
|
|
||||||
animation.play("drop")
|
|
||||||
else:
|
|
||||||
animation.play_backwards("lift")
|
|
||||||
emit_signal("card_dropped")
|
emit_signal("card_dropped")
|
||||||
lifted = false
|
lifted = false
|
||||||
|
|
||||||
# Check double click
|
# Check double click
|
||||||
if event.doubleclick and not lifted and not animation.is_playing():
|
if event.doubleclick and not inHand and not lifted and not animation.is_playing():
|
||||||
if exhausted:
|
if exhausted:
|
||||||
animation.play_backwards("tap")
|
animation.play_backwards("tap")
|
||||||
exhausted = false
|
exhausted = false
|
||||||
|
@ -69,7 +65,7 @@ func _input_event(camera, event, click_position, click_normal, shape_idx):
|
||||||
exhausted = true
|
exhausted = true
|
||||||
|
|
||||||
func reset_transform():
|
func reset_transform():
|
||||||
$Border.transform.origin = Vector3.ZERO
|
$Border.translation = Vector3.ZERO
|
||||||
|
|
||||||
func _menu_action(id: int):
|
func _menu_action(id: int):
|
||||||
match id:
|
match id:
|
||||||
|
@ -79,4 +75,21 @@ func _menu_action(id: int):
|
||||||
flipped = false
|
flipped = false
|
||||||
else:
|
else:
|
||||||
animation.play("flip")
|
animation.play("flip")
|
||||||
flipped = true
|
flipped = true
|
||||||
|
|
||||||
|
func _check_drop_anim(anim_name):
|
||||||
|
if anim_name == "drop":
|
||||||
|
emit_signal("card_dropped_anim")
|
||||||
|
|
||||||
|
func tween_move_to(targetPos: Vector3, duration: float = 0.1):
|
||||||
|
$Tween.interpolate_property(self, "translation",
|
||||||
|
translation, targetPos, duration,
|
||||||
|
Tween.TRANS_CUBIC, Tween.EASE_IN_OUT)
|
||||||
|
|
||||||
|
func tween_rotate(targetRot: Vector3, duration: float = 0.1):
|
||||||
|
$Tween.interpolate_property(self, "rotation",
|
||||||
|
rotation, targetRot, duration,
|
||||||
|
Tween.TRANS_CUBIC, Tween.EASE_IN_OUT)
|
||||||
|
|
||||||
|
func tween():
|
||||||
|
$Tween.start()
|
|
@ -169,6 +169,9 @@ anims/tap = SubResource( 7 )
|
||||||
transform = Transform( 0.318962, 0, 0, 0, 1, 0, 0, 0, 0.450381, 0, 0.007, 0 )
|
transform = Transform( 0.318962, 0, 0, 0, 1, 0, 0, 0, 0.450381, 0, 0.007, 0 )
|
||||||
mesh = SubResource( 8 )
|
mesh = SubResource( 8 )
|
||||||
material/0 = SubResource( 9 )
|
material/0 = SubResource( 9 )
|
||||||
|
|
||||||
|
[node name="Tween" type="Tween" parent="."]
|
||||||
[connection signal="input_event" from="." to="." method="_input_event"]
|
[connection signal="input_event" from="." to="." method="_input_event"]
|
||||||
[connection signal="mouse_entered" from="." to="." method="_mouse_hover"]
|
[connection signal="mouse_entered" from="." to="." method="_mouse_hover"]
|
||||||
[connection signal="mouse_exited" from="." to="." method="_mouse_blur"]
|
[connection signal="mouse_exited" from="." to="." method="_mouse_blur"]
|
||||||
|
[connection signal="animation_finished" from="Border/AnimationPlayer" to="." method="_check_drop_anim"]
|
||||||
|
|
|
@ -9,7 +9,7 @@ onready var hand := $Camera/Hand
|
||||||
onready var ui := $BoardUI
|
onready var ui := $BoardUI
|
||||||
onready var cards := $Cards
|
onready var cards := $Cards
|
||||||
|
|
||||||
export var mouseHandThreshold = 0.9
|
export var mouseHandThreshold = 0.85
|
||||||
|
|
||||||
var holdingCard: Card = null
|
var holdingCard: Card = null
|
||||||
var focusedCard: Card = null
|
var focusedCard: Card = null
|
||||||
|
@ -63,13 +63,14 @@ func _process(delta: float):
|
||||||
|
|
||||||
func _card_picked(card: Card):
|
func _card_picked(card: Card):
|
||||||
holdingCard = card
|
holdingCard = card
|
||||||
# Fix rotation if coming from hand
|
holdingCard.animation.play("lift")
|
||||||
if holdingCard.inHand:
|
|
||||||
holdingCard.rotation = Vector3.ZERO
|
|
||||||
|
|
||||||
func _card_dropped(card: Card):
|
func _card_dropped(card: Card):
|
||||||
|
if card.inHand:
|
||||||
|
card.animation.play("drop")
|
||||||
|
else:
|
||||||
|
card.animation.play_backwards("lift")
|
||||||
holdingCard = null
|
holdingCard = null
|
||||||
reorder_hand()
|
|
||||||
|
|
||||||
func _card_selected(card: Card):
|
func _card_selected(card: Card):
|
||||||
if card.inHand and focusedCard == null:
|
if card.inHand and focusedCard == null:
|
||||||
|
@ -98,6 +99,7 @@ func add_card(cardID: String, playerID: int, inHand: bool):
|
||||||
card.connect("card_unselected", ui, "_card_unselected", [card])
|
card.connect("card_unselected", ui, "_card_unselected", [card])
|
||||||
card.connect("card_selected", self, "_card_selected", [card])
|
card.connect("card_selected", self, "_card_selected", [card])
|
||||||
card.connect("card_unselected", self, "_card_unselected", [card])
|
card.connect("card_unselected", self, "_card_unselected", [card])
|
||||||
|
card.connect("card_dropped_anim", self, "check_hand_drop", [card])
|
||||||
card.connect("card_menu", ui, "show_card_menu", [card])
|
card.connect("card_menu", ui, "show_card_menu", [card])
|
||||||
if inHand:
|
if inHand:
|
||||||
# TODO if player != me, put in opponent's hand
|
# TODO if player != me, put in opponent's hand
|
||||||
|
@ -105,8 +107,14 @@ func add_card(cardID: String, playerID: int, inHand: bool):
|
||||||
else:
|
else:
|
||||||
cards.add_child(card)
|
cards.add_child(card)
|
||||||
|
|
||||||
|
func check_hand_drop(card: Card):
|
||||||
|
# Re-order hand as soon as the animation is over
|
||||||
|
if card.inHand:
|
||||||
|
card.reset_transform()
|
||||||
|
reorder_hand()
|
||||||
|
|
||||||
const MAX_CARD_DISTANCE := 0.5
|
const MAX_CARD_DISTANCE := 0.5
|
||||||
const HAND_SCREEN_PERC := 0.8
|
const HAND_SCREEN_PERC := 0.6
|
||||||
const CARD_ROTATION := 0.03
|
const CARD_ROTATION := 0.03
|
||||||
const UNITSPERPX := 0.003
|
const UNITSPERPX := 0.003
|
||||||
|
|
||||||
|
@ -121,17 +129,18 @@ func reorder_hand():
|
||||||
# want them to go offscreen, therefore a "maximum screen %" is used to determine
|
# want them to go offscreen, therefore a "maximum screen %" is used to determine
|
||||||
# how to fit all the cards within a % of the viewport's width
|
# how to fit all the cards within a % of the viewport's width
|
||||||
var distancePerc := get_viewport().size.x * HAND_SCREEN_PERC * UNITSPERPX / size
|
var distancePerc := get_viewport().size.x * HAND_SCREEN_PERC * UNITSPERPX / size
|
||||||
var distance := distancePerc#max(distancePerc, MAX_CARD_DISTANCE)
|
var distance := min(distancePerc, MAX_CARD_DISTANCE)
|
||||||
var totalWidth := distance * (size-1)
|
var totalWidth := distance * (size-1)
|
||||||
var minX := -totalWidth/2
|
var minX := -totalWidth/2
|
||||||
|
|
||||||
# Iterate over all items, keep track of the index
|
# Iterate over all items, keep track of the index
|
||||||
var i := 0
|
var i := 0
|
||||||
for child in cardsInHand:
|
for child in cardsInHand:
|
||||||
child.transform.origin = Vector3(minX + distance * i, 0.02*i, 0)
|
child.tween_move_to(Vector3(minX + distance * i, 0.02*i, -0.005*i))
|
||||||
child.rotation = Vector3(0, CARD_ROTATION * (size - i - 1), 0)
|
child.tween_rotate(Vector3(0, CARD_ROTATION * (size/2.0 - i), 0))
|
||||||
i += 1
|
i += 1
|
||||||
child.reset_transform()
|
child.reset_transform()
|
||||||
|
child.tween()
|
||||||
|
|
||||||
class TransformSorter:
|
class TransformSorter:
|
||||||
static func sort(a, b):
|
static func sort(a, b):
|
||||||
|
|
|
@ -2,6 +2,8 @@ extends Control
|
||||||
|
|
||||||
onready var animation = $AnimationPlayer
|
onready var animation = $AnimationPlayer
|
||||||
|
|
||||||
|
var menu: PopupMenu = null
|
||||||
|
|
||||||
func _card_selected(card: Card):
|
func _card_selected(card: Card):
|
||||||
animation.play("fade ui card")
|
animation.play("fade ui card")
|
||||||
|
|
||||||
|
@ -9,8 +11,24 @@ func _card_unselected(card: Card):
|
||||||
animation.play_backwards("fade ui card")
|
animation.play_backwards("fade ui card")
|
||||||
|
|
||||||
func show_card_menu(card):
|
func show_card_menu(card):
|
||||||
var menu := PopupMenu.new()
|
# Close any open menus
|
||||||
menu.add_item("Flip", 0)
|
if menu != null:
|
||||||
|
menu.queue_free()
|
||||||
|
remove_child(menu)
|
||||||
|
menu = PopupMenu.new()
|
||||||
|
if card.inHand:
|
||||||
|
menu.add_separator("Hand actions")
|
||||||
|
menu.add_item("Reveal card", 3)
|
||||||
|
menu.add_item("Discard card", 4)
|
||||||
|
menu.add_item("Banish card", 5)
|
||||||
|
else:
|
||||||
|
menu.add_separator("Card actions")
|
||||||
|
menu.add_item("Flip card", 0)
|
||||||
|
menu.add_separator("Counters & status")
|
||||||
|
menu.add_item("Set Pumped", 1)
|
||||||
|
menu.add_item("Set Cutie-Marked", 2)
|
||||||
|
menu.add_item("Add color", 3)
|
||||||
|
menu.add_item("Add marker", 4)
|
||||||
menu.connect("id_pressed", card, "_menu_action")
|
menu.connect("id_pressed", card, "_menu_action")
|
||||||
add_child(menu)
|
add_child(menu)
|
||||||
menu.popup(Rect2(get_viewport().get_mouse_position(), Vector2(100,10)))
|
menu.popup(Rect2(get_viewport().get_mouse_position(), Vector2(150,10)))
|
Loading…
Reference in a new issue