21. december 2004 - 12:12Der er
8 kommentarer og 2 løsninger
Problemer med functions (tror jeg nok)
Jeg har lavet et spil hvor jeg har with() action inde i functioner Eks: this.onMouseDown = function() { this.Point = this.Point - 1; // Viser Skud-ild with (this.Skyder) { gotoAndStop(2); }
Når spillet er slut. springes der til en anden frame (main-timeline) hvor intet Actionscript ligger, alligevel får jeg en masse fejl som alle hedder
Error: A 'with' action failed because the specified object did not exist.
Mit spg. er altså hvorfor bliver actionscriptet sat i gang hvis det ikke ligger i den frame? Og hvad kan jeg gøre for at forhindre dette. Nedenfor har jeg vedlagt stort set alt mit actionscript:
// Når FM-Mænd-Rammes this.onMouseDown = function() { this.Point = this.Point - 1; // Viser Skud-ild with (this.Skyder) { gotoAndStop(2); } // Tjekker om FM1 bliver ramt if (this.FM1.hitTest(_root._xmouse, _root._ymouse, true)) { // Lægger 1 til point this.Point = this.Point + 1;
// Får FM1 til at "dø" with (this.FM1) { gotoAndPlay(random(50) +150); } } // Tjekker om FM2 bliver ramt if (this.FM2.hitTest(_root._xmouse, _root._ymouse, true)) { // Lægger 1 til point this.Point = this.Point + 1; // Får FM2 til at "dø" with (this.FM2) { gotoAndStop(random(50) +150); } } // Tjekker om FM3 bliver ramt if (this.FM3.hitTest(_root._xmouse, _root._ymouse, true)) { // Lægger 1 til point this.Point = this.Point + 1; // Får FM3 til at "dø" with (this.FM3) { gotoAndStop(random(50) +150); } }
// Tjekker om FM4 bliver ramt if (this.FM4 .hitTest(_root._xmouse, _root._ymouse, true)) { // Lægger 1 til point this.Point = this.Point + 1; // Får FM4 til at "dø" with (this.FM4) { gotoAndStop(random(40) +150); } }
// Tjekker om FM5 bliver ramt if (this.FM5.hitTest(_root._xmouse, _root._ymouse, true)) { // Lægger 1 til point this.Point = this.Point + 1; // Får FM4 til at "dø" with (this.FM5) { gotoAndStop(random(40) +150); } }
// FM1 kommer ind this.tid = 0; this.onEnterFrame = function() {
this.tid = this.tid + 1;
if (this.tid > 50) { with (this.FM1){ nextFrame(); } } // FM2 kommer ind if (this.tid > 100) { with (this.FM2){ nextFrame(); } } // FM3 kommer ind if (this.tid > 150) { with (this.FM3){ nextFrame(); } } // FM4 kommer ind if (this.tid > 200) { with (this.FM4){ nextFrame(); } }
// FM5 kommer ind if (this.tid > 50) { with (this.FM5){ nextFrame(); } } }
this.onMouseDown = function(){ this.Point -= 1; // Viser Skud-ild this.Skyder.gotoAndStop(2); // Tjekker om FM'erne bliver ramt: for(i=1;i<=5;i++){ if(!this["FM"+i]){ trace("FM"+i+" eksisterer ikke); continue; } if (this["FM"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // Lægger 1 til point this.Point += 1; // Får FM til at "dø" this["FM"+i].gotoAndStop(random(50) +150); } } } };
uh. det ser sku' lækekert ud, og det virker også. men hvorfor er with() ikke så smart at bruge? En anden ting. Jeg kan ikke få et sceneskift til at virke. Den går bare til frame 1 i den samme scene. Jeg har skrevet følgende på en knap:
on (release) { gotoAndStop("spillet", 1) // Spillet er navnet på scenen at jeg vil gå til }
with() - ja - der er bare ikke nogen grund til at bruge den, gør det mere besværligt og uoverskueligt end nødvendigt... og er nærmest udgået i det nye actionscript...
Ang. scener kan barklund nok komme med en del grimme ord om dem. Scener findes ikke så snart flashen compiles, og kan derfor være skyld i en masse fejl, fordi folk glemmer at tidslinien faktisk er én hel, og koden fra scene1 og findes i scene2. Hvis du prøver at skifte scene inde fra et movieclip, så virker det ikke - sådan er det bare...
Så drop scener og brug movieclips og frames med labels i stedet...
with() er skam fin nok - kan sagtens bruges til en hel masse ting og har lige så stor fokus nu som tidligere as-versioner. Den gamle tellTarget derimod, der mindede "lidt" om den, er udgået.
Du kan godt bruge scener (hvis du synes), men brug så framelabels, så din første frame i scenen "spillet" for eksempel har label "spillet_1_frame" - så kan du hoppe til den ved at skrive:
_root.gotoAndStop("spillet_1_frame");
Hvis du insisterer på at bruge scener betegnelser (og dermed 2-arguments versionen af gotoAndX, såskal du bruge den ovennævnte, udgåede tellTarget:
Jeg vidste godt at telltarget er deprecated, og with() var den nye. Men hvor skal man bruge with og hvornår for.
_root.gotoAndStop("spillet_1_frame"); virker forresten som en mis. men er det ikke muligt at bruge: gotoAndStop("spillet", 1) under gotoAndStop() i hjælpefunktioner står der: gotoAndStop([scene,] frame) og er det ikke det jeg gør?
Laver I ikke et svar hver? Er I begge tilfredse med at Pyroman får 70 og Barklund 30? Tusind tak for hjælpen.
lige en sidste ting som også har med with() at gøre. Jeg har tilføjet en linie til pyromans optimering af mit script
if (this["FM"+i].hitTest(_root._xmouse, _root._ymouse, true)) { // Lægger 1 til point Point += 1; // Viser visuelt hvor mange point brugeren har with (this.PointMC) { // tilføjet nextFrame(); // tilføjet } // tilføjet
Det virker underligt nok selv om at hitTest ikke bliver aktiveret
Det er ingen situationer, hvor man SKAL bruge with() til noget som helst - så lad venligst være med at tilføje den igen til dit script i situationer, hvor den ingenting har at gøre :)
Man kan for eksempel bruge with, hvis man har en sætning som:
Altså, man kan sagtens undlade with - og man bør slet ikke bruge den i alle de situationer, hvor du gør det. Og hvorfor insisterer du på at gøre det igen, når pyroman netop har fjernet det alle de øvrige steder. Du skal bare skrive:
if (this["FM"+i].hitTest(_root._xmouse, _root._ymouse, true)) { Point++; PointMC.nextFrame(); }
Noget helt andet er, at man normalt ikke skriver variabler med stort start-bogstav.
Mht. gotoAndStop og scenereferencer, så hvis du i hjælpen kigger under _funktionen_ gotoAndStop, så står der rigtig nok ([scene,] label), men ikke under _metoden_ gotoAndStop på MovieClip klassen.
Og vil du bruge funktionen, skal du samtidig med være i det rigtige scope på den forkerte måde :/ Og det kan ikke lade sig gøre uden at tellTarget'e til roden af filmen først.
Tro nu bare på, at når vi siger det hænger sammen på den og den måde, så paser det faktisk ;)
(og læg venligst mærke til de mange smileys rundt omkring ;))
random() er faktisk også udgået - i stedet bør man bruge følgende kode:
Math.floor(Math.random()*TAL);
så kan man jo lave sin egen funktion hvis man vil:
function random (num){ return Math.floor(Math.random()*num); }
-men mange vælger alligevel stadig at bruge den gamle forudlavede funktion... men hvem ved? måske ryger den helt væk en dag og så skal de alle ud og rette det til...
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.