From fa93ed5505b51e1c29946769d468abad96391d33 Mon Sep 17 00:00:00 2001 From: Jummit Date: Sun, 1 Mar 2020 17:45:06 +0100 Subject: [PATCH] remove image in networking docs and mention some more multiplayer peers --- tutorials/networking/high_level_multiplayer.rst | 9 +++++---- tutorials/networking/img/nmpeer.png | Bin 19443 -> 0 bytes 2 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 tutorials/networking/img/nmpeer.png diff --git a/tutorials/networking/high_level_multiplayer.rst b/tutorials/networking/high_level_multiplayer.rst index 76bc84ba7..19e7152c3 100644 --- a/tutorials/networking/high_level_multiplayer.rst +++ b/tutorials/networking/high_level_multiplayer.rst @@ -57,14 +57,15 @@ Mid level abstraction Before going into how we would like to synchronize a game across the network, it can be helpful to understand how the base network API for synchronization works. Godot uses a mid-level object :ref:`NetworkedMultiplayerPeer `. -This object is not meant to be created directly, but is designed so that several implementations can provide it: - -.. image:: img/nmpeer.png +This object is not meant to be created directly, but is designed so that several implementations can provide it. This object extends from :ref:`PacketPeer `, so it inherits all the useful methods for serializing, sending and receiving data. On top of that, it adds methods to set a peer, transfer mode, etc. It also includes signals that will let you know when peers connect or disconnect. This class interface can abstract most types of network layers, topologies and libraries. By default, Godot -provides an implementation based on ENet (:ref:`NetworkedMultiplayerEnet `), but this could be used to implement mobile APIs (for adhoc WiFi, Bluetooth) or custom device/console-specific networking APIs. +provides an implementation based on ENet (:ref:`NetworkedMultiplayerEnet `), +one based on WebRTC (:ref:`WebRTCMultiplayer `), and one based on WebSocket +(:ref:`WebSocketMultiplayerPeer `), but this could be used to implement +mobile APIs (for adhoc WiFi, Bluetooth) or custom device/console-specific networking APIs. For most common cases, using this object directly is discouraged, as Godot provides even higher level networking facilities. Yet it is made available in case a game has specific needs for a lower level API. diff --git a/tutorials/networking/img/nmpeer.png b/tutorials/networking/img/nmpeer.png deleted file mode 100644 index 3f48ff6b7eb8dc7b5fae5a55713658618ae4a663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19443 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