Avatar billede baitianlong Nybegynder
31. januar 2002 - 19:31 Der er 23 kommentarer og
1 løsning

Skyd til musepos. ??!?!!?!?

Hvordan får man et movieclip til at flyve fra hjørnet af flashen (eller andre steder) til musens pos. når der klikkes.

Som i så-godt-som alle skydespil !!

Når man klikker skal den sende musens pos. til sidste frame i en tweening, så man skyder der hvor cursoren er, eller noget  !?
Avatar billede barklund Nybegynder
31. januar 2002 - 19:43 #1
Nænej... Tweening er statisk og kan ikke genereres dynamisk... Du skal kode det hele... Først laver du din "kugle" om til et movieClip... På dette sætter du disse actions:

onClipEvent(load) {
    _visible = 0;
    start_x = _x;
    start_y = _y;
    antal_frames = 20;
    function skyd(x,y) {
        dest_x = x;
        dest_y = y;
        active = 1;
        t = 0;
    }
    active = 0;
}
onClipEvent(enterFrame) {
    if (active) {
        t++;
        if (t > antal_frames) {
            active = 0;
            _visible = 0;
        }
        _x = start_x+t*(dest_x-start_x)/antal_frames;
        _y = start_y+t*(dest_y-start_y)/antal_frames;
    }
}

Prøv det engang...


/barklund
Avatar billede barklund Nybegynder
31. januar 2002 - 19:44 #2
Nåja... Du skal navngive din kugle i instance-panelet med fx "bullet".

Når du så vil skyde (fx fra en knap), så kalder du:

_root.bullet.skyd(_root._xmouse, _root._ymouse);

Du kan så også angive nogle præcise koordinater, hvor kuglen skal skydes hen...

/Barklund
Avatar billede lingoman Nybegynder
31. januar 2002 - 19:46 #3
og så

onClipEvent(mouseDown) {
  skyd(_root._xmouse,_root._ymouse);
}

mvh geo
Avatar billede lingoman Nybegynder
31. januar 2002 - 19:51 #4
Få kuglen til at hele tiden flytte sig hen mod musen ved hvert klik med

onClipEvent(mouseDown) {
    start_x = _x;
    start_y = _y;
   
  skyd(_root._xmouse,_root._ymouse);
}
Avatar billede baitianlong Nybegynder
31. januar 2002 - 20:06 #5
Jeg kan ikke få det til at virke.

Jeg har lavet en knap (usynlig, med kun hitframe) som fylder hele skærmen, den havde jeg tænkt mig at lægge i øverste lag, så kuglen skulle flyve fra hjørnet til musepos. onclick...

fortæl videre  (o;
Avatar billede barklund Nybegynder
31. januar 2002 - 20:19 #6
Hvorfor en knap? Er det for at fange museklik? Så bare skriv på din "bullet" som lingoman siger:

onClipEvent(mouseDown) {
  skyd(_root._xmouse,_root._ymouse);
}

Eller hvis man ikke skal kunne skyde "igen" - altså mens kuglen flyver:

onClipEvent(mouseDown) {
    if (!active)
        skyd(_root._xmouse,_root._ymouse);
}

/Barklund
Avatar billede baitianlong Nybegynder
31. januar 2002 - 20:26 #7
OK Jeg har droppet knappen, som fylder hele skærmen (dårlig idé) .
Nu har jeg sat

onClipEvent(mouseDown) {
  skyd(_root._xmouse,_root._ymouse);
}

på sigtekornet / cursoren..

Og den lange kode fra Barklund som objectaction på "kuglen", som jeg har placeret i nederste højre hjørne.

"test"filmen har kun to layers, sigtekornet og kuglen..

Men når man trykker sker der ikke noget...
Avatar billede barklund Nybegynder
31. januar 2002 - 20:33 #8
Nej... Det skyldes, at du ikke har korrekt sti til funktionen skyd()... Jeg troede, at du ville sætte den på bullet, men du satte den på dit sigtekort... Så skal du kalde den med:

_root.bullet.skyd(_root._xmouse,_root._ymouse);

Men om du sætter den det ene eller det andet sted er ligemeget...

/Barklund
Avatar billede barklund Nybegynder
31. januar 2002 - 20:35 #9
hov... Nu object action:

onClipEvent(load) {
    _visible = 0;
    start_x = _x;
    start_y = _y;
    antal_frames = 20;
    function skyd(x,y) {
        dest_x = x;
        dest_y = y;
        _visible = 1;
        t = 0;
    }
}
onClipEvent(enterFrame) {
    if (_visible) {
        t++;
        if (t > antal_frames) {
            _visible = 0;
        }
        _x = start_x+t*(dest_x-start_x)/antal_frames;
        _y = start_y+t*(dest_y-start_y)/antal_frames;
    }
}

Jeg brugte _visible og active til det samme, men glemte at sætte _visible true når man skød - dumme mig :o)

/Barklund
Avatar billede barklund Nybegynder
31. januar 2002 - 20:36 #10
og det skulle have stået "Ny Object Action"... paste den ovenover ind i stedet...
Avatar billede baitianlong Nybegynder
31. januar 2002 - 20:56 #11
Nu er det lykkedes... Men nu bliver jeg måske lidt kritisk  (o;

Hvis man skyder igen, før den forrige kugle er fremme, forsvinder den første kugle !!! Man skal kunne skyde salver, eller også skal den køre "tweeningen" færdig, før den kan begynde på en ny !!!

Og endelig...

Kan man gøre sådan at den ikke altid er 20 frames om det, (hastigheden på kuglen skal være den samme uanset hvor langt der er !!!)
Avatar billede lingoman Nybegynder
31. januar 2002 - 21:05 #12
Det kan man også sagtens men det ville nu have sparet os for en del hvis du blot havde skrevet det i dit oprindelige spørgsmål...
Avatar billede baitianlong Nybegynder
31. januar 2002 - 21:08 #13
Den kugle der er på vej skal ikke forsvinde når man sender en mere !
Avatar billede barklund Nybegynder
01. februar 2002 - 13:15 #14
Så er det som lingoman antyder en helt anden problemstilling... Men det kan lade sig gøre...
Avatar billede lingoman Nybegynder
01. februar 2002 - 14:20 #15
legende.dk>> Jeg vil nu gerne forslå at du accepterer barklunds svar da det mere end besvarer dit første spørgsmål. Jeg kan også garanterer dig for at du vil få svar, af mig hvis ikke andre kommer først, på det andet spørgsmål hvis du opretter det som et nyt spørgsmål.
barklund>> smider du lige et svar så legende.dk har mulighed for at lukke ?
Avatar billede baitianlong Nybegynder
01. februar 2002 - 15:13 #16
Barklund har skrevet :"Eller hvis man ikke skal kunne skyde "igen" - altså mens kuglen flyver:

onClipEvent(mouseDown) {
    if (!active)
        skyd(_root._xmouse,_root._ymouse);
}

Det er jo hvad jeg er ude efter...(sådan da). Jeg synes det er tyndt at kuglen, som er på vej forsvinder hvis brugeren trykker igen (det tror jeg i selv er enige i).

Men jeg opretter et nyt spørgsmål, hvis det er nødvendigt...
Avatar billede barklund Nybegynder
01. februar 2002 - 16:13 #17
Med konstant hastighed skal det rekonstrures helt og arbejde med nogle vektoriserede koordinater... Og hvis man skal skyde flere gange, skal det være duplicateMovieClip istedet for blot at arbejde på det samme igen og igen...

Men vi kan godt lave en ny fætter, der gør dette... For 60 point? Ja, så okay da... Det tager lige lidt tid...
Avatar billede barklund Nybegynder
01. februar 2002 - 16:25 #18
Okay... Her:

onClipEvent(load) {
    if (_name eq "bullet") {
        _visible = 0;
        t = 0
        function shoot() {
            this.duplicateMovieClip("bull_" add int(_root._xmouse) add "_" add int(_root._ymouse), ++depth);
            t = 5;
        }
    } else {
        var speed = 15; // change here....
        dist_x = int(_name.split("_")[1]);
        dist_y = int(_name.split("_")[2]);
        var angle = Math.atan2(dist_y-_y,dist_x-_x);
        x_change = speed*Math.cos(angle);
        y_change = speed*Math.sin(angle);
        x_dir = x_change > 0 ? 1 : -1;
        y_dir = y_change > 0 ? 1 : -1;
    }
}
onClipEvent(enterFrame) {
    if (_name eq "bullet") {
        t = (t > 0) ? t-1 : 0;
    } 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();
        }
    }
}

onClipEvent(mouseDown) {
    if (_name eq "bullet")
        shoot();
}

Variablen speed kan du ændre...

/Barklund
Avatar billede barklund Nybegynder
01. februar 2002 - 16:27 #19
Variablen t angiver hvor hurtigt efter hinanden man kan skyde... Sættes den til 0 kan man skyde hele tiden... Der var en lille fejl... Her:

onClipEvent(load) {
    if (_name eq "bullet") {
        _visible = 0;
        t = 0
        function shoot() {
            if (!t) {
                this.duplicateMovieClip("bull_" add int(_root._xmouse) add "_" add int(_root._ymouse), ++depth);
                t = 3; // change here...
            }
        }
    } else {
        var speed = 15; // change here...
        dist_x = int(_name.split("_")[1]);
        dist_y = int(_name.split("_")[2]);
        var angle = Math.atan2(dist_y-_y,dist_x-_x);
        x_change = speed*Math.cos(angle);
        y_change = speed*Math.sin(angle);
        x_dir = x_change > 0 ? 1 : -1;
        y_dir = y_change > 0 ? 1 : -1;
    }
}
onClipEvent(enterFrame) {
    if (_name eq "bullet") {
        t = (t > 0) ? t-1 : 0;
    } 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();
        }
    }
}

onClipEvent(mouseDown) {
    if (_name eq "bullet")
        shoot();
}

Sådan...

/Barklund
Avatar billede barklund Nybegynder
01. februar 2002 - 16:27 #20
(Jeg må indrømme, at jeg var nødt til at åbne flash for at skrive denne kode - kunne ikke helt generere den i hovedet... :o)
Avatar billede lingoman Nybegynder
01. februar 2002 - 16:31 #21
;) så mangler du bare et svarfelt barklund!
Avatar billede barklund Nybegynder
01. februar 2002 - 16:34 #22
...nåja....
Avatar billede baitianlong Nybegynder
01. februar 2002 - 16:38 #23
I er fandme nogen røvere. Hvordan bliver man så sej til at programmere. Jeg mener actionscript minder meget om java, er i Javaeksperter, selvlærte/uddannede ?? -eller hva'

Jeg skal lige prøve det nye script. Vender tilbage med "løn"-posen
Avatar billede baitianlong Nybegynder
01. februar 2002 - 16:44 #24
Det virker fantastisk nu.... Og dine små hjælpelinier med hastigheden osv. er perfekte..
Hvad skal vi nu stille op med det andet spørgsmål. Hent du points'ne der også Barklund !!  (o;
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