三行代码  ›  专栏  ›  技术社区  ›  all ng

每场比赛后都会重播Godot Pong

  •  1
  • all ng  · 技术社区  · 2 月前

    我目前正在使用Godot进行我的乒乓球游戏项目。

    一切正常,但只有一个问题。

    一方得分后,球被夹在中间而不起作用。

    我应该补充什么?这是我的代码:

    # 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
    
    1 回复  |  直到 2 月前
        1
  •  0
  •   Theraot    2 月前

    我猜这个球是 RigidBody2D .

    它们将由物理引擎移动,并直接移动(例如设置 position )可能会引起问题。这也是我经常建议初学者使用的原因之一 KinematicBody ( 2D )所以他们不是在“对抗”物理引擎。

    不管怎样,这是一个逃避的答案。你想传送一个 刚体2d ,让我们看看怎么做。


    以下是——在我看来——传送一颗行星的难以捉摸的正确方法 刚体2d :

    func reset_position():
        Physics2DServer.body_set_state(
            ball.get_rid(),
            Physics2DServer.BODY_STATE_TRANSFORM,
            Transform2D.IDENTITY.translated(Vector2(512, 300))
        )
    

    你基本上是在说:“嘿,物理引擎!是的,你。我想让你把身体放在这个位置。”物理引擎会说:“好的”。

    这个 Physics2DServer API是为高级使用而设计的,当使用节点不起作用时。因此,不适合初学者。


    相反,最常见的解决方案是传送 刚体2d 包括向其中添加脚本。看起来是这样的:

    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 如果你定义它)。偶尔你会告诉它移动身体。

    推荐文章