La première étape de la construction de la logique qui sous-tend le plateau de jeu consiste à déterminer le mode de représentation d'un carré de plateau de jeu par programmation.
Pour déterminer le mode de représentation d'un carré de plateau, réfléchissez à la façon dont vous et le joueur utilisez les carrés de plateau. Un jeu de plateau est généralement composé d'espaces discrets, séparés les uns des autres et distincts. Cet espace est différent de l'espace du monde de l'UEFN.
Dans l'espace du monde, les coordonnées sont représentées par des emplacements vector3 ; autrement dit, les coordonnées peuvent être aussi proches les unes des autres que peuvent l'être les nombres à virgule flottante. Les coordonnées du monde sont donc plus continues que discrètes. En outre, de nombreux emplacements vector3 différents se trouvent tous sur le même carré de plateau. Vous pouvez donc tirer les conclusions suivantes :
Dans la mesure où les carrés du plateau sont discrets, vous pouvez utiliser un type de données discrètes (les données discrètes sont des données qui prennent une plage de valeurs correspondant à des valeurs entières ou à des nombres entiers) pour représenter nos emplacements ; il convient donc d'utiliser le type
intplutôt que le typefloat.Le plateau étant bidimensionnel, vous ne devez stocker qu'un emplacement dans deux dimensions. Vous n'avez pas besoin d'une structure de données tridimensionnelle pour stocker l'emplacement des carrés du plateau.
Définir les types de données du plateau
La classe tile_coordinate représente l'emplacement d'un carré sur le plateau de jeu. Pour créer la classe tile_coordinate, créez un nouveau fichier Verse nommé utilities.verse. Dans ce fichier, créez un nouveau module nommé DataTypes.
DataTypes<public> := module:
Ajoutez à ce module la nouvelle classe TileCoordinate et définissez les composants de la classe.
using { /Verse.org/Simulation }
DataTypes<public> := module:
tile_coordinate<public> := class<concrete>:
@editable
Left<public>:int = 0
@editable
Forward<public>:int = 0
Dans le jeu Combat à coordonnées, vous construisez une grille de plateau de 5 x 5. Vous devez donc définir les limites du plateau de jeu. Pour ce faire, créez une nouvelle classe bounds qui définit une limite inférieure et supérieure pour la taille minimale ou maximale que peut avoir le composant Left ou Forward de tile_coordinate.
using { /Verse.org/Simulation }
DataTypes<public> := module:
tile_coordinate<public> := class<concrete>:
@editable
Left<public>:int = 0
@editable
Forward<public>:int = 0
Vous souhaitez disposer d'une structure qui contient les limites d'un plateau de jeu unique dans une structure de données. Pour ce faire, créez une nouvelle classeboard_bounds qui définit une limite inférieure et supérieure pour chacun des composants de tile_coordinate.
using { /Verse.org/Simulation }
DataTypes<public> := module:
tile_coordinate<public> := class<concrete>:
@editable
Left<public>:int = 0
@editable
Forward<public>:int = 0
Définir le plateau de jeu
Vous disposez désormais de structures pour :
Définir la représentation d'un carré dans l'espace du plateau.
Définir les limites de l'espace du plateau.
Il manque une pièce essentielle : le plateau de jeu lui-même. Pour définir le plateau de jeu, créez un nouveau fichier Verse nommé board.verse et ajoutez un nouvel appareil Verse nommé board.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
Ce plateau doit inclure certains éléments :
Où se trouve le plateau dans l'espace du monde ?
Quelles sont les limites du plateau ?
Quelle est la taille d'un carré de plateau ?
Pour répondre à la première question, aucune nouvelle variable n'est nécessaire ; vous pouvez utiliser la variable de transformation intégrée de l'appareil lui-même. Vous pouvez obtenir la variable transform d'un appareil du mode Créatif avec la fonction d'API GetTransform.
Pour répondre à la deuxième question, il est possible d'utiliser une variable board_bounds.
Enfin, pour répondre à la troisième question, vous pouvez définir une variable vector2 en vue de suivre la taille des carrés.
Les deux derniers éléments sont ajoutés en tant que champs pour votre appareil board.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
Effectuer des conversions de l'espace du plateau vers l'espace du monde
Vous devez ensuite déterminer l'emplacement d'un carré dans le monde en tant que vector3, en fonction d'un emplacement sur le plateau de jeu en tant que tile_coordinate. Nommez cette fonction ToVector3. Vous devez effectuer cette opération dans les limites d'un plateau de jeu afin de savoir où se trouve le centre du plateau.
Il existe une ambiguïté que vous devez lever. Compte tenu d'une tile_coordinate, il existe de nombreux emplacements du monde vector3 différents sur le même carré. En langage mathématique, il s'agit d'une fonction un-à-plusieurs. Idéalement, vous choisiriez un emplacement unique dans le monde pour indiquer où se trouve le carré dans l'espace du monde. Le plus simple est de choisir le centre du carré.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
Cette fonction exécute les tâches suivantes :
Elle obtient la variable de transformation du plateau dans l'espace du monde.
Elle obtient l'emplacement du plateau dans l'espace du monde à partir de la variable de transformation.
Elle calcule le décalage du carré d'entrée par rapport au centre du plateau.
Elle ajoute le décalage au centre de l'emplacement du plateau pour obtenir l'emplacement par rapport au centre du monde.
Effectuer des conversions de l'espace du monde vers l'espace du plateau
Si l'un de vos emplacements dans l'espace du monde est un vector3, vous devez le convertir en tile_coordinate.
Créez une fonction nommée ToTileCoordinate. Cette fonction prend un vector3 comme argument et renvoie une tile_coordinate. Si vous choisissez un emplacement dans l'espace du monde en tant que vector3, il est un peu plus complexe de déterminer l'emplacement sur le plateau de jeu en tant que tile_coordinate.
La principale raison pour laquelle cette opération est plus complexe est que, comme le plateau est une grille distincte, de nombreux emplacements dans l'espace du monde ne font pas partie du plateau de jeu. Par conséquent, lorsqu'on choisit un emplacement dans l'espace du monde en tant que vector3, il est possible que l'emplacement ne soit pas du tout sur le plateau de jeu. La fonction ToTileCoordinate est donc idéale pour disposer du spécificateur d'effet de la fonction <decides>. En effet, de nombreux emplacements dans le monde du jeu ne sont pas basés sur un système de coordonnées de carrés. Dans ce cas, toute tentative de conversion échoue. Il est important de savoir quand cette conversion réussit ou échoue. La fonction ToTileCoordinate détermine d'abord si un emplacement se trouve sur le plateau de jeu et, si c'est le cas, renvoie cet emplacement tile_coordinate.
Une autre raison de cette complexité accrue est qu'un seul carré est composé de nombreux emplacements dans le monde. En mathématiques, la fonction ToTileCoordinate est une fonction plusieurs-à-un.
Pour clarifier les choses, séparez la partie de la fonction ToTileCoordinate qui échoue, définissez une fonction IsTileCoordinateOnBoard séparément et appelez-la dans ToTileCoordinate.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
La fonction IsTileCoordinateOnBoard exécute les tâches suivantes :
Elle détermine si le composant gauche de la coordonnée du carré d'entrée se trouve dans les limites du plateau.
Elle détermine si le composant avant de la coordonnée du carré d'entrée se trouve dans les limites du plateau.
La fonction IsTileCoordinateOnBoard réussit si la coordonnée du carré d'entrée se trouve dans les limites du plateau, et échoue dans le cas contraire.
La fonction ToTileCoordinate exécute les tâches suivantes :
Elle obtient la transformation dans l'espace du monde du plateau.
Elle obtient le centre de l'emplacement du tableau à partir de l'espace du monde.
Elle calcule la position relative de l'emplacement du monde par rapport au centre du plateau.
Elle convertit l'emplacement relatif au monde en une coordonnée de carré.
Elle détermine si la coordonnée de carré se trouve sur le plateau.
Elle renvoie la coordonnée de carré si elle se trouve sur le plateau.
La fonction ToTileCoordinate réussit si et seulement si IsTileCoordinateOnBoard réussit.
Exemple
Dans l'exemple ci-dessous, une classe tile_coordinate est convertie en vector3,, puis ce même vector3 est reconverti en tile_coordinate.
Coordonnée de carré en vector3
Supposons que vous disposiez des éléments suivants :
Un plateau de jeu de 5 x 5 carrés.
Un carré de jeu de 512,0 x 512,0 unités.
Le plateau de jeu est situé à X := 5 000,0, Y := 0,0, Z := 1 000,0 dans l'espace du monde.
Voici les étapes à suivre pour convertir le carré avec les coordonnées de carré Left := -1, Forward := 2.0 à l'espace du monde.
ToVector3(tile_coordinate{Left := -1, Forward := 2.0})
BoardTransform:transform = GetTransform()
# BoardTransform := transform{Translation := vector3{X := 5000.0, Y := 0.0, Z := 1000.0}, ...}
CenterOfBoard:vector3 = BoardTransform.Translation
# CenterOfBoard := vector3{X := 5000.0, Y := 0.0, Z := 1000.0}
TileOffsetFromCenter:vector3 = vector3:
X := (TileLocation.Forward * TileSize.X)
Les étapes de reconversion à l'aide de la fonction ToTileCoordinate sont les suivantes.
ToTileCoordinate(vector3{X := 6024.0, Y := 512.0, Z := 1000.0}):
BoardTransform:transform = GetTransform()
# BoardTransform := transform{Translation := vector3{X := 5000.0, Y := 0.0, Z := 1000.0}, ...}
CenterOfBoard:vector3 = BoardTransform.Translation
# CenterOfBoard := vector3{X := 5000.0, Y := 0.0, Z := 1000.0}
ShiftedWorldLocation:vector3 = WorldLocation - CenterOfBoard
# ShiftedWorldLocation := vector3{X := 6024.0, Y := 512.0, Z := 1000.0} - vector3{X := 5000.0, Y := 0.0, Z := 1000.0}
Cette dernière tile_coordinate est exactement la même que la valeur initiale ; autrement dit, tout a fonctionné comme prévu.
Résumé
En résumé, cette page vous a guidé à travers les étapes suivantes :
Définir la représentation d'un carré dans l'espace du plateau.
Définir les limites de l'espace du plateau.
Délimiter l'emplacement de l'espace du plateau dans l'espace du monde.
Effectuer des conversions entre l'espace du plateau et l'espace du monde.
.udatasmith
using { /Verse.org/Simulation }
DataTypes<public> := module:
tile_coordinate<public> := class<concrete>:
Left<public>:int = 0
Forward<public>:int = 0
bounds<public> := class<concrete>:
@editable
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Assets }
using { DataTypes }
using { UtilityFunctions }
board<public> := class(creative_device):
type