我目前正在使用Godot开发我的Pong游戏项目。
一切都很顺利,但只有一个问题。
一方得分后,球卡在中间不动了。
我应该添加什么?下面是我的代码:
# Declare member variables here.
var ball
var player
var computer
var player_score = 0
var computer_score = 0
var winning_score = 5
var initial_velocity_x = 250
var initial_velocity_y = 10
# Called when the node enters the scene tree for the first time.
func _ready():
player = get_node('player')
computer = get_node('computer')
ball = get_node('ball')
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
player.position.y = get_viewport().get_mouse_position().y
computer.position.y = ball.position.y
if ball.position.x > 1024:
reset_position()
ball.linear_velocity.x = initial_velocity_x
ball.linear_velocity.y = initial_velocity_y
computer_score += 1
if ball.position.x < 0:
reset_position()
ball.linear_velocity.x = -initial_velocity_x
ball.linear_velocity.y = initial_velocity_y
player_score += 1
if player_score >= winning_score or computer_score >= winning_score:
player_score = 0
computer_score = 0
func reset_position():
ball.position.x = 512
ball.position.y = 300
我猜这个球是RigidBody2D
。
它们打算被物理引擎移动,直接移动它们(例如设置position
)可能会导致问题。这是我经常建议初学者使用KinematicBody
(2D
)的原因之一,这样他们就不会"打架"了。物理引擎。
不管怎样,这是一个逃避的答案。你想传送一个RigidBody2D
,让我们看看怎么做。
在我看来,以下是传送RigidBody2D
的难以捉摸的正确方法:
func reset_position():
Physics2DServer.body_set_state(
ball.get_rid(),
Physics2DServer.BODY_STATE_TRANSFORM,
Transform2D.IDENTITY.translated(Vector2(512, 300))
)
你基本上是在说:"嘿,物理引擎!是的,你。我要你把尸体放在这个位置。物理引擎说:"ok">
Physics2DServer
API是为高级使用而设计的,当使用节点无法完成时。因此,不适合初学者。
相反,传送RigidBody2D
最常见的解决方案是向其添加脚本。它看起来像这样:
extends RigidBody2D
var _teleport_target:Vector2
var _teleporting:bool
func _integrate_forces(state: Physics2DDirectBodyState) -> void:
if _teleporting:
state.transform.origin = _teleport_target
_teleporting = false
func teleport(position:Vector2) -> void:
_teleporting = true
_teleport_target = position
然后像这样使用:
func reset_position():
ball.teleport(Vector2(512, 300))
在这里你已经告诉物理引擎问你,如果你想改变一些东西(它会调用_integrate_forces
,如果你定义它)。有时候你的回答是让它移动身体。