Salut à tous.
Bon je suis un nouveau venu sur Flashkod, alors je me présente tres vite fais, Cyril, 30 ans, fou de Flash...
Bon, en surfant j'ai vu que certains s'etaient essayés à GTA sur Flash, et bien voyez-vous moi aussi, et c'est en cherchant une source pour m'aider à résoudre mon problème que je suis tombé sur FlashKod.
Mon projet est presque fini et je pourrai le mettre à dispo pour ceux que çà interresse, c'est pratiquement le jeu tel qu'il est commercialisé hormis la gestion de la 3D ( à plat ), là c'est de la 2D pure.
Seulement voilà, j'ai un problème :Je cherche une solution à la gestion de la circulation des voitures.J'ai volontairement abandonné les solutions suivantes :- Guide
J'ai choisit de partir sur la base d'une Intelligence artificielle, comme si les voitures avaient chacune un conducteur, donc un "moteur" propre.
Afin de gérer les paramétres du "moteur" il me faut des déclencheurs, des repéres au sol qui vont dire au moteur de la voiture; "tourne à droite, arrétes toi, tourne à gauche, vas tout droit."
La vitesse de la voiture est fixée par défaut.
Celà impose la création et la gestion en permanence d'un grand nombre d'objets interractifs :
Les Voitures ( environs 50 par ville )
Les Carrefours ( plus de 100 par ville, donne les indications de direction )
Les Feux ( plus de 100 par ville, donne les indications de marche/arret )
Rien qu'à partir de cette description on peux s'apperçevoir que si chaque objet comporte un moteur unique le code va être lourd, mais qu'importe si le moteur de chaque objet reste léger, c'est à dire qu'il ne fait pas intervenir à tout moment un grand nombre de calculs mais juste un seul à un instant précis.
On en arrive à mon problème.Afin de gérer mes objets sans avoir pour chaque chaque objet à nommer la totalité des objets avec lesquels il risque d'interragir ( imaginez un peu la lourdeur du code et le temps qu'il faut pour le taper .....
if (this.hitTest(_root.carrefour1)) {
setProperty(this, _rotation, _rotation += -90);
}
if (this.hitTest(_root.carrefour2)) {
setProperty(this, _rotation, _rotation += -90);
....
), je passes par une astuce.
Prenons l'exemple des voitures entre elles :Chaque objet 'voiture' est nommée :
'voiture'+chiffre
voiture1
voiture2
voiture...
Pour faire un test de collision entre deux voitures je vais donc exécuter un test en permanence pour savoir si le nom de la voiture existe et si cette voiture est en contact ou pas avec mon objet en cours ( la voiture où se trouve ce code ) :
//
//
MOTEUR DE LA VOITURE NON JOUEUR//
// Déclaration des variables internes au clip à la l'ouverture du clip
//
onClipEvent (load) {
runtest = 600;
}
//
// A la lecture du clip...
//
onClipEvent (enterFrame) {
//
// Arret de la voiture en cas de choc avec une autre voiture
// Hormis de celle-ci
//
for (e=0; e<50; e++) {
if ((_root['voiture'+e]!= this && _root['voiture'+e].hitTest(this._x, this._y, true)) {
runtest =0;
runtest -=Random(300);
}
}
//
// DEPLACEMENT DE LA VOITURE
//
// L'incrémentation de 'runtest' par pas de 10 de 0 à 600
// Permet de faire redémarer la voiture lentement puis del la laisser accélérer progressivement jusqu'a sa vitesse max
//
if (runtest<600) {
runtest +=10;
}
this = _x+=MATH.cos(_rotation*(math.pi/180))*runtest/100;
this = _y+=MATH.sin(_rotation*(math.pi/180))*runtest/100;
}
Ce code marche très bien, a chaque moment il vérifies toutes les valeurs de 0 à 50, puis vérifies si 'voiture'+valeur correspond bien à une voiture qui existe ( si valeur est comprise entre 0 et 50 ), et enfin il si les conditons sont remplies, il teste si 'voiture'+valeur est différent de cet obhet ( This ) et si 'voiture'+valeur est bien en contact avec cet objet ( This ).
Si toutes les conditions sont remplies et execute le code qui suit à savoir; il met la vitesse à 0.
Tout va donc bien c'est ce que je voulais faire, j'ai remplacé : if (this.hitTest(_root.voiture1)) {
runtest =0;
}
if (this.hitTest(_root.voiture2)) {
runtest =0;
....
Par
for (e=0; e<50; e++) {
if ((_root['voiture'+e]!= this && _root['voiture'+e].hitTest(this._x, this._y, true)) {
runtest =0;
}
}
PROBLEME :
Imaginez ce code réutilisé pour : les voitures entre elles, les carrefours, les feux et tout le reste....
A chaque fois le code boucle sur 50 + 50 + 50 + ...multiplié par le nombre de voitures qui contient ce code, soit 50 par ville = BEAUCOUP TROP !!!!
Bien evidement le jeu se met à ramer à mort ce qui est logique vu le nombre de boucles qu'il execute au même moment.
J'ai deux pistes pour régler mon problème :- Créer un moteur unique externe aux objets qui renvoie pour chaque interraction entre deux objets une valeur propre à la cible ( les objets en interractions )
- Créer une sorte de tableau dans mon code pour chaque voiture et trouver une fonction de native de l'ActionScript qui permet de vérifier si une valeur existe à tout moment dans mon tableau sans pour autant tester toutes les valeurs du tableau.
OUF !
Voilà, merci à tous ceux qui ont lu jusqu'ici, et surtout à ceux qui auront ne serait-ce même qu'un début de solution...
Aide de programmeur demandée :-)
Bonne journée.
Papoulai.