Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Game of Life

Par Paoh le 27/6/2001 à 13:51:00 (#25713)

J'ai traduit les commentaires de ce script.
Cela donne une idée du principe d'interaction entre utilisateur(personnage) et zone.

///////////////////////////////////////////////////////////////////////////////
//
// Jeu de la Vie
//
// Copyright (c) 2001 Bioware Corp.
//
///////////////////////////////////////////////////////////////////////////////
// Si une piece à moins de 2, ou plus de 3 voisins alors elle 'meurt'
// Si une piece a exactement 3 voisins, elle devient 'vivante'
//
// Ce script est fait pour etre place dans une zone en tant que script d'
// "Evenement a Utilisateur Defini" ("User Defined Event" script). La zone est
// scriptée pour lancer un evenement toute seule quand un utilisateur entre,
// ce qui declenche ce script, qui continue de se lancer indefiniment.
// Chaque fois que le script est lance, cela provoquera une iteration.
//
// A n'importe quel moment, les joueurs peuvent marcher sur le 'plateau' et
// réanranger les pièces juste en les ramassant les objets que nous utilisons
// en tant que pieces, et en les lachant a peu pres a un endroit correct.
///////////////////////////////////////////////////////////////////////////////

void main()
{
int ALIVE = 0;
int DYING = 1;
int SPAWNING = 2;

float fOffset = 0.3125f; // espace entre les pieces (taille d'une tuile (tile))
float fSelfLength = fOffset / 2.0f; // tolerance d'erreur pour le placement d'une piece
float fLength = fOffset * 1.7f; // zone dans laquelle compter les voisins
float fDelay = 0.1f; // delai en secondes avant de lancer la prochaine iteration

location lSpawn, lOrigin;
vector vSpawn, vOrigin;
object oCell, oOtherCell, oArea;
int bCellAtPosition, nCount, i, j;

lOrigin = GetLocation( GetWaypointByTag("Origin") );
vOrigin = GetPositionFromLocation(lOrigin);
oArea = GetAreaFromLocation(lOrigin);

for (i=0; i<19; i++)
{
for (j=0; j<19; j++)
{
// calcule l'endroit ou la piece doit etre
vSpawn = Vector(i * fOffset,j * fOffset) + vOrigin;
lSpawn = Location(oArea, vSpawn, 0.0f);

// recupere la piece de cet endroit
oCell = GetFirstObjectInShape(SHAPE_CUBE, fSelfLength, lSpawn, FALSE,
OBJECT_TYPE_ITEM);
bCellAtPosition = GetIsObjectValid(oCell) && GetTag(oCell) == "CELL";

// compte les voisins de cet endroit
nCount = 0;
oOtherCell = GetFirstObjectInShape(SHAPE_CUBE, fLength, lSpawn, FALSE,
OBJECT_TYPE_ITEM);
while (GetIsObjectValid(oOtherCell) && nCount < 5)
{
if (GetLocalInt(oOtherCell, "state") != SPAWNING &&
oOtherCell != oCell && GetTag(oCell) == "CELL")
{
nCount++;
}
oOtherCell = GetNextObjectInShape(SHAPE_CUBE, fLength, lSpawn, FALSE,
OBJECT_TYPE_ITEM);
}

// a changer si necessaire
if (bCellAtPosition)
{
if (nCount < 2 nCount > 3)
{
SetLocalInt(oCell, "state", DYING);
DestroyObject(oCell);
}
}
else
{
if (nCount == 3)
{
oCell = CreateObject(OBJECT_TYPE_ITEM, "CELL", lSpawn);
SetLocalInt(oCell, "state", SPAWNING);
DelayCommand(fDelay, SetLocalInt(oCell, "state", ALIVE));
}
}

}
}

// Cette commande relancera ce scriptdans 0.75 secondes en creant
// un evenement a utilisateur-defini qui, a son tour, lancera ce script !
DelayCommand(0.75f, SignalEvent(OBJECT_SELF, EventUserDefined(0)));
}

-------
Il ne faut pas oublier ce que cela donne :
http://nwvault.ign.com/dm/scripting/scripts/images/VaultNetwork_life.jpg

Par Caepolla le 27/6/2001 à 14:31:00 (#25714)

Merci pour la traduction !

Le type même d'exemple agaçant car nécessitant l'éditeur : cela rend l'attente d'autant plus frustrante.

:)

Par Paoh le 27/6/2001 à 14:47:00 (#25715)

D'autant plus qu'il ne mettent même pas les 'include' (les fichiers .h à inclure)

Notes de traduction :

- Traduction de "Cell" (cellule) par "pièce", plus proche des petits objets de l'image.
- Traduction de "User" (utilisateur) par "utilisateur", même si le sens est 'personnage'.
- Pas de traduction de iteration qui signifie itération en français (déroulement d'un programme/script)

Par Uther Pendragon le 27/6/2001 à 16:44:00 (#25716)

Arf (pour Darkmore ;)), cet exemple est aussi sur le site... Mais j'ai traduit Cell par Cellule, User, par Utilisateur, et iteration par répétition (je crois)...
Qui a dit : "on voit que c'est les vacances". ;)

Merci pour cette contribution, Paoh. :)

Par Bharn le 28/6/2001 à 10:55:00 (#25717)



[ 28 juin 2001: Message édité par : Bharn ]

Par Paoh le 28/6/2001 à 10:57:00 (#25718)

Arf..(moi aussi héhé).. je ne l'avais pas encore vu. La prochaine fois que je fais quelque chose, je te le maile...
..ou j'attends qu'il soit sur ton site ;)
...
Bilan : que c'est frustrant tout de même de ne pas voir plus de précisions... ou de ne pouvoir tester ses scripts :(

(Désolé pour le post précédent :D)

Par Aliabastre le 28/6/2001 à 19:48:00 (#25719)

Débat lancé par Paoh:

Bilan : que c'est frustrant tout de même de ne pas voir plus de précisions... ou de ne pouvoir tester ses scripts :(


Si tu parles de l'exemple du jeu de la vie, je pense que pas mal de personnes ici seront en mesure de répondre à d'éventuelles questions.
(dont moi :cool: )
Si tu maîtrises, alors j'espère que tu m'excuseras... cette remarque pouvant s'appliquer à d'autres personnes fréquentant le forum :)

[ 28 juin 2001: Message édité par : Aliabastre ]

Par Paoh le 28/6/2001 à 23:33:00 (#25720)

C'est vraiment très aimable de ta part et je suis sûr que beaucoup de personnes aimeront se savoir supportées :)

Pour ma part, je faisais ce bilan par rapport au fait qu'on ne peut évidemment pas tester ce script avec un compilateur C.
Comme les fonctions ont été définies dans le cadre du compilateur du NWScript : Sans les sources point de salut !
..mais je te dis merci pour les autres :).

Euh, j'ai quand même une question :
Vois-tu à priori de quelle fonctions du C il s'est inspiré pour créer les fonctions
GetLocation(), GetPositionFromLocation(), GetFirstObjectInShape(), etc...
Parce que même si elles ont un nom explicite, je me demande bien comment ils les font tourner ?
Mais je me pose peut-être les mauvaises questions...Je sais plus :D

Par Myvain le 29/6/2001 à 0:24:00 (#25721)

Débat lancé par Paoh:
Euh, j'ai quand même une question :
Vois-tu à priori de quelle fonctions du C il s'est inspiré pour créer les fonctions
GetLocation(), GetPositionFromLocation(), GetFirstObjectInShape(), etc...
Parce que même si elles ont un nom explicite, je me demande bien comment ils les font tourner ?
Mais je me pose peut-être les mauvaises questions...Je sais plus :D


[cherche dans ses souvenirs]
Peut-être faut-il regarder du côté de Java.
Je regarderais ça demain...

Juste un truc, quelqu'un peut m'expliquer le principe du jeu de la vie. Merçi d'avance :)

Par lumina le 29/6/2001 à 10:18:00 (#25722)

// Si une piece à moins de 2, ou plus de 3 voisins alors elle 'meurt'
// Si une piece a exactement 3 voisins, elle devient 'vivante'

Les regles se resument à ca :)
Pour une simulation parametrable:
Cellular Automaton

Par Myvain le 29/6/2001 à 11:46:00 (#25723)

Débat lancé par Une dame en blanc:
// Si une piece à moins de 2, ou plus de 3 voisins alors elle 'meurt'
// Si une piece a exactement 3 voisins, elle devient 'vivante'

Les regles se resument à ca :)
Pour une simulation parametrable:
Cellular Automaton

Merçi pour la réponse et pour le site, ça m'a donné une idée(une recherche sur le net :rolleyes: ) et j'ai trouvé cette explication qui me semble bien plus claire:

"des cellules (points noirs) sont disposées sur un plateau quadrillé. A chaque tour, la machine détermine si chaque cellule vit ou meurt en suivant la règle suivante : si une cellule est entourée de 2 ou 3 autres cellules, elle vit. si elle est entourée par 0 ou 1 autre cellule, elle meurt de solitude. si elle est entourée par 4 cellules ou plus, elle meurt étouffée. si une case est vide mais entourée d'exactement 3 autres cellules, il apparaît une nouvelle cellule."

C'était le "elle devient 'vivante'" qui me génait, mais maintenant j'ai mon explication. :p


[//Edit]

Vois-tu à priori de quelle fonctions du C il s'est inspiré pour créer les fonctions
GetLocation(), GetPositionFromLocation(), GetFirstObjectInShape(), etc...
Parce que même si elles ont un nom explicite, je me demande bien comment ils les font tourner ?


Neverwinter Vault propose une explication à propos des fonctions GetFirstObjectInShape et GetNextObjectInShape. Voici une explication (en anglais :p )de Noel Borstad, l'homme ayant créé le script:
La question est:"Where does GetNextObjectInShape() get its context from? In other words, how does it know what the last object was?"

et voici sa reponse:

"In answer to your question, the GetFirstObjectInShape/GetNextObjectInShape commands store the array position of the object they return on the object running the script. This allows us to quickly pick up where we left off, and find the next relevant object. This is a speed vs. flexibility vs. memory requirements tradeoff because it will not allow you to nest this command.

Voilà, j'éspère que ça pourrait t'aider dans ta recherche sur le fonctionnement de ces fonctions ;) :)

[ 29 juin 2001: Message édité par : Myvain ]

Par Paoh le 29/6/2001 à 13:28:00 (#25724)

- Pour le principe du jeu
La différence avec le jeu en Java est que le joueur (user) peut interagir en prenant une pièce et en la déplaçant.

- Pour les fonctions
Merci, c'est (un peu) plus clair. Vivement des exemples de déclarations de fonctions :p .

Tentative de traduction (si elle n'existe pas encore :D)


Q - " D'où est-ce que la fonction GetNextObjectInShape() tire t-elle son contexte ? En d'autres termes, comment sait-elle quel était le dernier objet ? "

R - " Les commandes GetFirstObjectInShape & GetNextObjectInShape enregistrent (stockent?) la position dans le tableau (array) de l'objet et le retournent dans l'objet exécutant le script. Ceci nous permet de reprendre rapidement où nous avons cessé, et trouver le prochain objet approprié. C'est une technique mettant en concurrence la vitesse et flexibilité/mémoire parce qu'elle ne vous permettra pas d'emboîter cette commande."


-> De ce que j'ai compris, les fonctions récupèrent dans une table d'objets, ceux dont ils se sont dejà servi pour savoir ou ils en sont. C'est rapide, mais ca n'optimise pas du tout la memoire ou la modularité du code.

Dites-moi ou je me trompe (ca fait longtemps que je programme plus, mais je compte m'y remettre :D)

[ 29 juin 2001: Message édité par : Paoh ]

Par Myvain le 29/6/2001 à 13:42:00 (#25725)

Débat lancé par Paoh:
Dites-moi ou je me trompe (ca fait longtemps que je programme plus, mais je compte m'y remettre :D)

[ 29 juin 2001: Message édité par : Paoh ][/QB]

Faudra aussi que je me remette à la programmation, j'ai perdu toutes mes bases :(
Par contre je me pose encore la question:
C, C++ ou Java... un conseil???

Par Paoh le 29/6/2001 à 15:22:00 (#25726)

Débat lancé par Myvain:

C, C++ ou Java... un conseil???


Je dirais plutôt qu'il faut se repencher sur le C (avec des fonctions inspirées du Java).
(Pas de classes, de concept objet ou autre API 32bit, donc pas de C++ à l'horizon.

De toute façon c'est le chemin que l'on prend avec les tutoriaux.
Je suis avec toi Myvain. Avec un peu de mémoire, on m'a dit que cela revenait tout seul ! (qui m'a dit çà déja ?...)

Par Myvain le 29/6/2001 à 15:51:00 (#25727)

Débat lancé par Paoh:

Je suis avec toi Myvain. Avec un peu de mémoire, on m'a dit que cela revenait tout seul ! (qui m'a dit çà déja ?...)


Merçi de m'avoir donné ton opinion, entre le C et Java mon coeur balance (C++ j'aime pas).

Pour la dernière partie de ta réponse, j'ai quand même quelques doutes, si je dois évaluer mon niveau de connaissance(ce que je me souviens) à l'heure actuelle, on se rapproche dangereusement du zero ou presque
:rolleyes: . Tant pis, je vais repartir de là ;)


//Edit: Neverwinter Vault a mis en ligne une base de donnée des fonctions et des constantes.

[ 30 juin 2001: Message édité par : Myvain ]

Par The mistery man le 1/7/2001 à 4:23:00 (#25728)

Moi çà risque de me rappeller de joyeux "souvenirs" le C :D

Bref ! je dois moi aussi tourné au niveau du "zéro" ... vive l'été et le temps qu'il nous reste avant la sortie de NWN ...
Enfin juste pour les programmeurs :D :D :rolleyes:

PS : Faut que je pense à ne pas oublier un beau chapeau avant d'aller à la plage ;) ... Sinon,je n'aurai que le pavé de language C à me mettre sur la tête :D

Par Myvain le 1/7/2001 à 23:24:00 (#25729)

La leçon n°3 est en ligne:Leçon n°3

Par Lumina le 2/7/2001 à 2:55:00 (#25730)

pour l'instant, les lecons sont ultra simplistes et s'apprennent en moins de 5 minutes.. :o)

Par Uther Pendragon le 2/7/2001 à 16:34:00 (#25731)

La traduction est également en ligne... :)

C'est vrai que pour l'instant, c'est très simple, mais je crois qu'il est important que tout le monde comprenne le principe de fonctionnement d'un programme avant de se lancer dans éléments plus complexes. Autant assimiler clairement les bases dès le début... :)

[ 02 juillet 2001: Message édité par : Uther Pendragon ]

Par Myvain le 2/7/2001 à 17:42:00 (#25732)

Le premier Bug !!!

A la place de:

#include <include\stdio.h>
#include <include\NWScript.h>

il faut ecrire:

#include <stdio.h>
#include <NWScript.h>

Etant donné que nous avons paramétrer le programme dans la première leçon, il sait où trouver les fichier ".h" à inclure, il n'est donc pas nécessaire de le préciser une nouvelle fois sous peine de provoquer un erreur de compilation. :p :)

[ 02 juillet 2001: Message édité par : Myvain ]

Par Uther Pendragon le 2/7/2001 à 19:01:00 (#25733)

Hihi... je me demandais si je n'avais pas fait une erreur qql part... En fait, c'est Mark brockington, qui nous tend des pièges. :p

Au passage, cette erreur se corrige aussi très bien en indiquant l'adresse complète du répertoire "include" (C:\...\include). ;)

JOL Archives 1.0.1
@ JOL / JeuxOnLine