incrémentation basique....Décrémentation qui me pose probléme

Répondre
Partager Rechercher
Bonjour tout le monde!

Aprés avoir créé un script pour simuler des apparitions de traces de pas au sol , une fois les prims des traces de pas liées , le script ajouté , je me rend compte que j'ai link les prims a l'envers.... la pas de problème a la place d'une incrémentation je me dis qu'il suffit de faire une Décrémentation.... sauf que voila le script :

integer total_prims;
integer link_counter;

default

{
state_entry()

{
total_prims = llGetNumberOfPrims();
llSay(0, (string) total_prims);
llSetTimerEvent(0.8);
}

timer()

{

link_counter++;
llSetLinkAlpha(LINK_SET, 0.0 , ALL_SIDES);
llSetLinkAlpha(link_counter,1.0, ALL_SIDES);

if ( link_counter == total_prims)
{

link_counter = 0;
}
}
}

et la je pense qu'il suffit de changer "link_counter++; " par "link_counter--;"....mais non... je me demande ce que j'ai raté la ...

au delà de la solution je ne suis pas contre d'une bonne petite explication en règle ...

Bon sinon je sais qu'il me suffit de remettre l'ordre de link dans le bon sens pour que le truc fonctionne dans le bon sens sans rien changer a mon script mais ....comme j'aime bien comprendre ....
C est assez simple :
supposons par exemple que tu aies 10 prims :
si au lieu de dire "je vais de la prim 0 à la prim 9" , tu dis "je vais de lla prim 9 à la prim 0" , il
ne te suffit pas de dire que tu décrémentes , mais que les valeurs initiales et les valeurs finales sont inversées

Autrement dit ,
* ton test "if ( link_counter == total_prims)" devient "if ( link_counter == 0)"
* ta réinitialisation "link_counter = 0;" devient "link_counter = total_prims;"
* ta variable non initialisé , c est à dire initialisé à 0 par "ilink_counter" nécessite une initialisation "link_counter = total_prims"

Ce qui nous fait le code suivant ( j ai mis en gras les lignes changées ou additionnées:

integer total_prims;
integer link_counter;

default
{
state_entry()
{
total_prims = llGetNumberOfPrims();
llSay(0, (string) total_prims);
llSetTimerEvent(0.8);
link_counter = total_prims ;
}

timer()
{
link_counter--;
llSetLinkAlpha(LINK_SET, 0.0 , ALL_SIDES);
llSetLinkAlpha(link_counter,1.0, ALL_SIDES);

if ( link_counter == 0)
{
link_counter = total_prims ;
}
}
}


Un autre moyen , encore plus simple , aurait été de de laisser inchangé le code et laisser l incrémentation , mais changer uniquement
les instructions qui modifient l état des prims , en inversant le numéro qui les concerne :
llSetLinkAlpha(link_counter,1.0, ALL_SIDES) par llSetLinkAlpha(total_prims -link_counter,1.0, ALL_SIDES);
Dans ce cas là , c est un peu comme si tu disais "je vais de la prim 0 à 9 , mais je change la prim 10-numéro de prim"

PS : c est assez chiant lea balise metawiki PHP ainsi que CODE , ainsi que spoiler qui ne marchent plus . Y a t il une solution ?

Dernière modification par redpurple ; 21/10/2018 à 12h52.
Citation :
Publié par redpurple
C est assez simple :
supposons par exemple que tu aies 10 prims :
si au lieu de dire "je vais de la prim 0 à la prim 9" , tu dis "je vais de lla prim 9 à la prim 0" , il
ne te suffit pas de dire que tu décrémentes , mais que les valeurs initiales et les valeurs finales sont inversées

Autrement dit ,
* ton test "if ( link_counter == total_prims)" devient "if ( link_counter == 0)"
* ta réinitialisation "link_counter = 0;" devient "link_counter = total_prims;"
* ta variable non initialisé , c est à dire initialisé à 0 par "ilink_counter" nécessite une initialisation "link_counter = total_prims"

Ce qui nous fait le code suivant ( j ai mis en gras les lignes changées ou additionnées:

integer total_prims;
integer link_counter;

default
{
state_entry()
{
total_prims = llGetNumberOfPrims();
llSay(0, (string) total_prims);
llSetTimerEvent(0.8);
link_counter = total_prims ;
}

timer()
{
link_counter--;
llSetLinkAlpha(LINK_SET, 0.0 , ALL_SIDES);
llSetLinkAlpha(link_counter,1.0, ALL_SIDES);

if ( link_counter == 0)
{
link_counter = total_prims ;
}
}
}


Un autre moyen , encore plus simple , aurait été de de laisser inchangé le code et laisser l incrémentation , mais changer uniquement
les instructions qui modifient l état des prims , en inversant le numéro qui les concerne :
llSetLinkAlpha(link_counter,1.0, ALL_SIDES) par llSetLinkAlpha(total_prims -link_counter,1.0, ALL_SIDES);
Dans ce cas là , c est un peu comme si tu disais "je vais de la prim 0 à 9 , mais je change la prim 10-numéro de prim"

PS : c est assez chiant lea balise metawiki PHP ainsi que CODE , ainsi que spoiler qui ne marchent plus . Y a t il une solution ?
Merci pour ta réponse "redpurple" mais je dois bien reconnaître que pour moi comprendre comment un "truc " fonctionne dans un script il faut que j'arrive a le traduire en français.... ben oui je ne suis pas programmeur a la base donc toujours en mode débrouille et la :

"Autrement dit ,
* ton test "if ( link_counter == total_prims)" devient "if ( link_counter == 0)"
* ta réinitialisation "link_counter = 0;" devient "link_counter = total_prims;"
* ta variable non initialisé , c est à dire initialisé à 0 par "ilink_counter" nécessite une initialisation "link_counter = total_prims"

"( link_counter == total_prims)" devient "if ( link_counter == 0)" heu ..... ok mais pourquoi ?
""link_counter = 0;" devient "link_counter = total_prims;"" toujours pourquoi ?
Citation :
Publié par mappa story
Merci pour ta réponse "redpurple" mais je dois bien reconnaître que pour moi comprendre comment un "truc " fonctionne dans un script il faut que j'arrive a le traduire en français.... ben oui je ne suis pas programmeur a la base donc toujours en mode débrouille et la :

"Autrement dit ,
* ton test "if ( link_counter == total_prims)" devient "if ( link_counter == 0)"
* ta réinitialisation "link_counter = 0;" devient "link_counter = total_prims;"
* ta variable non initialisé , c est à dire initialisé à 0 par "ilink_counter" nécessite une initialisation "link_counter = total_prims"

"( link_counter == total_prims)" devient "if ( link_counter == 0)" heu ..... ok mais pourquoi ?
""link_counter = 0;" devient "link_counter = total_prims;"" toujours pourquoi ?
Comme je te l ai marqué là :

si au lieu de dire :
"je vais de la prim 0 à la prim 9" , tu dis "je vais de la prim 9 à la prim 0" ,
ll ne te suffit pas de dire que tu décrémentes , mais il faut aussi que ru dises que les valeurs initiales et les valeurs finales sont inversées

Tu parcours ton carnet d adresse de A jusqu à Z
Tu as la la lettre courante
Au départ la lettre courante vaut A , tu lis , ce qu il y a dans la page A .
Puis tu incrémentes la lettre courante . A devient B
et tu lis ce qu il y a dans la page de la lettre courant
Si la lettre courante devient Z , tu t arretes

Supposons maintenant que tu veuilles inverser ton parcours de ton carnet d adresse de Z jusqu à A
Tu as la la lettre courante
Au départ la lettre courante vaut Z , tu lis , ce qu il y a dans la page Z .
Puis tu décrémentes la lettre courante . Z devient Y
et tu lis ce qu il y a dans la page de la lettre courant
Si la lettre courante devient A , tu t arretes

C est le même raisonnement avec tes prims

Ce que tu faisais en n ayant changé que l incrémentation en décrémentation sans changement des autres lignes revenait à dire , pour reprendre l exemple du carnet d adresses à :
Tu as la la lettre courante
Au départ la lettre courante vaut A , tu lis , ce qu il y a dans la page A .
Puis tu décrémentes la lettre courante . A devient une lettre inexistante
et tu essayes de lire ce qu il y a dans la page de la lettre courant
Si la lettre courante devient Z , tu t arretes
Ce qui est évidemment faux

Dernière modification par redpurple ; 21/10/2018 à 13h58.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés