02. februar 2002 - 23:26Der er
65 kommentarer og 1 løsning
Når et symbol, og en funktion har samme position ??
Jeg er ved at prøve at lave et simpelt spil i flash. Der skal køre en dims rundt, som man skal skyde. Jeg har fået "kanonen" og kuglerne, der flyver afsted. Men hvordan for man den til at opdage at man rammer målet. -Jeg har skrevet dette
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.
Lav dit mål til et movieClip og lad os give det instance navnet my_target jeg vil antage at my_target nu findes på hovedtidslinien og derfor har stien
_root.my_target
Som ditlev nævner skal du nu tilføje et hitTest(). Dette kan gøres ved at modificere din enterframe action
onClipEvent (enterFrame) { if ( _root.my_target.hitTest(_x,_y,true)) { // kuglen har ramt my_target, så gør noget!! ; } else { if (_name eq "bullet") { t = (t>0) ? t-1 : 0; (Key.isDown(1)) ? shoot() : null; } else { if (x_dir*_x<x_dir*dist_x && y_dir*_y<y_dir*dist_y) { _x += x_change; _y += y_change; } else { this.removeMovieClip(); } } } }
Der er en chance for at du oplever en "forbier" ind imellem hvis x_change og y_change er store. For at undgå denne mulighed kan du evt. nedsætte kuglens hastighed
Jeg kan se, at geo er kommet med et forslag - dette var hvad jeg havde tænkt på. Dette er dog ikke min stærkeste side, så prøv hellere Geo's script først :o)
ditlev>> this.hittest(_root.instancenavn) giver også et hit for de transparente områder (både kuglens og målets default bounds bliver medtaget)
legende.dk>>Ikke just din syntaks men samme idé kan bruges. Vi kan teste aftanden mellem kuglen og målet. hvis denne pludselig begynder at stige kan man gå ind og lave nogle mellemregninger for at sikre sig om kuglen burde have ramt målet eller ej.
Dog ikke noget jeg kan anbefale for dit første spil... nu skal du bare have et skruet sammen så det virker det meste af tiden. Du kan altid tweeke det senere når resten er på plads
Jeg har lige prøvet at sætte dit (lingoman) script på kuglen, og det skal måske siges at kaldet ligger på sigtekornet
onClipEvent (mouseDown) { if (!active) { _root.bullet.skyd(_root._xmouse, _root._ymouse); } }
Nu sker der det underlige at når man rammer holder den op med at bevæge sig (hvilket jo også er fint) men kuglerne klistrer sig til målet !!! og den laver ikke mit gotoandplay. !!! Sært
Den vil ikke virke dersom koordinaterne sjældent er identiske og du sikkert også gerne vil registrere et hit selvom det ikke er centrum der bliver ens.
Aha. Du har gjort det der med framelabel'en og så blot skiftet gotoandPlay'en fra ("scene 2", 1) til ("frameLabel_2"), og så den der removemovieclip.. Jamen det er jo smart. Jeg vidste faktisk heller ikke at man kunne kalde framelabels i andre scener på den måde !!
-Meeen. Når man klikker på målet stopper det bevægelsen. Det er ikke så godt. Det skal ikke være musens klik, der stopper bevægelsen og kører videre.. Det har jeg selv lavet med en knap der flyver rundt !. Den skal flyve videre indtil den blå klat rammer den røde firkant.
Ja, man burde helt afskaffe brug af scene navne i actionscript da alle laver denne fejltagelse og regner med at man kan kalde scener fra andre tidslinier. Det kan man nemlig med frame labels!! Der for er det en god ide at basere sin goto actioner på frame labels :)
Jamen når man klikker på målet stopper det, det gjorde det ikke før, der fløj det bare glad videre, uanset om man ramte noget som helst (svært spil (o; ) Men din rettelse ville være perfekt hvis blot firkanten fløj videre selv om man havde trykket på den. Prøv selv filen !
Jeg vil lige komme med en kommentar, ikke for at ændre i dit meget nice script geo, men bare lige info...
Mht. at lave hitTest, så kan man undgå at bruge hele objektets bounding box, altså undgå at benytte hele kassen om objektet, også der hvor ingen grafik er. Ved at skrive if (this.hitTest(_root._xmouse, _root._ymouse , true)){ så er hit testen kun true når curseren bevæges ind over movieclippet hvor der er 'indhold'. Omvendt er det med false som slut, så er det en 'normal' hitTest.
Synes bare lige jeg ville nævne det, meget nice feature.
1:Ja, det er det eneste der er tilføjet 2: paask vil blot gøre os opmærsom på at syntaks formen _root.my_target.hitTest(_x, _y, true) er bedre end _root.my_target.hitTest(this) fordi den sidste form vil generere et hit selvom man kun rammer den firkantede defaultbox (movieclippets ramme). Den først nævnte med shapeFlag = true sørger for at kun my_target's synlige del bliver taget i betragtning.
if (this.hitTest(_root._xmouse, _root._ymouse , true)){ _root.gotoAndPlay("frameLabel_2"); this.removeMovieClip(); fordi det ikke er cursorens position, men kuglen's der er relevant her. Men det er rigtigt at _root.my_target.hitTest(_x, _y, true) også virker med andre former fks. en cirkel.
Jeg har brugt din kode !!! Men betyder det så at hvis målet ikke lige er en firkant, så rammer man hvis blot man rammer den "blå" firkant rundt om mc'et (altså mc'ets ramme) For så skal det da ændres !
take it easy... Vi har jo brugt den rigtige form helt fra starten ;) Så du kan roligt indsætte et cirkulært eller stjerneformet mål. No problemos amigo!
Du har fuldstændig ret, Barklund. Hvis man skyder længere væk end målet farer rundt, rammer man det, hvis blot kuglen rammer "på vejen". Kan du fikse den med en linie eller to. -Scriptet står jo ovenfor. Det er sat på det script du lavede til mig for et par dage siden (som du måske kan genkende)... Ser frem til dit svar.
Håber du er nær, når jeg får flere problemer, -jeg kan føle der snart er et på vej, når man skal skyde målet f.eks 3 gange før det "ryger helt ned" og målet kun bliver "såret" de første to gange man rammer...............!!! -men den tid den glæde...
No problemo... Du kan blot kalde en funktion på målet i stedet for den ovenstående gotoAndPlay... fx:
if (_root.my_target.hitTest(_x, _y, true)) _root.my_target.hit();
Og så inden i "target" definere en funktion hit() som:
hits = 3; function hit() { if (!(--hit)) gotoAndPlay("dead"); }
Og så have en framelabel inden i dit "target" der animerer en død...
Hvis dine to "såret"-stadier også skal tydeliggøres kan vi omdefinere til:
function hit() { gotoAndPlay("hit_" add ++hits); }
(ikke længere første linie med hits=3 - den skal væk)
Og så har du tre framelabels med henholdsvis "hit_1", "hit_2" og "hit_3". I slutningen af hver har du en stop() men i slutningen af den sidste kan du så have en this.removeMovieClip(), så den forsvinder helt...
Har du opfundet flash (((((((o; Ha Ha Ha ? -Det skulle man fandme tro nogen gange. Det kommer lige til at tage noget tid at prøve dette. Men jeg "ved" jo det virker, hvis blot jeg sætter scripts'ne de rigtige steder. -Det synes jeg er lidt tricky i flash. -Man har et movieclip med frameactions på, dette giver man så objectactions i andre movieclips, og kalder dem vha. andre actions og funktioner. -Det er ikke for børn . Once again,, - Tak
ja... Det skal stå inden i det mc, der hedder "my_target"... Hvis det er dit spørgsmål... Men hvis der inden i my_target ligger endnu et mc, der er bevæget rundt via en guide og det er dette under_mc, der indeholder figurens udseende, så skal funktionen jo istedet kalde_
function hit() { sub_mc.gotoAndPlay("hit_" add ++hits); }
...men hvorfor guider du dit target rundt? Er det for at det bevæger sig? For så ville jeg istedet have scriptet det, så det bliver en mere tilfældig bevægelse... Men det kan vi tage en anden gang...
Som jeg skriver, så skal du sende kaldet til dit under-mc med en eller anden reference til dette...
Du skal så inden i dit inderste mc lave nogle flere frames og i første frame indsætte en stop(). Du laver så nogle keframes med labels som beskrevet tidligere... Husk en stop() til sidst...
Mht. variablen hits, så evaluerer operatoren "++hits" til:
Skal funktionen hit() ligge som frame action i det mc med guidelayeret (my_target) , eller som object action på my_target i hovedfilmen, for den brokker sig med at jeg mangler en onclipevent()til hit()...
Ja... hit() skal enten defineres som en frame action inden i symbolet eller som en object action på symbolets instance... Object actions skal altid ligge i onClipEvent-handlers, og denne er kun fornuftig at putte i en onClipEvent(load)...
onClipEvent(enterFrame) { function hit() { sub_mc.gotoAndPlay("hit_" add ++hits); } }
som object action på my_target i hovedfilmen. Nu brokker den sig ikke mere... Men der sker ikke noget når man rammer målet, og mc'et med målet i har de fire tilstande, stopframes og framelabels "hit_1" etc..
i den lange kode på kuglen, står der som ovenfor beskrevet if (_root.my_target.hitTest(_x, _y, true)) { _root.my_target.hit();
Det skulle være lavet som du har foreslået, men den fatter ikke man rammer !
Nu skifter den fint når man skyder første og anden gang (o;, men tredie gang bliver den bare ved med at køre rundt, og kan ikke skydes mere. Den gør ikke det den skal. Du har nok ret i stierne. Jeg har prøvet med this.removemovieclip() og gotoandplay(etellerandet) i den sidste frame i målet, men den vil ikke.
onClipEvent(load) { function hit() { sub_mc.gotoAndPlay("hit_" add ++hits); } }
onClipEvent(enterFrame) { if (hits == 4) { _root.gotoAndStop("frameLabel_2"); } }
Så "dør" målet når hits=4 , smart. Tak for hjælpen.
-Jeg opretter lige et spørgsmål (til dig) om den tilfældige bevægelse af målet fremfor guidelayeret.
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.