Pages traduites Pages à traduire Pages en cours de traduction
A propos
 

Ceci est une ancienne révision du document !


b


Les Pointeurs dans AGS

Diverses commandes dans le nouveau langage de script nécessiteront que vous utilisiez des pointeurs. Cette section a été divisée en trois parties séparées pour vous expliquer les pointeurs en fonction de votre expérience précédente en programmation. – sélectionnez un des liens ci-dessous :


Les Pointeurs pour les débutants

Les pointeurs peuvent être d'apparence décourageante, et dans des langages comme le C ou le C++, ils le sont ; mais AGS essaye de rendre les choses aussi simples que possible.

Simplement, un pointeur est une variable qui pointe vers quelque chose d'un type particulier. Par exemple, un pointeur personnage (Character ) va pointer vers un personnage. Quel est l'intéret de tout cela, me direz vous ? Et bien, regardons en arrière AGS 2.62. Si vous vouliez référencer un hotspot particulier, vous deviez vous rappeler son numéro. Si vous vouliez basculer un objet sur On, vous deviez aussi vous rappeler son numéro. Et puisque vous pouviez par erreur utiliser un numéro d'objet là où vous vouliez un numéro de hotspot, des erreurs pouvaient arriver facilement et ça devenait plutôt embrouillé.

C'est là que les pointeurs interviennent. Ils vous permettent de vous débarrasser de l'utilisation de numéros pour identifier les éléments et en même temps ils fournissent une vérification de type évitant ainsi d'utiliser un hotspot là où vous pensiez utiliser un objet.

Regardons un exemple. Si vous vouliez écrire une chaîne de caractères dans un fichier en 2.62, vous feriez ceci :

int handle = FileOpen("temp.txt", FILE_WRITE);
FileWrite(handle, "Test !");
FileClose(handle);

Plutot simple ; mais si vous vouliez ouvrir le fichier à un endroit et l'écrire à un autre ? Vous deviez avoir recours à une variable globale, puis vous rappeler que ce nombre est un identifiant de fichier et non un identifiant de hotspot ou autre. Maintenant , en 2.7 ce code devient :

File *fichier = File.Open("temp.txt", eFileWrite);
fichier.WriteString("Test !");
fichier.Close();

Simple, n'est-ce pas ? La seule partie “confuse” est de s'habituer à déclarer la variable en File* au lieu de int ; mais vous vous y ferez rapidement et tous les exemples dans la documentation vous pointeront dans la bonne direction.

Regardons un autre exemple. Supposons que vous vouliez une variable contenant le hotspot que la souris survole. En 2.62, vous pourriez avoir un code comme ceci :

// haut du global script
int sourisSurvoleHotspot;

// repeatedly_execute
sourisSurvoleHotspot = GetHotspotAt(mouse.x, mouse.y);

Comment faire en 2.7 ? Simplement :

// haut du global script
Hotspot *sourisSurvoleHotspot;

// repeatedly_execute
sourisSurvoleHotspot = Hotspot.GetAtScreenXY(mouse.x, mouse.y);

Mais attendez, et si vous vouliez savoir si la souris survole votre hotspot porte (disons le hotspot 2). En 2.62 vous feriez :

if (mouseOverHotspot == 2) {
  Display("La souris est sur la porte");
}

Mais ça devient vite confus, parce que si vous changez le numéro d'hotspot de la porte, que se passe-t-il ? Vous devriez alors vous rappeler de changer tous les 2 en 3 dans votre code. En 2.7, vous feriez seulement ceci (en supposant que votre Hotspot a un script du nom de hPorte) :

if (mouseOverHotspot == hPorte) {
  Display("La souris est sur la porte");
}

Si vous êtes un fan des nombres pour d'étranges raisons, vous pouvez toujours faire ceci :

if (mouseOverHotspot == hotspot[2]) {
  Display("La souris est sur la porte");
}

Donc, ceci conclut notre introduction aux pointeurs. J'espère que vous avez compris ce qu'ils sont et à quoi ils servent. Si vous avez des questions, n'hésitez pas à les poser sur notre forum technique.


Les Pointeurs pour ceux qui connaissent Java ou C#

Les pointeurs AGS fonctionnent comme les variables objet en Java et C#. La différence principale est que les pointeurs AGS sont déclarés comme en C avec une astérisque (*) pour représenter le pointeur. Donc :

Hotspot *hs;

va déclarer une variable hs qui pointe sur un hotspot. Cela serait équivalent au code suivant en Java ou C# :

Hotspot hs ;

Dans AGS, les pointeurs sont utilisés pour pointer vers différents types prédéfinis comme les Hotspots, les éléments d'inventaire, les personnages, ainsi de suite. Comme AGS n'a pas de mot-clé new il n'est pas possible de créer des pointeurs vers des types de structures personnalisées.

Vous utilisez les pointeurs comme en Java ou en C#. Diverses méthodes statiques d'AGS retournent des pointeurs vers une instance (par exemple, File.Open, Hotspot.GetAtScreenXY, ainsi de suite). Vous pouvez sauver ce pointeur dans une variable pointeur puis appeler ces méthodes comme en Jave ou C#. Les exemples suivants sont tous valides :

File *leFichier = File.Open("test.dat", eFileWrite);
if (leFichier == null) Display("C'est null !");
File *fichier2 = leFichier;
if (leFichier == fichier2) Display("Ce sont les mêmes fichiers !");
leFichier = null;
fichier2.WriteInt(10);
fichier2.Close();

Si vous essayez d'appeler une méthode sur un pointeur null, une erreur va se produire (comme en Java ou en C#, vous auriez une exception).

La gestion de mémoire des pointeurs dans AGS est automatique – la mémoire est libérée quand il n'y a plus de variables pointant vers l'instance. Cependant, si vous avez une variable pointeur globale, il est conseillé d'initialiser ce pointeur à null quand vous n'en avez plus besoin pour libérer la mémoire.


Les Pointeurs pour ceux qui connaissent C ou C++

Les pointeurs dans AGS sont basés sur la syntaxe C/C++, ils sont donc déclarés avec une astérisque ( * ). Cependant, dans AGS, les pointeurs sont utilisés pour pointer vers différents types prédéfinis, mais il n'est pas possible de créer des pointeurs vers des types de structures personnalisées.

Les membres des pointeurs sont accessibles avec l'opérateur point ( . ) et non avec -> , l'opérateur C. Parce qu'AGS ne supporte pas les pointeurs vers des pointeurs et autres, il n'y a pas besoin d'un séparateur spécifique.

Dans AGS, la gestion de mémoire des pointeurs est faite automatiquement sur la base d'un comptage par référence (sur le même principe que COM), il n'y a donc pas de mot-clé new ou delete . Quand un objet n'est plus référencé par aucune variable de pointeur, il est libéré. Pour cette raison, si vous avez une variable pointeur globale, il est conseillé d'initialiser ce pointeur à null quand vous n'en avez plus besoin pour libérer la mémoire.

Les pointeurs AGS sont fortement typés et vous ne pouvez pas les passer d'un type à l'autre comme vous le feriez en C ou C++. AGS vous autorisera uniquement à comparer ou à assigner des pointeurs du même type ou du même type de base. Il existe un mot clé spécial null auquel tous les pointeurs peuvent être assignés ou comparés, vous indiquant qu'ils ne sont plus assignés.

Parce qu'il n'y a pas de mot clé new , vous ne pouvez pas créer d'instances d'objets, par contre ils sont retournés par des membres statiques de fonctions comme File.Open et Hotspot.GetAtScreenXY. Regardez les exemples de ces fonctions pour comprendre comment les utiliser.

 
pointeurs.1349972240.txt.gz · Dernière modification: 11/10/2012 18:17 (édition externe)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki