Développement
Programmation de l'IA
- Documentation API
- Introduction
- Fichier info.nut
- Fichier main.nut
- Principes de base
- Détermination de chemin routier
- Détermination de chemin ferroviaire
- Sauver / Charger des données
- Choses à savoir
-
Squirrel
- Page principale
- Erreurs courantes
- Listes
- Traiter les erreurs OTTD
- Tramways
- Bibliothèques de l'IA
- Forum
- FAQ du forum
- Comportement de l'IA
IAs
Tous les articles de la catégorie NonIA
Contents |
require()
Pour inclure des fichiers dans votre main.nut
, vous pouvez utiliser require()
. Cette fonction fonctionne de façon relative au fichier courant, donc elle devrait être assez simple à utiliser. Mais vous devez garder à l'esprit différentes choses:
- Elle inclut toujours le fichier dans l'espace global. Ce n'est pas une inclusion de code. Donc le fichier inclus doit avoir un code complet (les gens le remarquent rarement, mais c'est important à savoir :))
Classes
Assurez-vous d'initialiser toutes vos variables de classe non statiques dans le constructeur. Leur donner simplement une valeur quand vous les déclarer n'est pas suffisant, si vous créez de multiples instances!! Si vous échouez à l'initialisation d'une variable dans le constructeur, cela peut aboutir à une valeur bizarre, comme copier la valeur d'une autre instance de la classe. La boîte ci-dessous montre une manière correcte d'initialiser les variables. La chose importante est que toutes les variables obtiennent une valeur dans le constructeur.
class Developer { name = null; age = null; constructor() { name = "Développeur inconnu"; age = 25; } function SetName(name); // ... }
Déclarations de fonction
Remarquez aussi que les déclarations de fonction dans une classe ont lieu en dehors du bloc appartenant à la classe.
class Util{ function Util::GetMsg(){ return "Test"; } }
fera planter l'IA au chargement, alors que
class Util{ } function Util::GetMsg(){ return "Test"; }
fonctionnera comme attendu.
Squirrel n'a pas de moyen de marquer les méthodes comme statiques ou privées
Dans d'autres langages orientés objet, vous pouvez limiter la manière d'appeler les fonctions lors de leur déclaration. Dans Squirrel, la seule différence entre une fonction d'instance et une fonction statique est la manière de les appeler. Dans d'autres langages, vous pouvez aussi choisir de rendre les méthodes publiques ou privées. Toutes les méthodes dans Squirrel sont publiques.
Il y a deux manières d'appeler les fonctions. Vous pouvez les appeler depuis l'instance ou les appeler statiquement. Quand vous appelez une fonction depuis l'instance, soit vous préfixez l'appel avec le mot-clé this, soit vous ne le préfixez pas du tout.
La méthode AIFoo.Valuate() appelle toujours vos méthodes de façon statique. Donc, tout évaluateur personnalisé devrait être auto-contenu.
instancefunction MyNewAI::Start() { this.MainLoop(); /* MainLoop(); marcherait aussi. this. est en général optionnel. */ local otherClass = MyOtherClass(); otherClass.SomeFunction(); // Appelle la fonction avec la méthode d'instance d'une autre classe. } function MyNewAI::MainLoop() { while(true) { // Boucle infinie. this.Sleep(10); } }
Quand vous appelez la méthode depuis l'instance, la méthode a toutes les variables et les autres informations disponibles pour cette instance de la classe. Donc, la ligne this.Sleep(10) fonctionnera correctement, car AIController possède la méthode Sleep pour votre classe. Souvenez-vous que votre classe principale est une extension de AIController, et qu'elle a donc ses capacités aussi bien que celles que vous lui avez données.
Afin d'appeler une instance statique, vous devez préfixer la méthode avec le nom de la classe.
statiquefunction MyNewAI::Start() { MyNewAI.MainLoop(); MyOtherClass.SomeFunction(); // Appelle la fonction de l'autre classe de façon statique } function MyNewAI::MainLoop() { while(true) { // Loop forever. AIController.Sleep(10); // "this" n'existe plus dans un contexte statique } }
Souvenez-vous que vos fonctions peuvent être appelées des deux manières. C'est à l'appelant de savoir comment utiliser la fonction.