Cards now tween and don't overlap as badly

This commit is contained in:
Hamcha 2019-05-06 23:18:04 +02:00
parent 763c187cdd
commit d553492e00
Signed by: hamcha
GPG key ID: A40413D21021EAEE
5 changed files with 67 additions and 26 deletions

View file

@ -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="."]

View file

@ -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:
@ -80,3 +76,20 @@ func _menu_action(id: int):
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()

View file

@ -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"]

View file

@ -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):

View file

@ -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)))