Avatar billede Six Nybegynder
07. juni 2005 - 09:10 Der 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.

Kan nogle hjælpe mig?
Avatar billede flash_geek Nybegynder
07. juni 2005 - 10:05 #1
Her lidt hjælp:

var timeout = getTimer() + 1000;
this.onEnterFrame = function (){
if (getTimer() > timeout){
  //tiden er gået!!!!!
}
}
Sådan ;o)
Avatar billede Six Nybegynder
07. juni 2005 - 11:10 #2
hey flash_geek.

jeg prøver at ommøblere dit script til dette:
-------------Frame 1 --------------------
setProperty(_root.mvc1, _visible, false);
                       
function showMVC():Void {
    var timeout = getTimer() + 1000;
    setInterval(setProperty(_root.mvc1, _visible, true),100);
}
showMVC();
function hideMVC():Void {
    setInterval(setProperty(_root.mvc1, _visible, false),1000);
}

---------------------Frame 2---------------------
showMVC();
this.onEnterFrame = function() {
    if (getTimer()>timeout) {
        hideMVC();
    }
};


Men det vil ikke rigtigt virke - den fjerne ikke movieklippet igen :(
Avatar billede Six Nybegynder
07. juni 2005 - 11:12 #3
frame 2:
showMVC();

if (getTimer()>timeout) {
    hideMVC();
}

istedet men det virker stadig ikke :(

Skal jeg have lavet timeout variablen global på en måde, for at jeg kan hente den i frame 2 ?
Avatar billede Six Nybegynder
07. juni 2005 - 12:41 #4
Jeg er nu kommet så langt.

var timeout = getTimer()+3000;
setProperty(_root.mvc1, _visible, false);
setProperty(_root.mvc2, _visible, false);

function randRange(min:Number, max:Number):Number {
  var randomNum:Number = Math.round(Math.random()*(max-min))+min;
  return randomNum;
}

mvcvar = "mvc" + randRange(1,2);

mvcvar.onEnterFrame = function() {
    setProperty(mvcvar, _visible, true);
    if (getTimer()>_root.timeout) {
        setProperty(this, _visible, false);
        _root.timeout = 0;
    }
};
stop();

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 :(

Hvordan kan jeg løse det ?
Avatar billede Six Nybegynder
07. juni 2005 - 13:40 #5
Nu er jeg kommet hertil :D
-------------------------FRAME 1 AS-------------------
setProperty(mvc1, _visible, false);
setProperty(mvc2, _visible, false);
setProperty(mvc3, _visible, false);
function randRange(min:Number, max:Number):Number {
  var randomNum:Number = Math.round(Math.random()*(max-min))+min;
  return randomNum;
}
function enemy(mvcvar) {
    timeout = getTimer()+3000;
    setProperty(mvcvar, _visible, true);
}
enemy("mvc" + randRange(1,3));
stop();
-------------------------FRAME 1 AS---------------------

Og så på mine mvc's:

onClipEvent (enterFrame) {
    if (getTimer()>_root.timeout) {
        setProperty(this, _visible, false);
        //_root.enemy("mvc" + _root.randRange(1, 3));
    }
}

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
Avatar billede flash_geek Nybegynder
07. juni 2005 - 14:31 #6
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)
Avatar billede Six Nybegynder
07. juni 2005 - 14:51 #7
hey - jeg er ikke med på hvordan du mener. Kan du give mig et eksempel ?

og jo jeg skal nok give dig point, når jeg lukker spørgsmålet ;D
Avatar billede flash_geek Nybegynder
07. juni 2005 - 15:43 #8
He he ;-)

//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;

Håber du forstår 8-)
Avatar billede flash_geek Nybegynder
07. juni 2005 - 15:51 #9
iøvrigt skal du huske at ødelægge onEnterFrame:

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;
    }
};
Avatar billede Six Nybegynder
07. juni 2005 - 19:28 #10
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

Er det noget du kan hjælpe mig med ?
Avatar billede Six Nybegynder
07. juni 2005 - 19:33 #11
mcvar + ._visible = true; <- hvordan skal dette skrives? mcvar er en variabel
Avatar billede Six Nybegynder
07. juni 2005 - 20:16 #12
eval(mvcvar)._visible = true; <- løser #19:33:21
Avatar billede flash_geek Nybegynder
07. juni 2005 - 21:29 #13
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.

Glæder mig til lidt karisma eller points ;op

Hilsen Thomas Riis : )
Avatar billede flash_geek Nybegynder
07. juni 2005 - 21:36 #14
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
Avatar billede Six Nybegynder
08. juni 2005 - 08:25 #15
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.

Mvh.
Mikkel Soelberg
Avatar billede flash_geek Nybegynder
08. juni 2005 - 09:37 #16
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.

Hyg dig -- Keep on working

;o) Thomas
Avatar billede flash_geek Nybegynder
08. juni 2005 - 09:43 #17
Kan lige se at jeg lavede en dum fejl -- det må have været min dumme tvilling.

this[mcvar] er noget sludder -- skulle naturligvis være this["mcvar"] det er et associativ array. Sorry about that one. ;oP
Avatar billede Six Nybegynder
08. juni 2005 - 12:17 #18
Jeg vil værdsætte al den hjælp du kan give mig undervejs, og det bliver jo nok også mest til kode :D

Hvor bliver man certificeret flashudvikler ?
Avatar billede Six Nybegynder
08. juni 2005 - 12:24 #19
btw - er det iorden at vi finder ud af point og karisma når jeg har afleveret ? dvs. d. 15 i denne måned. Jeg skal fremlægge og aflevere den 16.

Jeg vil gerne give dig en god slant point - :D
Avatar billede Six Nybegynder
08. juni 2005 - 12:42 #20
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.
Avatar billede Six Nybegynder
08. juni 2005 - 12:48 #21
jeg har lagt min egen version op på mit webhotel som fla fil, så du kan se hvad jeg er ved. www.fjappe.dk/enemy.fla
Avatar billede flash_geek Nybegynder
08. juni 2005 - 12:57 #22
umiddelbart er fejlen i din setInterval assigning

skal se sådan ud:
intervalID = setInterval(enemyUpdate, 3000);

Hvad for en meddelse får du hvis du skriver

trace(_root); inde i funktionen?

;o) du bliver certificeret ved at tage en certificerings eksamen hos pearson vue  også kommer du på Macromedias hjemmeside *g*
Avatar billede flash_geek Nybegynder
08. juni 2005 - 13:03 #23
Nå den kunne ie squ ikke klare -- men godt vi har firefox -- !!Yes
Avatar billede Six Nybegynder
08. juni 2005 - 13:29 #24
firefox rox :D - prøver lige trace(_root) og den skal prøves i enemyUpdate funktionen ?
Avatar billede Six Nybegynder
08. juni 2005 - 13:30 #25
jeg får et svar der hedder _level10
Avatar billede flash_geek Nybegynder
08. juni 2005 - 15:54 #26
Her nu har jeg fået din kode til at virke:

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);

    return randomNum;
}

//control enemy
function enemy(mvcvar:MovieClip) {
    mvcvar._visible = true;
    curEnemy = mvcvar;
}

this.onEnterFrame = function(){
    if(getTimer()> time){
      //fetch a number billy bob
      rand = randRange(1,3);
     
      //assign timer 1 again
      time = getTimer()+3000;
     
      //assign timer 2 which controls
      //how long the enemy will be seen
      timeout = getTimer()+1500;
     
      //invoke enemy
      enemy(this["mvc" +  rand]);
    }
    //hide the enemy
    if(getTimer()> timeout){
        curEnemy._visible = false;
    }
 
}
//Initialize application
init();


Slet det du har stående og sæt dette ind. Du skal også slette onClipEvent(enterFrame) fra dine enemies (altså actionscripten i dine movieclips.

Jeg tror det var godt du fik noget hjælp der var ikke helt til højre benet -- det drillede ;OP
Avatar billede flash_geek Nybegynder
08. juni 2005 - 16:01 #27
mht: 12:42:30 - Så tror jeg bare vi skal droppe den kode. Og undskyld at jeg lod dig hænge ;-)
Avatar billede Six Nybegynder
08. juni 2005 - 16:20 #28
Det der, det er snart lige ved og næsten ! :D - er det sådan at du har en msn adresse så jeg kan tilføje dig på msn ?
Avatar billede Six Nybegynder
08. juni 2005 - 16:25 #29
i dit script her:     

//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.
Avatar billede Six Nybegynder
08. juni 2005 - 16:27 #30
jeg fangede den ;D 3000 kan jeg jo så bare ændre til 1600 f.eks :D
Avatar billede flash_geek Nybegynder
08. juni 2005 - 17:25 #31
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. : )
Avatar billede Six Nybegynder
08. juni 2005 - 18:57 #32
mjello igen :D - havde du msn messenger ?, hvis du har så kunne det være rart hvis du vil adde mig, fjappe-fjappe.dk - = @ :D

Jeg er ved at sætte min by op, og har et lille problem. Jeg skal have mine bygninger til at flytte sig, sammen med min baggrund.
Avatar billede Six Nybegynder
08. juni 2005 - 23:01 #33
byproblem løst, med følgende kode:

function movebuilding(buildings, staticx) {
    w = buildings._width/2;
    bg_w = staticx+350;
    buildings._x = citybg._x+bg_w+w;
    updateAfterEvent();
}

function onMouseMove() {
    if (_xmouse>=0 && _xmouse<=800) {
        citybg._x = _xmouse/800*-700;
        updateAfterEvent();
        var mcArray:Array = [b1, b1bg, b2, b2bg, b3, b3bg, b3fence, b4, b4bg, b5, b5bg, b6, b6bg, b7, b7bg];
        var mcxArray:Array = [-320.0, -307.0, -106.0, -103.0, 24.1, 34.6, 102.8, 399.9, 419.6, 387.1, 394.8, 655.6, 674.0, 885.2, 893.7];
        var len = mcArray.length;
        for (var i = 0; i<len; i++) {
            movebuilding(mcArray[i], mcxArray[i]);
        }
    }
}
Avatar billede flash_geek Nybegynder
08. juni 2005 - 23:18 #34
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.


Hyg dig : )
Avatar billede Six Nybegynder
09. juni 2005 - 08:07 #35
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
Avatar billede flash_geek Nybegynder
09. juni 2005 - 10:05 #36
Så skulle du bare lægget et movieclip inde i din by movieclip og lade dette være din knap. Du  kan sagtens lave følgende this.clip_mc.subClip_mc.subSubClip.myButton_btn reference. Indefra knappen (myButton_btn) kan man så tale med clip_mc ved at skrive this._parent._parent._parent.gotoAndPlay("my_label");
Prøv at se disse links: http://www.actionscript.org/tutorials/beginner/paths/index2.shtml
http://www.actionscript.org/tutorials/intermediate/advanced_pathing/index.shtml


Jeg adder dig senere -  lige nu jeg har skal jeg oprette en dvd med små kort film ---jeg skal have hurtigt klar :o]
Avatar billede Six Nybegynder
09. juni 2005 - 18:17 #37
Hvordan står det til med dvd'en? :D
Avatar billede flash_geek Nybegynder
09. juni 2005 - 21:04 #38
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-)
Avatar billede Six Nybegynder
16. juni 2005 - 16:49 #39
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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester