Skip to content

Commit f2f4335

Browse files
committed
Make Segments handle dragging and swiping
Fixes #29 Have only one (1) touchzone per piece And simplifies the code to boot
2 parents f6466c8 + faad7a2 commit f2f4335

File tree

8 files changed

+85
-92
lines changed

8 files changed

+85
-92
lines changed

Game.gd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,8 @@ func nail_player():
305305
######################################
306306
#
307307
# Called when user starts dragging a piece.
308-
func piece_being_dragged():
308+
# param piece is not needed except for function whatstheword? function matching? Fixes #26
309+
func piece_being_dragged(piece):
309310
stop_gravity_timer() # level timer still going
310311

311312
######################################

GameSwipeDetector.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ var swipe_array = [] # the pieces in the swipe
88
var swipe_shape = null # will animate shape user swiped
99
var wasted_swipes = 0 # count against score
1010
var Game # will point to GameNode
11-
enum SwipeState {IDLE, SWIPE = 5, DRAG} # how should _input_event respond
11+
var SwipeState = preload("res://enums/SwipeState.gd")
1212
var swipe_state = SwipeState.SWIPE
1313
var dragging_piece = null # when dragging a piece, this will refer to it
1414

enums/SwipeOptions.gd

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# used by Segment
2+
3+
enum SwipeOptions {CANNOT, CAN_SWIPE = 9, CAN_DRAG} # can Swipe or Drag be activated? Shadows CANNOT!

enums/SwipeState.gd

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# used by GameSwipeDetector and Segment
2+
3+
enum SwipeState {IDLE, SWIPE = 5, DRAG} # how should _input_event respond

subscenes/Player.gd

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
extends Node
1717

1818
const Segment = preload("res://tiles/Segment.tscn")
19-
const PlayerArea = preload("res://tiles/PlayerArea2D.tscn")
2019

2120
var mytile = null # visible in queue, while moving, when nailed
2221
var myshadow = null # only visible when moving
@@ -54,11 +53,9 @@ func set_draggable(candrag):
5453
func set_player_position(player_position):
5554
my_position = player_position
5655
mytile.set_position(Helpers.slot_to_pixels(player_position))
57-
if nailed:
58-
mytouchzone.set_position(Helpers.slot_to_pixels(player_position))
59-
else:
56+
if not nailed:
57+
# TODO make Helpers.shadowheight or column height
6058
myshadow.set_position(Helpers.slot_to_pixels(Vector2(player_position.x, column_height(player_position.x)))) ## shadow
61-
# var shadowsprite = myshadow.get_node("TileSprite")
6259
if myshadow != null:
6360
if should_show_shadow:
6461
myshadow.show()
@@ -68,23 +65,13 @@ func set_player_position(player_position):
6865
# player has been nailed so it should animate or whatever
6966
func nail_player():
7067
# now that we are nailed, we cannot be dragged
71-
set_draggable(false)
72-
# now that we are nailed, we are touchable
73-
mytouchzone = PlayerArea.instance()
74-
mytouchzone.set_tile_type(tile_type)
75-
mytouchzone.become_swipable()
76-
mytouchzone.set_position(Helpers.slot_to_pixels(my_position))
77-
mytouchzone.set_process_input(true)
78-
mytouchzone.set_pickable(true)
79-
add_child(mytouchzone)
80-
print(mytouchzone.position)
81-
print(mytouchzone.global_position)
68+
mytile.set_draggable(false)
69+
mytile.set_swipeable(true)
8270

8371
# now that we are nailed, we have no shadow
8472
myshadow.queue_free()
8573
nailed = true
86-
pass
87-
74+
8875
func column_height(column):
8976
var height = Helpers.slots_down-1
9077
for i in range(Helpers.slots_down-1,0,-1):
@@ -124,5 +111,4 @@ func level_ended():
124111
func remove_yourself():
125112
remove_from_group("players")
126113
Helpers.board[my_position] = null
127-
mytouchzone.queue_free()
128114
mytile.start_swipe_effect() # release yourself

tiles/PlayerArea2D.gd

Lines changed: 0 additions & 59 deletions
This file was deleted.

tiles/Segment.gd

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,18 @@ extends Sprite
1717

1818
signal drag_started(piece)
1919
signal drag_ended
20+
signal clicked(piece)
21+
signal unclicked
22+
signal entered(piece)
23+
signal exited
2024

25+
var tile_type
2126
var sprite_loc = []
22-
var draggable = false # cannot drag unless is Player.mytile and is active in play area
23-
var dragging = false # if true, means mouse is actively dragging
27+
var SwipeOptions = preload("res://enums/SwipeOptions.gd")
28+
var swipe_options = SwipeOptions.CANNOT
29+
30+
var SwipeState = preload("res://enums/SwipeState.gd")
31+
var swipe_state = SwipeState.IDLE
2432

2533
const wd = 100.0 # width of each sprite image in items.png
2634
const ht = 100.0 # height of each sprite images in items.png
@@ -30,6 +38,10 @@ func _ready():
3038
self.connect("drag_started", get_node("/root/GameNode2D/GameSwipeDetector"), "piece_being_dragged")
3139
self.connect("drag_ended", get_node("/root/GameNode2D"), "piece_done_dragged")
3240
self.connect("drag_ended", get_node("/root/GameNode2D/GameSwipeDetector"), "piece_done_dragged")
41+
self.connect("clicked", get_node("/root/GameNode2D/GameSwipeDetector"), "piece_clicked")
42+
self.connect("unclicked", get_node("/root/GameNode2D/GameSwipeDetector"), "piece_unclicked")
43+
self.connect("entered", get_node("/root/GameNode2D/GameSwipeDetector"), "piece_entered")
44+
self.connect("exited", get_node("/root/GameNode2D/GameSwipeDetector"), "piece_exited")
3345

3446
func _init():
3547
# within the image map, these are the locations of the tiles
@@ -43,10 +55,10 @@ func _init():
4355
sprite_loc.push_back(Rect2(6 * wd, 0, wd, ht)); # dog?
4456

4557
func set_tile_type(my_tile_type):
46-
var icon = my_tile_type # Fack figure out Database later TileDatabase.get_item_sprite(my_type_ordinal)
58+
self.tile_type = my_tile_type # TODO: figure out Database later TileDatabase.get_item_sprite(my_type_ordinal)
4759
set_texture(preload("res://images/items.png")) # res://images/items.png is a spritesheet
4860
set_region(true) # we want a small part of it
49-
set_region_rect(sprite_loc[icon]) # this is the part we want
61+
set_region_rect(sprite_loc[self.tile_type]) # this is the part we want
5062
set_scale(Vector2(G.SLOT_SIZE/wd,G.SLOT_SIZE/ht))
5163

5264
# This will be called by GameScene
@@ -58,7 +70,17 @@ func start_swipe_effect():
5870

5971
# only the Player tiles will be set draggable (not the shadows)
6072
func set_draggable(candrag):
61-
self.draggable = candrag
73+
if candrag:
74+
self.swipe_options = SwipeOptions.CAN_DRAG
75+
else:
76+
self.swipe_options = SwipeOptions.CANNOT
77+
78+
# this is set by Player
79+
func set_swipeable(canswipe):
80+
if canswipe:
81+
self.swipe_options = SwipeOptions.CAN_SWIPE
82+
else:
83+
self.swipe_options = SwipeOptions.CANNOT
6284

6385
func is_shadow():
6486
set_modulate(Color(1,1,1, 0.3))
@@ -77,17 +99,50 @@ func darken():
7799

78100

79101
func _on_Area2D_input_event( viewport, event, shape_idx ):
80-
if not draggable:
81-
return
82-
102+
match swipe_options:
103+
SwipeOptions.CANNOT:
104+
return
105+
SwipeOptions.CAN_DRAG:
106+
_on_Segment_can_drag(event)
107+
SwipeOptions.CAN_SWIPE:
108+
_on_Segment_can_swipe(event)
109+
110+
func _on_Segment_can_drag(event):
83111
if event is InputEventScreenTouch or event is InputEventMouseButton:
84112
if event.pressed:
85-
dragging = true
113+
swipe_state = SwipeState.DRAG
86114
# need to tell Game to stop gravity
87115
emit_signal("drag_started", self)
88116
else: # not event.pressed:
89117
emit_signal("drag_ended", Helpers.pixels_to_slot(position))
90118
# need to tell Game to start gravity
91-
dragging = false
92-
if dragging:
93-
position = get_viewport().get_mouse_position()
119+
swipe_state = SwipeState.IDLE
120+
121+
func _on_Segment_can_swipe(event):
122+
print("swipe seg clicked or unclicked")
123+
if swipe_options != SwipeOptions.CAN_SWIPE:
124+
print("but not swipable (wtf how did we get past gateway func)")
125+
return
126+
if event is InputEventScreenTouch or event is InputEventMouseButton:
127+
if event.pressed:
128+
print("swipe seg clicked")
129+
emit_signal("clicked", Helpers.pixels_to_slot(get_position()), self.tile_type)
130+
else: # not event.pressed:
131+
print("swipe seg unclicked")
132+
emit_signal("unclicked")
133+
134+
135+
func _on_Segment_mouse_entered():
136+
print("segment entered")
137+
if swipe_options != SwipeOptions.CAN_SWIPE:
138+
print("but not swipeable")
139+
return
140+
emit_signal("entered", Helpers.pixels_to_slot(get_position()), self.tile_type)
141+
142+
func _on_Segment_mouse_exited():
143+
print("segment exited")
144+
if swipe_options != SwipeOptions.CAN_SWIPE:
145+
print("but not swipeable")
146+
return
147+
emit_signal("exited", Helpers.pixels_to_slot(get_position()), self.tile_type)
148+

tiles/Segment.tscn

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@ shape = SubResource( 1 )
3030

3131
[connection signal="input_event" from="Area2D" to="." method="_on_Area2D_input_event"]
3232

33+
[connection signal="mouse_entered" from="Area2D" to="." method="_on_Segment_mouse_entered"]
34+
35+
[connection signal="mouse_exited" from="Area2D" to="." method="_on_Segment_mouse_exited"]
36+
3337

0 commit comments

Comments
 (0)