【杂谈】Godot4.4 对象池(附脚本)

学博而后可约,事历而后知要。

一、展示

这是一个发射球的游戏,发射出的球每过1.5秒又被回收到对象池,等待玩家下一次发射。

请添加图片描述

二、什么是对象池

所以,对象池就像个收纳盒,用的时候,拿出来,不用的时候放回去。无论玩家在游戏中打死多少怪物,亦或者发射多少子弹,游戏都不会因为内存不够而卡死,因为玩家只是打死了同一批怪物,发射了同一批的子弹。

对象存在
池为空
禁用并重置
对象池
取出对象
激活对象
创建新对象
场景中使用
归还对象

三、对象池脚本

class_name ObjectPool
extends Node

# scene是对象池里面要放的东西,比如说子弹或者怪物
@export var scene: PackedScene
# 对象池
var object_pool: Array[Node2D]


# 把死亡的怪物或者到时间的子弹,添加到对象池
func add_to_pool(object: Node2D) ->void:
	object_pool.append(object)
	#彻底禁用整个节点及其子节点的所有处理逻辑(包括输入、_process、_physics_process 等)
	object.process_mode = Node.PROCESS_MODE_DISABLED
	object.hide()
	

# 从对象池中取怪物或者子弹出来
func pull_from_pool() ->Node2D:
	var object: Node2D
	if object_pool.is_empty():
		object = scene.instantiate() # 对象池里没对象就创建一个
	else:
		object = object_pool.pop_front() # 有就弹出对象池中的第一个对象
	
	object.process_mode = Node.PROCESS_MODE_INHERIT
	object.show()
	
	if not object.is_inside_tree():  # 确保已移出场景树的节点重新加入
		get_parent().add_child(object) # 根据需要自行修改在哪里放子节点!
	return object

Godot 4.4 中,使用脚本移动节点通常涉及对节点的 `position` 属性进行操作。可以通过 GDScript 来实现对节点位置的动态控制。以下是一个基础示例,展示如何通过脚本移动一个 `Node2D` 类型的节点: ```gdscript extends Node2D # 移动速度(像素/帧) @export var speed: float = 200.0 func _process(delta: float) -> void: # 定义移动方向(例如:向右上方移动) var direction = Vector2.RIGHT.rotated(rotation) # 根据当前旋转方向移动 # 计算新的位置 position += direction * speed * delta ``` 在上述代码中,`position` 属性用于控制节点的坐标位置,`delta` 是帧时间,用于确保移动速度与帧率无关。通过调整 `direction` 和 `speed`,可以控制节点的移动方向和速度。 如果需要根据输入控制节点移动,可以使用 `Input` 类来检测按键并更新位置: ```gdscript extends Node2D @export var speed: float = 200.0 func _process(delta: float) -> void: var movement = Vector2.ZERO if Input.is_action_pressed("ui_right"): movement.x += 1 if Input.is_action_pressed("ui_left"): movement.x -= 1 if Input.is_action_pressed("ui_down"): movement.y += 1 if Input.is_action_pressed("ui_up"): movement.y -= 1 position += movement * speed * delta ``` 在此示例中,通过 `Input.is_action_pressed()` 方法检测用户是否按下方向键,并根据输入更新 `movement` 向量,从而控制节点的移动方向和速度。 对于更复杂的运动逻辑,例如基于物理的运动,可以使用 `move_and_slide()` 方法,该方法适用于处理碰撞检测和滑动响应: ```gdscript extends CharacterBody2D @export var speed: float = 200.0 func _physics_process(delta: float) -> void: var velocity = Vector2.ZERO if Input.is_action_pressed("ui_right"): velocity.x += 1 if Input.is_action_pressed("ui_left"): velocity.x -= 1 if Input.is_action_pressed("ui_down"): velocity.y += 1 if Input.is_action_pressed("ui_up"): velocity.y -= 1 velocity = velocity.normalized() * speed move_and_slide() ``` 此代码使用 `CharacterBody2D` 作为基类,并在其 `_physics_process()` 方法中处理物理更新。通过 `move_and_slide()` 方法,可以实现带有碰撞检测的平滑移动效果[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ForBigData

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值