The Linkit Framework
Ce haut niveau d'abstraction masque complètement la gestion pure des communications et des requêtes/réponses, ce qui permet à l'utilisateur un effort minimal pour développer son application, puisque l'entièreté de la réflexion concernant le réseau est concentrée dans un fichier où l'utilisateur décrit uniquement le comportement attendu des objets sur l'ensemble du réseau
Cette page d'introduction servira à présenter le potentiel recherché par cette technologie, en comparant les méthodes traditionnelles de communication et la méthode "orientée objet" proposée par Linkit.
Presentation by example
Nous avons un jeux vidéo dans lequel des joueurs peuvent évoluer sur une carte, ils peuvent ramasser des armes et tirer sur d'autres joueurs pour faire baisser leurs barres de vie jusqu'à les tuer.
Nous cherchons à présent un moyen de développer la partie multijoueur.
Nous voulons des sessions de jeux, dans lesquels les joueurs peuvent s'y connecter et s'affronter.
Voici la structure actuelle de l'application :
.
├── Core
│ └── src
│ └── scala
│ └── Player.scala
│ └── Map.scala
│ └── Weapon.scala
└── Client
└── src
└── scala
├── graphics
│ │ └── ... <- PlayerView / MapView / WeaponView etc...
└── Main.scala
Modèle Requête/Réponse
Dans un premier temps, nous allons utiliser le modèle habituel, c'est-à-dire que nous allons effectuer des requêtes vers le serveur
afin de l'informer lorsqu'un joueur bouge, tir, saute ou essaye de ramasser une arme.
Inversement, le serveur informera les clients lorsqu'un joueur aura effectué une action valide.
Développons !
.
├── Core
│ └── src
│ └── scala
│ ├── multiplayer
│ │ ├── Connection.scala
│ │ ├── GameSession.scala
│ │ ├── event
│ │ │ └── ... <- OnXEvent, OnYEvent ...
│ │ └── handler
│ │ ├── OnPlayerJumpEventHandler.scala
│ │ ├── OnPlayerLootWeaponEventHandler.scala
│ │ ├── OnPlayerMoveEventHandler.scala
│ │ ├── OnPlayerHitEventHandler.scala
│ │ └── OnPlayerShootEventHandler.scala
│ ├── Player.scala
│ ├── Map.scala
│ └── Weapon.scala
├── Client
│ └── src
│ └── scala
│ ├── multiplayer
│ │ └── ServerConnection.scala
│ ├── graphics
│ │ └── ... <- PlayerView / MapView / WeaponView etc...
│ └── Main.scala
└── Server
└── src
└── scala
├── Main.scala
└── multiplayer
├── GameSessionsHander.scala
└── ClientConnection.scala
Pour cette partie-là, afin de simplifier le raisonnement, nous partons du principe que le serveur ne s'occupe pas de vérifier si une requête est legit ou non.
Notre projet a subi de sacrés changements,
Core
a un nouveau packet multiplayer
, ce packet contient le trait Connection
,
utilisé par GameSession
pour recevoir / envoyer des requêtes.
Lorsqu'un événement est engendré, c'est soit depuis une requête, soit depuis l'application.
GameSession
va alors se charger d'envoyer une requête lorsqu'un évènement est engendré depuis l'application, et vice versa.
ServerConnection
dans Client
implémente Connection
et permet d'envoyer des requêtes vers le serveur ou d'en réceptionner une.
Server
est apparu, il contient GameSessionsHandler
qui répertorie toutes les sessions de jeux qu'il gère,
et ClientConnection
implémente Connection
, et permet de recevoir et envoyer une requête vers le client représenté.