23. februar 2002 - 22:13Der er
57 kommentarer og 1 løsning
Trace OnClick vol. III
Hej venner.
Jeg er ved at forsøge på at lave en flashfilm, der skal virke sådan lidt semi-intelligent set fra brugerens side. Den skal vide hvilke knapper og hvilken vej brugeren har valgt gennem sitet - og dermed give indtryk af at filmen kan "se" brugeren, holder øje med ham og sender ham til steder i filmen, som giver udtryk for at filmen véd at han har været her før.
Projektet her går ud på at få alle knapper i filmen til at skrive en unik værdi i et array når man trykker på den, samt at detecte hvilke andre værdier der findes i dette array.
Jeg har været lidt på banen med dette spørgsmål - og har fået meget hjælp, men nu har jeg mistet overblikket. Nu kunne jeg godt ønske mig noget hjælp til at få trådende samlet.
Følgende scripts skulle tilsammen give hvad jeg har brug for:
Script på frame 1 i _root:
arrButtons = new Array(); iButtons = 0;
Script(s) på knapperne: (som skriver det nummer det MC som knappen ligger inde i, har fået af mig)
function addButton (_name.slice(4))) { arrButtonsPressed[0] = 30; iButtons++; }
Og..
on (press) {
answerList = [3,7,43,39]; correctAnswers = 0;
for ( i = 0; i < answerList.length ; i++) { if (_root.arrButtons[i] != answerList[i]) { gotoAndStop(3); break; } else { correctAnswer ++; if (correctAnswers == answerList.length ) { gotoAndStop(4); } } }
}
..som detecter hvilke tal mit array består af (altså, hvilke knapper brugeren har trykket på gennem filmen (og som dermed detecter hvor brugeren har været.))
Spørgsmålet er nu: Hvordan får jag sat de to scripts til knapperne sammen til eet script?
Og..
Er det script der sidder på første frame i _root rigtigt indsat(jeg tvivler ikke på pixelpaws kompetencer, men derimod på min egen evne til at forstå den ordenligt :) Jeg forestiller mig bare at der skulle stå noget á la OnEnterFrame eller sådannoget for at arrayet egentlig virker..?
Jeg vil blive helt fantastik lykkelig, hvis der sidder nogle kloge hoveder derude et sted og vil hjælpe mig med at få dether lille projekt til at lykkes.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
Jeg har tjekket dit første spørgsmål og kan se hvad du har haft i tankerne, men det barklund gav dig som forklaring har du brugt som kode.. jeg sætter det sammen så det bliver samlet
1: Føje ny værdi til array når der trykkes på knappen
2: Tjekke hvilke værdier array består af, hvilken rækkefølge og fører brugeren videre iht. answerlist.
Jeg går ud fra at jeg kan ændre på answerlist som det passer mig, så forskellige værdier og rækkefølger skal være opfyldt før brugeren sendes videre..?
Jeg er ikke helt sikker på du forstår hvad jeg egentlig mener, for jeg føler sådan at jeg sidder og vrøvler :)
Her er endnu en lille liste over dét jeg er ude efter..
1. Føj knappens værdi til array 2. Tjek om værdier jeg deffinere for hver knap findes array 3. Tjek om værdierne findes i den rækkefølge(r) jeg har deffineret dem i
(Det ville være fjong, hvis jeg kunne deffinere forskellige rækkefølger)
Ja, knapperne ligger i hver deres MC med navn. Men jeg kunne nu godt tænke mig at de blot havde numre.. Eks. 3, 8, 9 osv..
(Desuden kan der nemt blive mere end 30 knapper i denher film.. Jeg véd ikke lige hvor du har tallet fra? :)
Nej, der skal være forksel på om tallet findes i array, eller om det findes i en foruddeffineret rækkefølge. Hvis array består af 3,6,9 så skal destinationen være forskellig, hvis array var 6,9,3.
På den anden side, Geo, så dether med relative og absolutte arrays er måske ikke så nødvendig i første omgang.. Men når det en dag bliver nødvendigt, så bliver det også nødvendigt at kunne deffinere flere answerlist's for hver knap.
Desuden, er det ikke ligegyldigt hvad knapperne hedder - hvis den hed "Peter" ville den vel også blive tilføjet i array, samtidigt med at jeg vil kunne deffinere den i answerlist?
Du kan godt sende fla'en men jeg laver det først i morgen.
indsæt dette i første frame
arrButtons = [2,3,4]; iButtons = 0;
Vi skal også have afklring på hvad du virklig ønsker!!
Er du klar over at sådan som du har opbygget knap actionen har brugeren INGEN mulighed for at korrigere en evt. fejl ?
hvis vi siger et den korrekte sekvens er [2,3,4], men brugeren kommer til at trykke fks. knap 1 først og opdager sin fejl. derefter trykkes der på 2,3,4 som er rigtige..men dette bliver tolket som [1,2,3,4] som er forkert! Er det meningen ?
Ham, Paask lavede en slice-funktion, så kun det 5. tal i knappens navn blev tilføjet - men det vil nu være det bedste hvis jeg kunne kalde knappen hvad jeg nu har lyst til og kalde den med samme navn i Answerlist.. :)
1) knappens tal findes ikke i answerlist 2) knappens tal findes i answerlist men ikke i den rigtige plads 3) knappens tal finees i answerlist og på den rigtige plads i rækkefølgen
Hvilke frames skal den gotoAndStop() for hver af disse muligheder ?
Vi lader knappen få en variabel du kan justere enkeltvis så vi ikke behøver at følge nogen navngivnings konvention.
Hvilke frames skal den gotoAndStop()for hver af disse muligheder ?
Æh, ikke helt forstået..? :)
Du behøver ikke at spekulere hvilke frames den skal gå til for hver af disse muligheder, det må jeg regne ud senere.. Men altså, eksempeltvis til frame 2, hvis 1 ikke findes i answerlist (fordi knap et vil føre til frame 2) - men kommer man tilbage til frame et og trykker på den igen, så bliver man dirrigeret til eks. frame 5.
Kommentar fra lingoman 23/02-2002 23:29:34 Der skal altså være 3 forskellige destinationer
1) knappens tal findes ikke i answerlist 2) knappens tal findes i answerlist men ikke i den rigtige plads 3) knappens tal finees i answerlist og på den rigtige plads i rækkefølgen
Der skal faktisk være 4.. Også een hvor tallet findes i answerlist.. (Faktisk den vigtigeste)
Anyway. Dét jeg er ude efter er som sagt et script der kan detecte hvilke knapper brugeren har trykket på før.
Jeg forsøgte at lave en lille film til dig med 4 menupunkter, hvor du henholdvis kunne være under menupunktet 1. gang, du kunne stadigvæk være under menupunktet (når du trykkede på det samme menupunkt som du allerede var på) og du kunne være på menupunktet 2. gang. Det ville kræve 4x4x4 knapper at lave.
Jeg troede jeg kunne skride analytisk fremad og lave små grupper af frames på min timeline á 4 frames (et frame for hver menupunkt) og så lade knapperne der henvise til et frame i de øvrige grupper. Jeg lavede således en gruppe med fire frames for hvert 1.besøg af de fire menupunkter, en gruppe som du bliver henvist til, når du trykker på den samme knap/menupunkt som du allerede var på. og en gruppe for hver gang du besøgte menupunktet 2. gang. Men jeg ramlede så ind i et problem i den gruppe man bliver henvist til, når man trykker på den samme knap, som den man allerede står på, for her er du umuligt at sige hvor mange gange du allerede har været på under de øvrige menupunkter; medmindre jeg lavede endnu tre gruppe man bliver henvist til (henholdsvis efter hvor mange gange man har været på de øvrige menupunkter, hvilket vil føre til 4x(4x4)x4 kombinationsmuligheder. Derfor vil det jo være rart med et script der kunne holde styr på dét :)
Har lige tænkt lidt..
Vi reducerer lidt på den lille liste over ting scriptet skal kunne holde styr på:
1) knappens tal/navn findes i answerlist x antal gange. 2) knappens tal/navn findes i answerlist og i en deffineret rækkefølge. (det skal her være muligt at deffinere flere "answerlists".)
Det kunne her være helt lækkert, hvis jeg kunne lære evt. at indsætte noget ekstra til nr.1, såsom hvis x < y og hvis jeg kan deffinere flere destinationer alt efter hvad x er .. Men i første omgang er det rigeligt, hvis jeg bare kan bruge x en enkelt gang.
Uha, det er lidt af et projekt dether.. Faktisk udspringer det lidt af en interesse for kunstig intelligens, og jeg tænkte nu om man ikke kan lave en lidt tillempet intelligens, som kan holde styr på hvilke knapper der har været trykket på i en flashfilm, og på den måde have mulighed for at lave en film, som brugeren vil føle lidt som "levende"..
Scriptet skal skrive navne/tal ned i et array, når der bliver trykket på knappen - og de skal tilføjes i den rækkefølge knapperne bliver trykket på. Man kan eksempeltvis have et array der hedder (5,9,4,5,2,9) hvor det samme tal godt kan stå opført flere gange.
Så langt så godt.
Derudover skal der være en trace-funktion i knappen, hvor vi så er kommet ind på en aswerlist, eller måske rettere en løsningsmængde. Det er her det bliver lidt svært for mig at deffinere hvilke variabler der er nødvendige..
Jeg forestiller mig: 1) knappens tal/navn findes i answerlist x antal gange, GoTo and stop. Her skal det på en måde være muligt at tilføje så mange answerlists, knappenavne, ligninger og x værdier, som jeg har lyst til på denne måde: Hvis knap1 findes i answerlist 3 gange, så GoTo and stop. Hvis knap1 findes i answerlist 9 gange, så GoTo and stop et amdet sted. Derudover vil det jo være helt fjong hvis man kan bruge basal matematik her, så som If knap5 findes i answerlist < end 5 gange, så GoTo and Stop.
2) 2) knappens tal/navn findes i answerlist og i en deffineret rækkefølge. (det skal her være muligt at deffinere flere "answerlists".)Altså, lads os sige jeg her kan deffinere flere answerlist, og det her er rækkefølgen i de tal answerlist består af; altså, hvis answerlist er (6,8,3,9) eller (5,8,2,3) så GoTo and stop :)
Har du dig en dejlig dag ude i solskinsvejret? *S*
Når du siger gotoAndStop() er det så i selve MC'en som knappen befinder sig i, eller er det hovedfilmen der skal hoppes i ? Ja, jeg har haft en dejlig dag med ungerne :)
Æhm, nej umiddelbart ikke.. Det bliver min egen hovedpine i så fald.
Men jeg kan vel altid ændre og tilføje hvor jeg gerne vil have knappen skal gå hen, ikke? Arrayet skal blot være globalt.. Er det ikke muligt at lave det sådan?
Jamen, jeg kan ikke lige gennemskue hvad der vil være det nemmeste for dig, for har jeg muligheden får både at bruge dem i et MC og på hovedelinien vil det jo være det bedste.
Men giver det dig nogle kvaler, så kalkulér med at de eneste MC'er der er, er dem knapperne selv ligger i på hovedlinien. :)
Så laver jeg alle actionerne på et tomt MC som knapperne skal kalde hver gang der bliver klikket på en så det bliver uafhængigt af den øvrige struktur. Hver knap får tildelt et navn du selv ændrer. Jeg er dog lidt bange for at du ikke har gennemtænkt mulighederne.
Nu hvor du vil have flere answerlists per knap, hvad sker der i det øjeblik den ene answerlist giver 3 tilfælde af knappen, og en anden answerlist giver 5 eller 0 ? Hvor skal den så hen ?
Du har nok ret i, at der kan opstå tilfælde, hvor de forkellige answerlists kan give et resultat, som vil skabe noget kludder, men umiddelbart vil jeg gemme dette problem til når jeg sidder med et stort stykke papir og laver sitemappet over den side jeg kunne tænke mig at afprøve dether på. Jeg må jo være sikker på at lave nogle answerlists, som ikke træder hinanden over tæerne..
Hvilke muligheder er det du er bange for jeg ikke har tænkt igennem? Jeg ser selv mange muligheder i dether - og kan ikke rumme dem allesammen i mit lille hovede, så jeg enkelt og præcist kan fortælle dig hvad det er hele pointen vil være.. Men det jeg søger her er et redskab (et script med deffinerbare værdier og variabler) som jeg kan lege lidt med og forhåbenligt finde ud af hvordan jeg strukturer et sådan site bedst muligt og hvilke answerlist jeg skal lave (og ikke lave), for at der ikke går kludder i det..
Nu ser jeg lige at du skriver: "Så laver jeg alle actionerne på et tomt MC som knapperne skal kalde hver gang der bliver klikket på en så det bliver uafhængigt af den øvrige struktur."
Det er ihvertfald vigtigt her, at hver knap har sin egen answerlist - om så selve actionen('erne) ligger i et moviclip for sig selv, vil jo være godt, for så behøver man ikke at duplikerer det samme script over på alle knapper, dvs. datamængden jo bliver mindre.
Men jf. dit tidligere script har jeg da svært ved at se hvordan vi kan nøjes med kun at have det een gang i filmen, for hver knap skal jo ikke gå det samme sted hen..? :/
//Lav et MC på hovedtidslinien og giv det instance navnet "actionMC" i instance panelet. //Denne MC skal være til stede på hovedtidslinens frames lige fra den første frame //med knapper til den sidste frame med knapperne.
//sæt denne action på actionMC
onClipEvent(load) { UserActionList = [];
function addUserAction(knapID) { //Her gemmer vi alle resultater UserActionList.push(knapID); }
function CheckUserActionListFor(knapID) { //hvor mange gange har brugeren klikket på knapID ? HvorMangeGange = findHowManyTimes(knapID,UserActionList); return HvorMangeGange; }
function ErUserActionListLigMed( answerList ) { //sammenlign UserActionList med answerList UserActionListErRigtig = equalArrays (UserActionList, answerList ); return UserActionListErRigtig; }
function findHowManyTimes(findWhat,InWhichList) { //Denne funktion giver svar på hvor mange gange findwhat blev fundet i Array InWhichList var found = 0; for (var i = 0; i < InWhichList.length; i++) { if (InWhichList[i] == findWhat) { found++ ; } } return found; }
function equalArrays (array_1, array_2) { //Denne funktion giver svar på om array_1 og array_2 er identiske //svaret er enten true eller false
for (var i = 0; i < array_1.length; i++) { if (array_1[i] != array_2[i]) { return false ; } } return true ;
}
function searchArray( whichArray,searchElement) {
//Denne funktion prøver at finde searchElement i Array whichArray //Hvis seachElement ikke findes i whichArray giver den svaret null //Ellers finder den indexpositionen , i, på den aller første seachElement der bliver fundet
for (var i = 0; i < whichArray.length; i++) { if (whichArray[i]== searchElement) { return i; } } return null; }
}
//Det var de funktioner som vi skal være i stand til at kalde fra vore knapper. //Nu tager vi knap actionerne
on (release) { var knapID = 4; // Her skal du selv finde på unikke navne eller tal til hver knap var answerList_1 = [2,3,4]; // Disse må kun indeholde gyldige knapID'er som elementer var answerList_2 = [1,3,4]; // dette eksempel har kun 2 answerLists, //men du kan selv tilføje flere og indsætte andre tests
// Tilføj brugerens klik i Array "UserActionList" som actionMC holder styr på _root.actionMC.addUserAction(knapID);
//Lad os finde ud af hvor mange gange der er klikket på denne knap var antalKlik = _root.actionMC.CheckUserActionListFor(knapID)
//Er answerList_1 og UserActionList det samme? (svar true/false) svar_1 = _root.actionMC.ErUserActionListLigMed( answerList_1) ;
//Er answerList_2 og UserActionList det samme? (svar true/false) svar_2 = _root.actionMC.ErUserActionListLigMed( answerList_2) ;
//Nu gør vi et eller andet som er afhængig af de svar vi fik for oven
/////////////////////////////////////////////////////////// // Herfra kan du selv ændre actionen så hver knap gør noget forskelligt ///////////////////////////////////////////////////////////
//Hvis brugeren har klikket på denne knap 5 gange eller mere, //så hop til frame 23 på hovedtidlinien if ( antalKlik >= 5) { _root.gotoAndStop(23); }
//Hvis answerlist_1 og brugerens valg er identiske if (svar_1) { _root.gotoAndStop(4); //hop til frame 4 på maintimeline }
//Hvis answerlist_2 og brugerens valg er identiske if (svar_2) { _root.gotoAndStop(10); //hop til frame 10 på maintimeline }
//Hvis hverken answerlist_1 eller answerlist_2 stemte med brugerens valg if (!svar_1 && !svar_2) { _root.gotoAndStop("Sorry"); //hop til frameLabel "Sorry" på maintimeline }
}
1) Alt dette forudsætter at du har navngivet movieClip instancet som "actionMC" og at det altid findes på maintimeline. 2) Jeg har i den sidste if sætning antaget at du har et frame label som hedder "Sorry" på maintimeline som der hoppes til hvis hverken answerList_1 eller answerList_2 passer med UserActionList.
Håber at koden er kommenteret tilstrækkelig til at du selv kan ændre det senere.
Du kan eventuelt placere actionMC uden for det synlige stage område. Koden er fleksibel nok til at vi kan tilføje andre if-else sætninger HUSK! Hver knap skal have et UNIKT knapID.
Uh, det er smukt! Jeg må vist lige læse det igennem et par gange..
Tænk, et script som dether: function CheckUserActionListFor(knapID) { //hvor mange gange har brugeren klikket på knapID ? HvorMangeGange = findHowManyTimes(knapID,UserActionList); return HvorMangeGange; }
..der er ikke et eneste tal indvolveret! Jeg syns' det er flot! Det er lige sådan et script, som dummies som mig kan lære af!
Tak skal du have, Geo. Du får dine hårdt tjente point. :)
David -
PS. Lige en helt anden ting. Du kender tilfældigvis ikke nogen der vil leje et værelse ud? Jeg har lidt i tankerne at jeg må spørge Nikolaj også, da han og kæretsen vist overvejede dette.. Jeg kan bare ikke lige få fat på ham.. :)
Fy david! Den slags må vi hellere maile om! Der er jo privat :/
De kan godt være at der mangler "}" eller ";" hist og her men så må du råbe op. Desuden vil jeg gerne hjælpe dig videre her hvis du skal have ændringer/tilføjelser så der er ikke brug for at oprette nye spørgsmål når du allerede har givet mig 150 point for dette :)
Tænk ikke så meget på pointene Geo. Du har jo brugt en frygtelig masse tid på dether; og det sætter jeg stor pris på, altså. :)
Men en anden ting er jo, at hvis jeg vil spørge om noget ad dether script, så er dette spørgsmål vel stedet at gøre det? Jeg får da ihvertfald fat i den rigtige person.. ;)
Jeg vil lave min matematikaflevering færdig og så gå igang med at se ordenligt på det derefter..
Mange linjer i actionerne for oven kan forkortes men det gør det også lidt svært at forstå. Derfor har jeg med vilje brugt nogle ekstra...
Matematik! Må jeg ikke være MEEeeD :))
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.