mold 内嵌 oneTBB 的 fixed_pool 类深度解析:在定长缓冲区上构建可扩展内存池
2026/9/14 21:17:41
extends Node class_name HealthComponent signal health_changed(current: int, maximum: int) signal damaged(amount: int, source: Node) signal healed(amount: int) signal died @export var max_health: int = 100 @export var invincible_after_hit: bool = true @export var invincible_duration: float = 0.5 var health: int var is_invincible: bool = false func _ready() -> void: health = max_health func take_damage(amount: int, source: Node = null) -> void: if is_invincible or health <= 0: return health = clampi(health - amount, 0, max_health) damaged.emit(amount, source) health_changed.emit(health, max_health) if invincible_after_hit: start_invincibility() if health <= 0: died.emit() func heal(amount: int) -> void: if health <= 0: return health = clampi(health + amount, 0, max_health) healed.emit(amount) health_changed.emit(health, max_health) func start_invincibility() -> void: is_invincible = true await get_tree().create_timer(invincible_duration).timeout is_invincible = false func get_health_percentage() -> float: return float(health) / max_healthextends Area2D class_name InteractionComponent signal interacted(interactor: Node2D) @export var interaction_text: String = "按 E 交互" @export var requires_line_of_sight: bool = false var can_interact: bool = false var current_interactor: Node2D = null func _ready() -> void: body_entered.connect(_on_body_entered) body_exited.connect(_on_body_exited) func _on_body_entered(body: Node2D) -> void: if body.is_in_group("player"): can_interact = true current_interactor = body show_interaction_prompt() func _on_body_exited(body: Node2D) -> void: if body == current_interactor: can_interact = false current_interactor = null hide_interaction_prompt() func interact() -> void: if can_interact: interacted.emit(current_interactor) func show_interaction_prompt() -> void: # 显示交互提示 UI pass func hide_interaction_prompt() -> void: # 隐藏交互提示 UI passextends Area2D class_name CollectComponent signal collected(item_data: Dictionary) @export var item_type: String = "coin" @export var item_value: int = 1 @export var auto_collect: bool = true @export var magnet_range: float = 0.0 # 磁铁吸引范围 var is_collected: bool = false func _ready() -> void: body_entered.connect(_on_body_entered) func _on_body_entered(body: Node2D) -> void: if is_collected: return if body.is_in_group("player"): collect(body) func collect(collector: Node2D) -> void: is_collected = true collected.emit({"type": item_type, "value": item_value}) # 收集动画 var tween := create_tween() tween.tween_property(self, "global_position", collector.global_position, 0.2) tween.tween_property(self, "scale", Vector2.ZERO, 0.1) tween.tween_callback(queue_free)res:// ├── scenes/ │ ├── characters/ │ │ ├── player/ │ │ │ ├── player.tscn │ │ │ └── player.gd │ │ └── enemies/ │ │ ├── slime/ │ │ └── boss/ │ ├── levels/ │ │ ├── level_01.tscn │ │ └── level_02.tscn │ ├── ui/ │ │ ├── hud.tscn │ │ ├── main_menu.tscn │ │ └── components/ │ │ ├── health_bar.tscn │ │ └── dialog_box.tscn │ └── effects/ │ ├── explosion.tscn │ └── hit_spark.tscn ├── scripts/ │ ├── components/ # 可复用组件 │ │ ├── health_component.gd │ │ ├── hitbox_component.gd │ │ └── interaction_component.gd │ ├── systems/ # 游戏系统 │ │ ├── save_manager.gd │ │ ├── event_bus.gd │ │ └── audio_manager.gd │ └── resources/ # 自定义资源 │ ├── player_stats.gd │ └── enemy_data.gd ├── assets/ │ ├── sprites/ │ │ ├── characters/ │ │ ├── tiles/ │ │ └── ui/ │ ├── audio/ │ │ ├── bgm/ │ │ ├── sfx/ │ │ └── voice/ │ ├── fonts/ │ └── shaders/ ├── resources/ # .tres 资源文件 │ ├── stats/ │ ├── themes/ │ └── tilesets/ └── addons/ # 插件# 命名规范 # - 变量/函数:snake_case # - 类名:PascalCase # - 常量:UPPER_SNAKE_CASE # - 信号:snake_case(动词过去式) # - 私有变量:_前缀 # 文件头部注释 # player.gd - 玩家角色控制器 # 负责:移动、跳跃、攻击、受伤 extends CharacterBody2D class_name Player # === 信号 === signal health_changed(current: int, maximum: int) # === 常量 === const JUMP_BUFFER_TIME: float = 0.1 const COYOTE_TIME: float = 0.12 # === 导出变量 === @export_group("Movement") @export var speed: float = 300.0 @export var jump_force: float = -500.0 # === 私有变量 === var _is_jumping: bool = false var _coyote_timer: float = 0.0 # === 节点引用 === @onready var _sprite: AnimatedSprite2D = $AnimatedSprite2D @onready var _health: HealthComponent = $HealthComponent # === 生命周期 === func _ready() -> void: _health.died.connect(_on_died) func _physics_process(delta: float) -> void: _handle_movement(delta) _handle_jump(delta) _update_animation() move_and_slide() # === 私有方法 === func _handle_movement(delta: float) -> void: var input_dir := Input.get_axis("move_left", "move_right") velocity.x = input_dir * speed func _handle_jump(delta: float) -> void: pass func _update_animation() -> void: pass # === 回调 === func _on_died() -> void: pass# ✅ 推荐:始终使用静态类型 var health: int = 100 var speed: float = 300.0 var enemies: Array[Node2D] = [] @onready var sprite: Sprite2D = $Sprite2D # ✅ 使用类型推断 var health := 100 var pos := Vector2.ZERO # ✅ 函数参数和返回值标注 func take_damage(amount: int, source: Node = null) -> void: pass func get_nearest_enemy() -> Node2D: return null # ❌ 避免:无类型 var health = 100 func take_damage(amount, source): pass