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.

来回答