Почему camera2d не работает в сети Godot? - PullRequest
0 голосов
/ 15 марта 2020

Так что после некоторого жесткого кодирования мне удалось подключить плееры к моему серверу, но после того, как я настроил camera2d для отслеживания текущего игрока, все пошло не так. мои логики c over neworking:
1 - у меня есть лобби, где пэры и хосты увидят их с первого взгляда.
2 - если вы хозяин, вы ждете, пока другой игрок присоединится, и когда он / она присоединится, вы можете играть с ним / ней.
3 - если вы равноправны, то вам нужен хост-сервер, и как только вы присоединитесь, вы сможете играть.
4 - отправить информацию по серверу с использованием протокола TCP и команды rp c
Код моего лобби:

`extends Node2D`

`func _ready():
    get_tree().connect("network_peer_connected", self, "_player_connected")`

`func _player_connected(id):
    print("Player connected to server!")
    #Game on!
    globals.otherPlayerId = id
    var game = preload("res://Game.tscn").instance()
    get_tree().get_root().add_child(game)
    hide()`

`func _on_buttonHost_pressed():
    print("Hosting network")
    var host = NetworkedMultiplayerENet.new()
    var res = host.create_server(4242,2)
    if res != OK:
        print("Error creating server")
        return`

    $buttonJoin.hide()
    $buttonHost.disabled = true
    get_tree().set_network_peer(host)



func _on_buttonJoin_pressed():
    print("Joining network")
    var host = NetworkedMultiplayerENet.new()
    host.create_client("127.0.0.1",4242)
    get_tree().set_network_peer(host)
    $buttonHost.hide()
    $buttonJoin.disabled = true
`


Код обработчика моего сервера:

`extends Node2D`

`func _ready():
  #First create ourself
    var thisPlayer = preload("res://Player.tscn").instance()
    thisPlayer.set_name(str(get_tree().get_network_unique_id()))
    thisPlayer.set_network_master(get_tree().get_network_unique_id())
    add_child(thisPlayer)`

  `#Now create the other player`
`   var otherPlayer = preload("res://Player.tscn").instance()
    otherPlayer.set_name(str(globals.otherPlayerId))
    otherPlayer.set_network_master(globals.otherPlayerId)
    add_child(otherPlayer)`


код моего игрока (отправителя информации):

`
extends KinematicBody2D`

`const TARGET_FPS = 60
const ACCELERATION = 8
const MAX_SPEED = 64
const FRICTION = 10
const AIR_RESISTANCE = 1
const GRAVITY = 4
const JUMP_FORCE = 140
const MAX_DASH = 500
const wallstop = -1`

`var jumpcount = 0
export var extrajump = 1
var dashcount = 0
export var extradash = 1
var motion = Vector2.ZERO`

`onready var raycastright = $raycastright
onready var raycastleft = $raycastleft
onready var sprite = $Sprite
onready var animationPlayer = $AnimationPlayer
onready var goleft = $Sprite2
onready var goright = $Sprite3`

`puppet func setPosition(pos):
  position = pos`

`master func shutItDown():
  #Send a shutdown command to all connected clients, including this one
  rpc("shutDown")`

`sync func shutDown():
  get_tree().quit()`

`func _physics_process(delta):
    if(is_network_master()):
        var x_input = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
        if x_input != 0:
            animationPlayer.play("run")
            motion.x += x_input * ACCELERATION * delta * TARGET_FPS
            motion.x = clamp(motion.x, -MAX_SPEED, MAX_SPEED)
            sprite.flip_h = x_input < 0
        else:
            animationPlayer.play("Stand")
            dashcount = 0
        motion.y += GRAVITY * delta * TARGET_FPS`

        if is_on_floor():
            if x_input == 0:
                motion.x = lerp(motion.x, 0, FRICTION * delta)

            if Input.is_action_just_pressed("ui_up"):
                motion.y = -JUMP_FORCE
            jumpcount = 0
        else:
            animationPlayer.play("jump")
            if Input.is_action_just_pressed("ui_up") && jumpcount < extrajump:
                motion.y = -JUMP_FORCE
                jumpcount += 1

            if Input.is_action_just_released("ui_up") and motion.y < -JUMP_FORCE/2:
                motion.y = -JUMP_FORCE/2

            if x_input == 0:
                motion.x = lerp(motion.x, 0, AIR_RESISTANCE * delta)
        if Input.is_action_pressed("ui_right"):
            if Input.is_action_just_pressed("dash") && dashcount < extradash:
                    motion.x = MAX_DASH 
                    dashcount += 1
        if Input.is_action_pressed("ui_left"):
            if Input.is_action_just_pressed("dash") && dashcount < extradash:
                    motion.x = -MAX_DASH
                    dashcount += 1
        motion = move_and_slide(motion, Vector2.UP)
        if raycastright.is_colliding():
            motion.y = wallstop
            jumpcount = 0
        if raycastleft.is_colliding():
            motion.y = wallstop
            jumpcount = 0
        rpc("setPosition",Vector2(position.x, position.y)) 
`


, а globals - это просто AUTOLOAD, который сохраняет идентификатор сверстника в нем

...