可交互对象
最后更新于
最后更新于
// 捡起垃圾可获得硬币 :D
Trash :: class : Interactable {
coins: s64 @ao_serialize;
used: bool;
ao_start :: method() {
this->set_listener(this);
this->set_text("捡起垃圾");
this->set_hold_text("正在捡起...");
required_hold_time = 0.25;
radius = 1.25;
}
can_use :: method(player: Player) -> bool {
if used return false;
return true;
}
on_interact :: method(player: Player) {
used = true;
Economy.deposit_currency(player, "Coins", coins);
entity->destroy();
}
}Grow_Button :: class : Interactable {
scale_multiplier: float @ao_serialize;
used: bool;
ao_start :: method() {
this->set_listener(this);
this->set_text("放大");
radius = 1.25;
required_hold_time = 0;
}
can_use :: method(player: Player) -> bool {
return !used;
}
on_interact :: method(player: Player) {
used = true;
new_scale := entity.local_scale * scale_multiplier;
entity->set_local_scale(new_scale);
this->set_text("已使用");
}
}Buy_Admin_Pass :: class : Interactable {
product_id: string @ao_serialize;
ao_start :: method() {
this->set_listener(this);
this->set_text("购买管理员通行证");
radius = 1.25;
}
can_use :: method(player: Player) -> bool {
// 示例门控:如果已拥有则隐藏(游戏通行证)
return !Purchasing.owns_product(player, product_id);
}
on_interact :: method(player: Player) {
Purchasing.prompt_purchase(player, product_id);
}
}Interactable :: class : Component {
// 提示文本(点击交互)
get_text :: method() -> string;
set_text :: method(text: string);
// 持续按住时的提示文本(用于按住交互)
get_hold_text :: method() -> string;
set_hold_text :: method(text: string);
// 连接一个实现了以下方法的监听器对象:
// - can_use(player: Player) -> bool
// - on_interact(player: Player)
// - on_holding(player: Player) [可选]
set_listener :: method(new_listener: Component);
// 常用字段(在编辑器或代码中设置)
prompt_offset: v2;
radius: float;
required_hold_time: float;
priority: s64;
}Player :: class : Player_Base {
ao_can_use_interactable :: method(interactable: Interactable) -> bool {
return true;
}
ao_on_interactable_used :: method(interactable: Interactable) {
}
ao_on_holding_interactable :: method(interactable: Interactable) {
}
}