《戈多乒乓》每场比赛后回放



我目前正在使用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,如果你定义它)。有时候你的回答是让它移动身体。

最新更新