Godot Pong 每场比赛后重播
Godot Pong Replay After Every Game
我目前正在使用 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
)的原因之一,这样他们就不会和物理引擎“打架”了。
无论如何,这是一个 cop-out 的答案。你想传送一个RigidBody2D
,让我们看看怎么做。
以下是 - 在我看来 - 传送 RigidBody2D
的难以捉摸的正确方法:
func reset_position():
Physics2DServer.body_set_state(
ball.get_rid(),
Physics2DServer.BODY_STATE_TRANSFORM,
Transform2D.IDENTITY.translated(Vector2(512, 300))
)
你基本上是在说:“嘿,物理引擎!是的,你。我要你把 body 放在这个位置。”物理引擎会说:“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
)。偶尔你通过告诉它移动 body.
来回答
我目前正在使用 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
)的原因之一,这样他们就不会和物理引擎“打架”了。
无论如何,这是一个 cop-out 的答案。你想传送一个RigidBody2D
,让我们看看怎么做。
以下是 - 在我看来 - 传送 RigidBody2D
的难以捉摸的正确方法:
func reset_position():
Physics2DServer.body_set_state(
ball.get_rid(),
Physics2DServer.BODY_STATE_TRANSFORM,
Transform2D.IDENTITY.translated(Vector2(512, 300))
)
你基本上是在说:“嘿,物理引擎!是的,你。我要你把 body 放在这个位置。”物理引擎会说:“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
)。偶尔你通过告诉它移动 body.