Так что после некоторого жесткого кодирования мне удалось подключить плееры к моему серверу, но после того, как я настроил 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, который сохраняет идентификатор сверстника в нем