detect card done
This commit is contained in:
parent
5629076291
commit
36609198d7
@ -1,7 +1,8 @@
|
|||||||
[gd_scene load_steps=5 format=4 uid="uid://bdhkwmdjla3dy"]
|
[gd_scene load_steps=6 format=4 uid="uid://bdhkwmdjla3dy"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://cvjgu1sx802tc" path="res://Scripts/GameManager.gd" id="1_r150o"]
|
[ext_resource type="Script" uid="uid://cvjgu1sx802tc" path="res://Scripts/GameManager.gd" id="1_r150o"]
|
||||||
[ext_resource type="TileSet" uid="uid://d1gtddd47nuvg" path="res://Assets/TileSets/Tilesets.tres" id="2_idj7w"]
|
[ext_resource type="TileSet" uid="uid://d1gtddd47nuvg" path="res://Assets/TileSets/Tilesets.tres" id="2_idj7w"]
|
||||||
|
[ext_resource type="FontFile" uid="uid://bnipxsg3yhkk8" path="res://Assets/Fonts/文字主题.ttf" id="3_kln2b"]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_idj7w"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_idj7w"]
|
||||||
size = Vector2(336, 450)
|
size = Vector2(336, 450)
|
||||||
@ -9,13 +10,13 @@ size = Vector2(336, 450)
|
|||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kln2b"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_kln2b"]
|
||||||
size = Vector2(48, 71)
|
size = Vector2(48, 71)
|
||||||
|
|
||||||
[node name="GameRoot" type="Node2D" node_paths=PackedStringArray("left_top_of_board", "init_card_anchos", "board_area")]
|
[node name="GameRoot" type="Node2D" node_paths=PackedStringArray("left_top_of_board", "init_card_anchos", "score_num_label")]
|
||||||
script = ExtResource("1_r150o")
|
script = ExtResource("1_r150o")
|
||||||
cols = 7
|
cols = 7
|
||||||
cell_size = Vector2i(48, 64)
|
cell_size = Vector2i(48, 64)
|
||||||
left_top_of_board = NodePath("Tiles/Board/LeftTop")
|
left_top_of_board = NodePath("Tiles/Board/LeftTop")
|
||||||
init_card_anchos = [NodePath("Tiles/Cards/Marker1"), NodePath("Tiles/Cards/Marker2"), NodePath("Tiles/Cards/Marker3"), NodePath("Tiles/Cards/Marker4")]
|
init_card_anchos = [NodePath("Tiles/Cards/Marker1"), NodePath("Tiles/Cards/Marker2"), NodePath("Tiles/Cards/Marker3"), NodePath("Tiles/Cards/Marker4")]
|
||||||
board_area = NodePath("")
|
score_num_label = NodePath("Score/ScoreNum")
|
||||||
|
|
||||||
[node name="Camera2D" type="Camera2D" parent="."]
|
[node name="Camera2D" type="Camera2D" parent="."]
|
||||||
position = Vector2(-159, -32)
|
position = Vector2(-159, -32)
|
||||||
@ -74,4 +75,22 @@ offset_bottom = 40.0
|
|||||||
|
|
||||||
[node name="Cards" type="Node2D" parent="."]
|
[node name="Cards" type="Node2D" parent="."]
|
||||||
|
|
||||||
|
[node name="Score" type="Label" parent="."]
|
||||||
|
offset_left = -400.0
|
||||||
|
offset_top = -328.0
|
||||||
|
offset_right = -64.0
|
||||||
|
offset_bottom = -272.0
|
||||||
|
theme_override_fonts/font = ExtResource("3_kln2b")
|
||||||
|
theme_override_font_sizes/font_size = 48
|
||||||
|
text = "Score:"
|
||||||
|
|
||||||
|
[node name="ScoreNum" type="Label" parent="Score"]
|
||||||
|
layout_mode = 0
|
||||||
|
offset_left = 128.0
|
||||||
|
offset_right = 336.0
|
||||||
|
offset_bottom = 56.0
|
||||||
|
theme_override_fonts/font = ExtResource("3_kln2b")
|
||||||
|
theme_override_font_sizes/font_size = 48
|
||||||
|
text = "0"
|
||||||
|
|
||||||
[connection signal="input_event" from="Tiles/Board/BoardArea" to="." method="_on_board_area_input_event"]
|
[connection signal="input_event" from="Tiles/Board/BoardArea" to="." method="_on_board_area_input_event"]
|
||||||
|
@ -26,9 +26,11 @@ var settled : bool
|
|||||||
|
|
||||||
func setup_card(category: Category, value: int) -> void:
|
func setup_card(category: Category, value: int) -> void:
|
||||||
origin_pos = global_position
|
origin_pos = global_position
|
||||||
setup_sprite()
|
self.category = category
|
||||||
|
self.value = value
|
||||||
|
setup_sprite(category, value)
|
||||||
|
|
||||||
func setup_sprite() -> void:
|
func setup_sprite(category: Category, value: int) -> void:
|
||||||
$Value.text = str(value)
|
$Value.text = str(value)
|
||||||
match category :
|
match category :
|
||||||
Category.Onion:
|
Category.Onion:
|
||||||
@ -39,6 +41,7 @@ func setup_sprite() -> void:
|
|||||||
texture_normal = carrot_texture
|
texture_normal = carrot_texture
|
||||||
Category.Bucket:
|
Category.Bucket:
|
||||||
texture_normal = bucket_texture
|
texture_normal = bucket_texture
|
||||||
|
$Value.text = ""
|
||||||
|
|
||||||
func _on_button_down() -> void:
|
func _on_button_down() -> void:
|
||||||
if !settled:
|
if !settled:
|
||||||
|
@ -5,10 +5,16 @@ extends Node
|
|||||||
@export var left_top_of_board : Marker2D
|
@export var left_top_of_board : Marker2D
|
||||||
@export var init_card_anchos : Array[Marker2D]
|
@export var init_card_anchos : Array[Marker2D]
|
||||||
|
|
||||||
@export var board_area : ReferenceRect
|
@export var score_num_label : Label
|
||||||
|
|
||||||
signal dragging_card
|
signal dragging_card
|
||||||
signal release_dragging_card
|
signal release_dragging_card
|
||||||
|
signal place_card
|
||||||
|
signal kill_cards
|
||||||
|
|
||||||
|
var score = 0
|
||||||
|
|
||||||
|
var waitting_cards_num = 4
|
||||||
|
|
||||||
var has_mouse: bool = false
|
var has_mouse: bool = false
|
||||||
var dragged_card : Card
|
var dragged_card : Card
|
||||||
@ -30,9 +36,13 @@ func _ready() -> void:
|
|||||||
init_game()
|
init_game()
|
||||||
dragging_card.connect(_on_dragging_card)
|
dragging_card.connect(_on_dragging_card)
|
||||||
release_dragging_card.connect(_on_release_dragging_card)
|
release_dragging_card.connect(_on_release_dragging_card)
|
||||||
|
place_card.connect(_on_place_card)
|
||||||
|
kill_cards.connect(_on_kill_cards)
|
||||||
|
|
||||||
func init_game() -> void:
|
func init_game() -> void:
|
||||||
board_info = create_cells()
|
board_info = create_cells()
|
||||||
|
score = 0
|
||||||
|
waitting_cards_num = init_card_anchos.size()
|
||||||
send_cards()
|
send_cards()
|
||||||
|
|
||||||
func create_cells() -> Array:
|
func create_cells() -> Array:
|
||||||
@ -76,8 +86,78 @@ func _on_dragging_card(card: Card) -> void:
|
|||||||
dragged_card = card
|
dragged_card = card
|
||||||
|
|
||||||
func _on_release_dragging_card(card: Card, index: Vector2i) -> void:
|
func _on_release_dragging_card(card: Card, index: Vector2i) -> void:
|
||||||
print(index)
|
|
||||||
dragged_card = null
|
dragged_card = null
|
||||||
|
waitting_cards_num -= 1
|
||||||
|
if waitting_cards_num == 0:
|
||||||
|
waitting_cards_num = init_card_anchos.size()
|
||||||
|
send_cards()
|
||||||
|
|
||||||
|
func _on_place_card(card: Card, index: Vector2i) -> void:
|
||||||
|
var cell_info = board_info[index.x][index.y]
|
||||||
|
var lt = cell_info[GLOBAL_LEFT_TOP]
|
||||||
|
card.global_position = lt
|
||||||
|
card.settled = true
|
||||||
|
cell_info[HOLD_CARD] = card
|
||||||
|
card.index = index
|
||||||
|
try_kill_card(index)
|
||||||
|
|
||||||
|
func try_kill_card(index: Vector2i) -> void:
|
||||||
|
var detected_cards = detect_cards(index)
|
||||||
|
if detected_cards.size() > 1:
|
||||||
|
emit_signal("kill_cards", detected_cards)
|
||||||
|
|
||||||
|
func detect_cards(index: Vector2i) -> Array[Vector2i]:
|
||||||
|
var cell_info = board_info[index.x][index.y]
|
||||||
|
var card = cell_info[HOLD_CARD]
|
||||||
|
if card == null:
|
||||||
|
return []
|
||||||
|
return _detect_cards(index, index, [])
|
||||||
|
|
||||||
|
func _detect_cards(index: Vector2i, origin_index: Vector2i, visited) -> Array[Vector2i]:
|
||||||
|
# 检查是否越界或已经访问
|
||||||
|
if index.x < 0 or index.y < 0 or index.x >= cols or index.y >= cols:
|
||||||
|
return []
|
||||||
|
if index in visited:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 标记当前格子为已访问
|
||||||
|
visited.append(index)
|
||||||
|
|
||||||
|
var cell_info = board_info[index.x][index.y]
|
||||||
|
var origin_cell_info = board_info[origin_index.x][origin_index.y]
|
||||||
|
|
||||||
|
# 如果当前格子为空(值为0),则返回空列表
|
||||||
|
if cell_info[HOLD_CARD] == null:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 当前格子含有棋子,将其加入结果
|
||||||
|
if cell_info[HOLD_CARD].category == origin_cell_info[HOLD_CARD].category and cell_info[HOLD_CARD].value == origin_cell_info[HOLD_CARD].value:
|
||||||
|
var result : Array[Vector2i] = [index]
|
||||||
|
|
||||||
|
# 检查上下左右相邻格子
|
||||||
|
var directions = [
|
||||||
|
Vector2i(0, 1), # 上
|
||||||
|
Vector2i(0, -1), # 下
|
||||||
|
Vector2i(1, 0), # 右
|
||||||
|
Vector2i(-1, 0) # 左
|
||||||
|
]
|
||||||
|
for dir in directions:
|
||||||
|
result += _detect_cards(index + dir, index, visited)
|
||||||
|
return result
|
||||||
|
return []
|
||||||
|
|
||||||
|
func _on_kill_cards(index_array: Array[Vector2i]) -> void:
|
||||||
|
print("------*****--------")
|
||||||
|
for i in index_array:
|
||||||
|
var cell_info = board_info[i.x][i.y]
|
||||||
|
var card = cell_info[HOLD_CARD] as Card
|
||||||
|
cell_info[HOLD_CARD] = null
|
||||||
|
card.index = Global.invalid_cell_index
|
||||||
|
card.queue_free()
|
||||||
|
print("kill-" + str(i) + "-" + str(cell_info))
|
||||||
|
score += 1
|
||||||
|
score_num_label.text = str(score)
|
||||||
|
print("-------------------")
|
||||||
|
|
||||||
func get_hover_cell_index() -> Vector2i:
|
func get_hover_cell_index() -> Vector2i:
|
||||||
var mouse_global_position = $MouseAnchor.get_global_mouse_position()
|
var mouse_global_position = $MouseAnchor.get_global_mouse_position()
|
||||||
@ -104,17 +184,16 @@ func clamp_cell() -> ColorRect:
|
|||||||
|
|
||||||
func send_cards() -> void:
|
func send_cards() -> void:
|
||||||
var card_prefab = load("res://Scenes/Card.tscn")
|
var card_prefab = load("res://Scenes/Card.tscn")
|
||||||
for i in range(init_card_anchos.size()):
|
for i in range(waitting_cards_num):
|
||||||
var pos = init_card_anchos[i].global_position
|
var pos = init_card_anchos[i].global_position
|
||||||
var card_instance = card_prefab.instantiate()
|
var card_instance = card_prefab.instantiate() as Card
|
||||||
var card_size = (card_instance as Card).texture_normal.get_size()
|
var card_size = (card_instance as Card).texture_normal.get_size()
|
||||||
card_instance.global_position = Vector2(pos.x - card_size.x / 2, pos.y - card_size.y / 2)
|
card_instance.global_position = Vector2(pos.x - card_size.x / 2, pos.y - card_size.y / 2)
|
||||||
var val = randi() % 10
|
var val = randi() % 9 + 1
|
||||||
var cate_num = randi() % 4
|
var cate_num = randi() % 4
|
||||||
card_instance.setup_card(cate_num, val)
|
card_instance.setup_card(cate_num, val)
|
||||||
$Cards.add_child(card_instance)
|
$Cards.add_child(card_instance)
|
||||||
|
|
||||||
|
|
||||||
func _on_board_area_input_event(viewport: Node, event: InputEvent, shape_idx: int) -> void:
|
func _on_board_area_input_event(viewport: Node, event: InputEvent, shape_idx: int) -> void:
|
||||||
if event is InputEventMouseButton:
|
if event is InputEventMouseButton:
|
||||||
if event.button_index == MOUSE_BUTTON_LEFT:
|
if event.button_index == MOUSE_BUTTON_LEFT:
|
||||||
@ -127,8 +206,5 @@ func try_place_card(card: Card) -> void:
|
|||||||
return
|
return
|
||||||
var cell_info = board_info[index.x][index.y]
|
var cell_info = board_info[index.x][index.y]
|
||||||
if cell_info[HOLD_CARD] == null:
|
if cell_info[HOLD_CARD] == null:
|
||||||
var lt = cell_info[GLOBAL_LEFT_TOP]
|
|
||||||
card.global_position = lt
|
|
||||||
card.settled = true
|
|
||||||
cell_info[HOLD_CARD] = card
|
|
||||||
emit_signal("release_dragging_card", card, index)
|
emit_signal("release_dragging_card", card, index)
|
||||||
|
emit_signal("place_card", card, index)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user