在Godot中开发PONG:如何在屏幕高度中线两侧创建Paddle?
解决Godot PONG游戏中Paddle创建错误及屏幕尺寸获取问题
错误原因解析
- 变量定义阶段调用
get_viewport()会返回null:节点还未加入场景树时,无法获取视口实例,直接在变量初始化时写get_viewport().x/y就会触发"Invalid get index 'y' (on base: 'null instance')"错误。 - 屏幕半尺寸变量初始化时机错误:
screen_half_height、screen_half_width在变量定义时计算,此时screen_height/screen_width还未赋值,结果始终为0,导致绘制位置错误。
修正方案与完整代码
调整屏幕尺寸的获取时机,确保在节点就绪后再计算相关变量,同时补充右侧Paddle的绘制逻辑:
extends Node2D # 屏幕尺寸相关变量,先不初始化 var screen_size var screen_height var screen_width var screen_half_height var screen_half_width # Paddle配置 var paddle_color = Color.WHITE var paddle_size = Vector2(10.0, 100.0) var paddle_half_height = paddle_size.y / 2.0 var paddle_padding = 10.0 func _ready(): # 节点就绪后获取屏幕尺寸,计算半尺寸 screen_size = get_viewport().size screen_width = screen_size.x screen_height = screen_size.y screen_half_height = screen_height / 2.0 screen_half_width = screen_width / 2.0 func _draw(): # 绘制中线参考圆 draw_circle(Vector2(screen_half_width, screen_half_height), 10.0, Color.WHITE) # 左侧Paddle:距离左边缘padding,垂直居中 draw_rect( Rect2( Vector2(paddle_padding, screen_half_height - paddle_half_height), paddle_size ), paddle_color ) # 右侧Paddle:距离右边缘padding,垂直居中(需要减去Paddle自身宽度) draw_rect( Rect2( Vector2(screen_width - paddle_padding - paddle_size.x, screen_half_height - paddle_half_height), paddle_size ), paddle_color )
额外说明
如果窗口尺寸可能动态变化(比如玩家调整窗口大小),可以把屏幕尺寸的更新逻辑放到视口尺寸变化的信号回调中,确保尺寸始终准确:
func _ready(): # 监听窗口 resize 事件 get_viewport().connect("size_changed", self, "_on_viewport_resized") # 初始化一次尺寸 _on_viewport_resized() func _on_viewport_resized(): screen_size = get_viewport().size screen_width = screen_size.x screen_height = screen_size.y screen_half_height = screen_height / 2.0 screen_half_width = screen_width / 2.0 # 尺寸变化后重新绘制 queue_redraw()
内容的提问来源于stack exchange,提问作者Filipe Prazeres
相关产品推荐
相关产品推荐

