mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-07-10 12:02:54 +08:00
refactor(Statemachine): 优化实体和物品掉落管理逻辑
重构 EntityBase 的 mobCount 方法为 getMobs 以返回完整列表 在 WorldManager 中添加 canNextWave 方法检查怪物和可收集物品 优化 ItemDropped 的玩家查找和收集条件判断逻辑
This commit is contained in:
@@ -489,5 +489,5 @@ static func generate(
|
|||||||
if addToWorld:
|
if addToWorld:
|
||||||
WorldManager.rootNode.spawn(instance)
|
WorldManager.rootNode.spawn(instance)
|
||||||
return instance
|
return instance
|
||||||
static func mobCount():
|
static func getMobs():
|
||||||
return len(WorldManager.tree.get_nodes_in_group("mobs"))
|
return WorldManager.tree.get_nodes_in_group("mobs")
|
||||||
|
|||||||
@@ -21,12 +21,10 @@ func _ready():
|
|||||||
func _process(_delta):
|
func _process(_delta):
|
||||||
texture.texture = ItemStore.getTexture(item)
|
texture.texture = ItemStore.getTexture(item)
|
||||||
func _physics_process(_delta):
|
func _physics_process(_delta):
|
||||||
if !is_instance_valid(targetPlayer):
|
|
||||||
targetPlayer = EntityTool.findClosetPlayer(position, WorldManager.tree)
|
|
||||||
if is_instance_valid(targetPlayer):
|
if is_instance_valid(targetPlayer):
|
||||||
if collecting:
|
if collecting:
|
||||||
linear_velocity = Vector2.ZERO
|
linear_velocity = Vector2.ZERO
|
||||||
elif targetPlayer.inventoryMax[item] > targetPlayer.inventory[item]:
|
elif canICollect():
|
||||||
var direction = (targetPlayer.position - position).normalized()
|
var direction = (targetPlayer.position - position).normalized()
|
||||||
var speed = 1000.0 * targetPlayer.fields.get(FieldStore.Entity.GRAVITY) / ((targetPlayer.position - position).length() ** (1 / 3.0))
|
var speed = 1000.0 * targetPlayer.fields.get(FieldStore.Entity.GRAVITY) / ((targetPlayer.position - position).length() ** (1 / 3.0))
|
||||||
apply_central_force(direction * speed)
|
apply_central_force(direction * speed)
|
||||||
@@ -37,12 +35,20 @@ func _physics_process(_delta):
|
|||||||
else:
|
else:
|
||||||
targetPlayer.collectItem(item, stackCount)
|
targetPlayer.collectItem(item, stackCount)
|
||||||
collect()
|
collect()
|
||||||
|
else:
|
||||||
|
refindPlayer()
|
||||||
|
else:
|
||||||
|
refindPlayer()
|
||||||
|
|
||||||
|
func canICollect():
|
||||||
|
return targetPlayer.inventoryMax[item] > targetPlayer.inventory[item]
|
||||||
func collect():
|
func collect():
|
||||||
collecting = true
|
collecting = true
|
||||||
animator.play("collect")
|
animator.play("collect")
|
||||||
await animator.animation_finished
|
await animator.animation_finished
|
||||||
queue_free()
|
queue_free()
|
||||||
|
func refindPlayer():
|
||||||
|
targetPlayer = EntityTool.findClosetPlayer(position, get_tree())
|
||||||
|
|
||||||
static func generate(
|
static func generate(
|
||||||
itemType: ItemStore.ItemType,
|
itemType: ItemStore.ItemType,
|
||||||
@@ -56,4 +62,15 @@ static func generate(
|
|||||||
instance.position = spawnPosition
|
instance.position = spawnPosition
|
||||||
if addToWorld:
|
if addToWorld:
|
||||||
WorldManager.rootNode.call_deferred("add_child", instance)
|
WorldManager.rootNode.call_deferred("add_child", instance)
|
||||||
|
instance.add_to_group("drops")
|
||||||
return instance
|
return instance
|
||||||
|
static func getDrops() -> Array[ItemDropped]:
|
||||||
|
return WorldManager.tree.get_nodes_in_group("drops") as Array[ItemDropped]
|
||||||
|
static func getDropsCanCollet() -> Array[ItemDropped]:
|
||||||
|
var result: Array[ItemDropped] = []
|
||||||
|
for drop in getDrops():
|
||||||
|
if drop.canICollect():
|
||||||
|
result.append(drop)
|
||||||
|
return result
|
||||||
|
static func itemCount():
|
||||||
|
return len(getDrops())
|
||||||
|
|||||||
@@ -15,13 +15,15 @@ func _ready():
|
|||||||
spawner.spawn_function = justReturn
|
spawner.spawn_function = justReturn
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
runningTime += delta * 1000
|
runningTime += delta * 1000
|
||||||
if EntityBase.mobCount() == 0 and runningTime > 1000:
|
if canNextWave() and runningTime > 1000:
|
||||||
UIState.setPanel("MakeFeed")
|
UIState.setPanel("MakeFeed")
|
||||||
|
|
||||||
@rpc("authority")
|
@rpc("authority")
|
||||||
func nextWave(waves: Array):
|
func nextWave(waves: Array):
|
||||||
Wave.next(waves)
|
Wave.next(waves)
|
||||||
|
|
||||||
|
func canNextWave():
|
||||||
|
return len(EntityBase.getMobs()) == 0 and len(ItemDropped.getDropsCanCollet()) == 0
|
||||||
func spawnWave():
|
func spawnWave():
|
||||||
var waves = Wave.spawn()
|
var waves = Wave.spawn()
|
||||||
nextWave(waves)
|
nextWave(waves)
|
||||||
@@ -34,7 +36,6 @@ func spawn(node: Node):
|
|||||||
else:
|
else:
|
||||||
add_child(node)
|
add_child(node)
|
||||||
func justReturn(data):
|
func justReturn(data):
|
||||||
print(ArrayTool.parseEncodedObject(data))
|
|
||||||
return ArrayTool.parseEncodedObject(data)[0]
|
return ArrayTool.parseEncodedObject(data)[0]
|
||||||
|
|
||||||
static func getTime():
|
static func getTime():
|
||||||
|
|||||||
Reference in New Issue
Block a user