Add snapping to zones
This commit is contained in:
parent
f398d6cefa
commit
df81649b53
6 changed files with 99 additions and 26 deletions
|
@ -37,11 +37,14 @@ material/0 = null
|
||||||
[node name="Deck" parent="Cards" instance=ExtResource( 5 )]
|
[node name="Deck" parent="Cards" instance=ExtResource( 5 )]
|
||||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4.30889, 0, 3.52858 )
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -4.30889, 0, 3.52858 )
|
||||||
title = "Deck"
|
title = "Deck"
|
||||||
|
zoneName = "player1.deck"
|
||||||
|
|
||||||
[node name="Graveyard" parent="Cards" instance=ExtResource( 5 )]
|
[node name="Graveyard" parent="Cards" instance=ExtResource( 5 )]
|
||||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -5.23371, 0, 3.52858 )
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -5.23371, 0, 3.52858 )
|
||||||
title = "Graveyard"
|
title = "Graveyard"
|
||||||
|
zoneName = "player1.graveyard"
|
||||||
|
|
||||||
[node name="Banished" parent="Cards" instance=ExtResource( 5 )]
|
[node name="Banished" parent="Cards" instance=ExtResource( 5 )]
|
||||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -5.23371, 0, 2.40401 )
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -5.23371, 0, 2.40401 )
|
||||||
title = "Banished"
|
title = "Banished"
|
||||||
|
zoneName = "player1.banished"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
extends Spatial
|
extends Area
|
||||||
|
|
||||||
class_name Card
|
class_name Card
|
||||||
|
|
||||||
|
@ -13,9 +13,11 @@ var clicked := false
|
||||||
var exhausted := false
|
var exhausted := false
|
||||||
var lifted := false
|
var lifted := false
|
||||||
var flipped := false
|
var flipped := false
|
||||||
export var cardID := ""
|
var cardID := ""
|
||||||
export var playerID := 0
|
var playerID := 0
|
||||||
export var inHand := false
|
var inHand := false
|
||||||
|
var inZone := false
|
||||||
|
var zoneName = ""
|
||||||
|
|
||||||
onready var animation := $Border/AnimationPlayer
|
onready var animation := $Border/AnimationPlayer
|
||||||
|
|
||||||
|
@ -30,6 +32,8 @@ func _input_event(camera, event, click_position, click_normal, shape_idx):
|
||||||
if clicked and event is InputEventMouseMotion:
|
if clicked and event is InputEventMouseMotion:
|
||||||
if not lifted:
|
if not lifted:
|
||||||
emit_signal("card_picked")
|
emit_signal("card_picked")
|
||||||
|
# Disable input for now
|
||||||
|
input_ray_pickable = false
|
||||||
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)
|
||||||
|
@ -37,6 +41,9 @@ func _input_event(camera, event, click_position, click_normal, shape_idx):
|
||||||
translation = Vector3(direction.x * 3.0, 0.25, -0.25)
|
translation = Vector3(direction.x * 3.0, 0.25, -0.25)
|
||||||
# Fix rotation if coming from hand
|
# Fix rotation if coming from hand
|
||||||
rotation = Vector3.ZERO
|
rotation = Vector3.ZERO
|
||||||
|
elif inZone:
|
||||||
|
translation = Vector3.ZERO
|
||||||
|
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;
|
||||||
|
@ -53,6 +60,7 @@ 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:
|
||||||
emit_signal("card_dropped")
|
emit_signal("card_dropped")
|
||||||
|
input_ray_pickable = true
|
||||||
lifted = false
|
lifted = false
|
||||||
|
|
||||||
# Check double click
|
# Check double click
|
||||||
|
|
|
@ -1,9 +1,21 @@
|
||||||
extends Spatial
|
extends Area
|
||||||
|
|
||||||
|
class_name Stack
|
||||||
|
|
||||||
|
signal hover()
|
||||||
|
signal blur()
|
||||||
|
|
||||||
export var title: String
|
export var title: String
|
||||||
|
export var zoneName: String
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
set_title(title)
|
set_title(title)
|
||||||
|
|
||||||
func set_title(title: String):
|
func set_title(title: String):
|
||||||
$LabelViewport/Label.text = title
|
$LabelViewport/Label.text = title
|
||||||
|
|
||||||
|
func _mouse_entered():
|
||||||
|
emit_signal("hover")
|
||||||
|
|
||||||
|
func _mouse_exited():
|
||||||
|
emit_signal("blur")
|
||||||
|
|
|
@ -1,21 +1,28 @@
|
||||||
[gd_scene load_steps=5 format=2]
|
[gd_scene load_steps=6 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://Scenes/Components/Stack.gd" type="Script" id=1]
|
[ext_resource path="res://Scenes/Components/Stack.gd" type="Script" id=1]
|
||||||
|
|
||||||
[sub_resource type="DynamicFontData" id=2]
|
[sub_resource type="BoxShape" id=4]
|
||||||
|
extents = Vector3( 0.424389, 0.024053, 0.546632 )
|
||||||
|
|
||||||
|
[sub_resource type="DynamicFontData" id=1]
|
||||||
font_path = "res://UIAssets/Fonts/Catamaran-Bold.ttf"
|
font_path = "res://UIAssets/Fonts/Catamaran-Bold.ttf"
|
||||||
|
|
||||||
[sub_resource type="DynamicFont" id=3]
|
[sub_resource type="DynamicFont" id=2]
|
||||||
outline_size = 2
|
outline_size = 2
|
||||||
outline_color = Color( 0, 0, 0, 0.54902 )
|
outline_color = Color( 0, 0, 0, 0.54902 )
|
||||||
font_data = SubResource( 2 )
|
font_data = SubResource( 1 )
|
||||||
|
|
||||||
[sub_resource type="ViewportTexture" id=1]
|
[sub_resource type="ViewportTexture" id=3]
|
||||||
viewport_path = NodePath("LabelViewport")
|
viewport_path = NodePath("LabelViewport")
|
||||||
|
|
||||||
[node name="Stack" type="Spatial"]
|
[node name="Stack" type="Area"]
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="CollisionShape" type="CollisionShape" parent="."]
|
||||||
|
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0239744, 0 )
|
||||||
|
shape = SubResource( 4 )
|
||||||
|
|
||||||
[node name="CSGBox" type="CSGBox" parent="."]
|
[node name="CSGBox" type="CSGBox" parent="."]
|
||||||
transform = Transform( 0.85598, 0, 0, 0, 1, 0, 0, 0, 0.871019, 0, 0, 0 )
|
transform = Transform( 0.85598, 0, 0, 0, 1, 0, 0, 0, 0.871019, 0, 0, 0 )
|
||||||
width = 0.946586
|
width = 0.946586
|
||||||
|
@ -50,11 +57,13 @@ usage = 0
|
||||||
[node name="Label" type="Label" parent="LabelViewport"]
|
[node name="Label" type="Label" parent="LabelViewport"]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
anchor_bottom = 1.0
|
anchor_bottom = 1.0
|
||||||
custom_fonts/font = SubResource( 3 )
|
custom_fonts/font = SubResource( 2 )
|
||||||
align = 1
|
align = 1
|
||||||
valign = 1
|
valign = 1
|
||||||
|
|
||||||
[node name="LabelSprite" type="Sprite3D" parent="."]
|
[node name="LabelSprite" type="Sprite3D" parent="."]
|
||||||
transform = Transform( 0.5853, 0.810817, -3.54419e-008, 0, -4.37114e-008, -1, -0.810817, 0.5853, -2.55843e-008, 1.05839e-009, 0.0298628, 7.64017e-010 )
|
transform = Transform( 0.5853, 0.810817, -3.54419e-008, 0, -4.37114e-008, -1, -0.810817, 0.5853, -2.55843e-008, 1.05839e-009, 0.0298628, 7.64017e-010 )
|
||||||
texture = SubResource( 1 )
|
texture = SubResource( 3 )
|
||||||
region_rect = Rect2( 0, 0, 30, 30 )
|
region_rect = Rect2( 0, 0, 30, 30 )
|
||||||
|
[connection signal="mouse_entered" from="." to="." method="_mouse_entered"]
|
||||||
|
[connection signal="mouse_exited" from="." to="." method="_mouse_exited"]
|
||||||
|
|
|
@ -13,21 +13,18 @@ export var mouseHandThreshold = 0.85
|
||||||
|
|
||||||
var holdingCard: Card = null
|
var holdingCard: Card = null
|
||||||
var focusedCard: Card = null
|
var focusedCard: Card = null
|
||||||
|
var currentZone: Stack = null
|
||||||
|
|
||||||
var mouseOrigin: Vector2
|
var mouseOrigin: Vector2
|
||||||
var lastCameraTransform: Transform
|
var lastCameraTransform: Transform
|
||||||
|
|
||||||
|
onready var zones: Dictionary = {
|
||||||
|
"player1.deck": $Cards/Deck,
|
||||||
|
"player1.banished": $Cards/Banished,
|
||||||
|
"player1.graveyard": $Cards/Graveyard
|
||||||
|
}
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, true)
|
|
||||||
add_card("ff36", 0, false)
|
add_card("ff36", 0, false)
|
||||||
reorder_hand()
|
reorder_hand()
|
||||||
|
|
||||||
|
@ -52,9 +49,11 @@ func _process(delta: float):
|
||||||
camera.transform.origin = lastCameraTransform.origin - Vector3(mousePos.x, 0, mousePos.y)
|
camera.transform.origin = lastCameraTransform.origin - Vector3(mousePos.x, 0, mousePos.y)
|
||||||
# If holding a card, move it between board/hand
|
# If holding a card, move it between board/hand
|
||||||
if holdingCard != null:
|
if holdingCard != null:
|
||||||
|
# Check if we're selecting our hand while holding a card
|
||||||
var relPos: Vector2 = absMousePos / get_viewport().size
|
var relPos: Vector2 = absMousePos / get_viewport().size
|
||||||
var xMargin = 1.0-HAND_SCREEN_PERC
|
var xMargin = 1.0-HAND_SCREEN_PERC
|
||||||
var selectingHand: bool = relPos.y > mouseHandThreshold and (relPos.x > xMargin/2 and relPos.x < (1.0-xMargin/2))
|
var selectingHand: bool = relPos.y > mouseHandThreshold and (relPos.x > xMargin/2 and relPos.x < (1.0-xMargin/2))
|
||||||
|
# Move card in/out hand
|
||||||
if selectingHand and not holdingCard.inHand:
|
if selectingHand and not holdingCard.inHand:
|
||||||
holdingCard.inHand = true
|
holdingCard.inHand = true
|
||||||
call_deferred("reparent", holdingCard, cards, hand)
|
call_deferred("reparent", holdingCard, cards, hand)
|
||||||
|
@ -62,6 +61,42 @@ func _process(delta: float):
|
||||||
holdingCard.inHand = false
|
holdingCard.inHand = false
|
||||||
call_deferred("reparent", holdingCard, hand, cards)
|
call_deferred("reparent", holdingCard, hand, cards)
|
||||||
|
|
||||||
|
# Move card to/from zone
|
||||||
|
if currentZone != null:
|
||||||
|
if holdingCard.inZone:
|
||||||
|
if holdingCard.zoneName != currentZone.zoneName:
|
||||||
|
# Move from old zone to new
|
||||||
|
call_deferred("reparent", holdingCard, zones[holdingCard.zoneName], currentZone)
|
||||||
|
holdingCard.zoneName = currentZone.zoneName
|
||||||
|
else:
|
||||||
|
holdingCard.inZone = true
|
||||||
|
holdingCard.zoneName = currentZone.zoneName
|
||||||
|
if holdingCard.inHand:
|
||||||
|
call_deferred("reparent", holdingCard, hand, currentZone)
|
||||||
|
else:
|
||||||
|
call_deferred("reparent", holdingCard, cards, currentZone)
|
||||||
|
elif holdingCard.inZone:
|
||||||
|
# Move from zone to hand/field
|
||||||
|
if holdingCard.inHand:
|
||||||
|
call_deferred("reparent", holdingCard, zones[holdingCard.zoneName], hand)
|
||||||
|
else:
|
||||||
|
call_deferred("reparent", holdingCard, zones[holdingCard.zoneName], cards)
|
||||||
|
holdingCard.inZone = false
|
||||||
|
holdingCard.zoneName = ""
|
||||||
|
|
||||||
|
func _physics_process(delta):
|
||||||
|
# Do some raycast magic that normal Godot events cannot get (like ignoring items)
|
||||||
|
var space_state := get_world().direct_space_state
|
||||||
|
var absMousePos := get_viewport().get_mouse_position()
|
||||||
|
var from: Vector3 = camera.project_ray_origin(absMousePos)
|
||||||
|
var to: Vector3 = from + camera.project_ray_normal(absMousePos) * 1000
|
||||||
|
var result := space_state.intersect_ray(from, to, [self, holdingCard], 0x7FFFFFFF, true, true)
|
||||||
|
if result:
|
||||||
|
if result.collider is Stack:
|
||||||
|
currentZone = result.collider
|
||||||
|
else:
|
||||||
|
currentZone = null
|
||||||
|
|
||||||
func _card_picked(card: Card):
|
func _card_picked(card: Card):
|
||||||
holdingCard = card
|
holdingCard = card
|
||||||
holdingCard.animation.play("lift")
|
holdingCard.animation.play("lift")
|
||||||
|
|
|
@ -14,14 +14,20 @@ _global_script_classes=[ {
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://Scenes/Scripts/Board.gd"
|
"path": "res://Scenes/Scripts/Board.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "Spatial",
|
"base": "Area",
|
||||||
"class": "Card",
|
"class": "Card",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://Scenes/Components/Card.gd"
|
"path": "res://Scenes/Components/Card.gd"
|
||||||
|
}, {
|
||||||
|
"base": "Area",
|
||||||
|
"class": "Stack",
|
||||||
|
"language": "GDScript",
|
||||||
|
"path": "res://Scenes/Components/Stack.gd"
|
||||||
} ]
|
} ]
|
||||||
_global_script_class_icons={
|
_global_script_class_icons={
|
||||||
"Board": "",
|
"Board": "",
|
||||||
"Card": ""
|
"Card": "",
|
||||||
|
"Stack": ""
|
||||||
}
|
}
|
||||||
|
|
||||||
[application]
|
[application]
|
||||||
|
|
Loading…
Reference in a new issue