07. juni 2005 - 09:10Der er
37 kommentarer og 2 løsninger
delay i flash.
Hej eksperter.
Jeg er ved at lave et shoot'em up spil, og skal have scriptet mine fjender.
Jeg placerer alle mine fjender på scenen. der er 10 fjender, kaldet mvc1 - 10. De er alle skjulte med setProperty(_root.mvc1, _visible, false) Jeg skal så have fikset en function der kan sørge for at vise 1 af de 10 fjender i 3 sekunder, og der må samtidig ikke vises andre fjender før min fjende er forsvundet igen.
Hvordan skal jeg gribe det an? jeg har kigget på setInterval men har ikke helt styr på det.
Men har problemer med min mvcvar - hvis jeg skriver mvc1, så er det kun mvc1 der vil fjerne sig fra scenen igen, skriver jeg mvc2 er det toeren der kun vil. Prøver jeg så, som i dette script at sørge for at mvc1 eller mvc2 bliver hentet fra en variabel, så virker det slet ikke :(
Som i nok kan se prøver jeg at få udløst enemy() når, min property bliver sat til false. Men det virker ikke, den kører godt nok enemy og mvc bliver også synlig. Men den vil ikke fjerne movieclippet som udløser enemy().
hvad er fejlen?
PS: har udkommenteret enemy() fordi det ikke virkede som det skulle ;D
Hej igen --- hvis du eksportere benytter clip'et til actionscript ved at bruge attachMovieclip() eller duplicateMovieClip(); can du bare bruge ditClipInstance_mc.removieMovieClip(); du må selv lige tjekke metode navnene dem får man squ stavet forkert ;0)
Og skylder du mig ikke noget karima/point for mit svar ;0)
//lave et movieclip giv det navnet name_mc vælg linkage "Export for actionscript" //sæt koden _root timeline stop(); this.attachMovie("name_mc", "newName_mc", 500); var timeout:Number = getTimer()+1000; newName_mc.onEnterFrame = function() { if (getTimer()>this._parent.timeout) { this.removeMovieClip(); } }; Prøv det så kan du se hvad der sker ;) Jeg går udfra du koder til flashplayer 6 eller højere!!
Iøvrigt kan jeg ikke lide setProperty() den er lidt af en oldtimer gør helere sådan her : clip_mc._vísible = false;
stop(); this.attachMovie("name_mc", "newName_mc", 500); var timeout:Number = getTimer()+1000; newName_mc.onEnterFrame = function() { if (getTimer()>this._parent.timeout) { this.removeMovieClip(); // Ødelægger onEnterFrame så den stopper med at opdatere // og tage resourcer delete newName_mc.onEnterFrame; } };
flash_geek, ok - du ser godt nok ud til at have styr på tingene ;D
Jeg har fået det til at virke det nye du sendte mig. Men - det er ikke helt det jeg prøver på ;D
Ok - here goes.
Jeg har et symbol - som er min enemy, han skal placeres forskellige steder på min scene, da han ikke må kunne dukke frem midt i en bygning - altså, han skal kun dukke frem der hvor jeg har placeret ham fra start. Derfor placerer jeg ham i alle mine vinduer og alle mine døre - og skal så have ham til at poppe frem forskellige steder, og være synlig og "shootable" i 3 sek, fra han popper frem. Håber du kan følge mig :D
Mht det sidste du skriver med variablen mcvar er det vigtigt du for står at mcvar skal være en reference til et udgaver(instances) af movieclip objektet. På denne måde: så hvis du gerne vil referere til flere movie clip en løkke stuktur kan du benytte dette syntaks:
this["mcvar" + i + "_mc"]._visible = false; Nb! this er tidslinien og kunne lige så godt hedde _root eller _parent. Og i er din iterant eller couter.
----
Mht en løsning af dit problem så må vi nok fortsætte som du er begyndte:
Istedet for at benytte visiblity propertien ville jeg nok bruge starte med at lave tre tomme movie clip. Pladsere dem - lad os klade dem con0_mc, con1_mc og con2_mc husk at instantiere dem så vi kan referere til dem. Disse pladseres der hvor du vil have din enemies skal dukke op. Så kan nemlig bruge attachMovie(); til at attache dine enimies. For at attache dem skal du åbne dit bibiotek og finde dit enemy symbol og højre klikke og vælge linkage og sætte kryds i til "Export for actionscript" og "Export in first frame" og rette indintifiere til enemyMC -- dette gør at vi kan benytte enemyMC at runtime.
Så laver vi en funktion vi kalder enemyUpdate() som vi kalder ved at benytte global funktionen setInterval();
function enemyUpdate(){ //fjerner lige curEnemy som blev oprettet i forgående //kørsel curEnemy.removeMovieClip(); //først skal vi sikre at enemy ikke dukker op samme sted //vi vil generere værdierne 0, 1 eller 2 var n:Number = Math.floor(Math.random()*3)-1; // laver en men reference var r = _root["con" + n + "_mc]; //lad os trylle en enemy frem r.attachMovie("enemyMC", "enemy" + n, 100+n);
//så skal vi oprette en reference vi kan bruge til //at fjerne nuværende denne enemy når functionen kører igen curEnemy = r["enemy"+n];
}
//så laver vi vores setInterval set up intervalID = setInterval("enemyUpdate", 30000);
Sådan her ville jeg gøre. Prøv at se om du kan få det til at virke. Iøvrigt stopper du setInterval igen ved hjælp af intervalID og clearInterval -- clearInterval(intervalID);
Du kan også benytte removeMovieClip(); når slutbrugeren rammer dine enemies.
Denne kode er ikke debugget og testet så der er med garanti stavefejl. I flash findes ingen 'option explicit desværre ;oP
Du kan også bare hyre mig $-) Kunne lave en fed OOP løsning. Bare af nygerrighed hvor skal spillet bruges? Jeg får squ helt lyst til at lave sjove spil istedet for e-learning tools som jeg roder med til dagligt.
ja eller du kan også bare skrive mcvar._visible = true; Men så skal mcvar være en reference til et movie clip. Ellers er dette at fortrække: this[mcvar]._visible = false. -- Dette vedr. #20:16:05
morgen flash_geek - jamen lidt baggrund, Jeg kan desværre ikke hyre di. Jeg sidder pt i malaysia, og er ved at lave final assignment hernede, jeg er ved at uddanne mig til multimediedesigner, og har kastet mig ud i flash actionscripting uden nogen videre viden om det, hvilket du nok også efterhånden har fundet ud af hehe. Det skal afleveres på om en uge fra i morgen. Så jeg er ved at være lidt presset med at få det hele til at virke, så jeg værdsætter virkelig din hjælp meget. Og med det arbejde du har gjort for mig indtil nu er du sikret den bedste karma og alle point(så det skal du ikke tænke på ;D) men jeg får nok brug for hjælp løbende, er det noget du eventuelt kunne være behjælpelig med ? Jeg er selvfølgelig villig til at smide flere point i puljen.
hejsa, Jeg vil da meget gerne kigge på din løsning. Og sige hvor du kan stremme op. Jeg er fuldtids udvikler og arbejder op mod 70 timer om ugen. Jeg har bare lige nogle afslappede dage. Hvor jeg ikke har så travlt.
Jeg kan nok mest hjælpe dig med kode som ikke virker. Og prøve at give dig en forståelse af flash. Jeg er certificeret macromedia flash udvikler og har arbejdet med actionscripting i 4 år.
Desværre må du forstå at jeg ikke kan gå ind i dit projekt fuldt ud. Men jeg kan give dig støtte undervejs. Så lærer du en hel masse og du skal nok bliver færdig.
Jeg har lidt problemer med at få din guide til at virke:
Dette er hvad jeg har nu:
function enemyUpdate(){ curEnemy.removeMovieClip(); var n:Number = Math.floor(Math.random()*3)-1; var r = _root["con" + n + "_mc"]; r.attachMovie("enemyMC", "enemy" + n, 100+n); curEnemy = r["enemy"+n];
} intervalID = setInterval(enemyUpdate(), 3000);
Og det hele er i frame 1
Den vil gerne smide en fjende frem, men den fjerner den ikke igen og der kommer ikke nogle nye frem.
Men jeg bryder mig ikke om den random metode Macromedia har lavet den er ikke ramdom nok hvis du forstå hvad jeg mener. Der sker nemlig det at hvis den kaldes i samme interval med setInterval så bliver resultatet det samme. Så jeg måtte droppe at benytte setInterval.
Men her er koden:
stop();
//initialize view function init(){ var mcArray:Array = [mvc1, mvc2, mvc3]; var len = mcArray.length; for(var i:Number=0; i<len; i++){ mcArray[i]._visible = false; } rand; time = getTimer()+100; }
//remdomize function randRange(min:Number, max:Number):Number { var randomNum:Number = Math.round(Math.random()*(max-min))+min; trace("random " + randomNum);
//assign timer 1 again time = getTimer()+3000; Skal denne altid være større end: timeout = getTimer()+1500; ? jeg ville jo gerne have at min nye fjende skulle være synlig med det samme, eller at man kan styre det med en timer - som jeg også tror du gør her.
Bemærk også at timer1 bliver assigned til 100 for at sætte første kørsel hurtigere igang. Og ja timer1 skal gives den størreste værdi. Men du kan prøve dig frem indtil du er tilfreds med hastigen. : )
Jamen det ser jo ganske godt ud. Måske kunne det også have været en løsning at lægge baggrund og bygninger ind i samme movieclip også bare bevæge dette movieclip. Hvis jeg forstår det rigtigt. Men når koden virker holder vi fast iden. Godt gået : ) Jeg adder dig imorgen på min messenger så kan du skrive direkte til mig.
Det lyder godt, det ser jeg frem til. Mht at adde bygningerne i samme movieklip, så var det egentlig også min plan, men det ville jo gøre så jeg ikke kunne placere mine fjender i bygningerne, hver bygning består af 2 layers, pånær 1, nemlig b3 - som også har en altan ;D Men jeg viser dig lige min progress når du har addet mig.
Jeg testede af om man kunne tilføje f.eks. en knap i et movieklip for at se om man kunne lave så det kun var knappen der var aktiv i movieklippet - dette mislykkedes for mig. Jeg kunne aktivere knappen ligemeget hvor jeg trykkede på hele movieklippet. Derfor opgav jeg det, og løste det på den tidligere viste måde :D
Fint fint jeg fik lavet to dvd - jeg brugt Adobe Encore - super program. Nemt at oprette dvd titel- og rodmenu. Er godt integreret med Photoshop og AfterEffects. Og man kan brænde dvd'erene direkte. Tidsrøveren er tilretningerne i AfterEffects :D
Hvordan går det hos dig har du haft tid til at kigge på de links jeg gav dig?
Så er du added. Desværre har jeg ikke så meget tid imorgen. Der er møder og det er produktions dag. Også har jeg et Microsoft Webcast jeg skal deltage i -- men det er level300 så det er nok temlig langhåret men så kan jeg stå he he 8-)
Jeg har fået meget hjælp fra flash_geek til at lave mit spil. Derfor har jeg valgt at give ham 200 point. - Jeg ligger mit spil til download inklusiv .fla filer, så folk kan drage fuld fordel af dem. - Dette sker dog først når jeg kommer til Danmark igen omkring d. 5 Juli - så omkring den tid kan mit færdige spil ses.
Mvh Fjappe :D
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.