Pièges de Squirrel
Framework NonIA

Page principale NonIA

Développement

Jalons de développement
Suggestion de changements de l'API

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

TestAI
WrightAI
Convoy
Voir le forum
Voir BaNaNaS
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:

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.

instance
 function 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.

statique
 function 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.