Avatar billede alexander_j Nybegynder
30. august 2003 - 19:44 Der er 9 kommentarer og
1 løsning

viskelæder til tegneprogram!

Jeg har lavet en lille tegnefilmseditor: http://home19.inet.tele.dk/sirvival/tegnefilm.html - men vil gerne have en vidskelæderfunktion til tegnedelen!

Til at tegne med bruger jeg følgende kode, når musen er nede:
mymovieclip.lineTo(_xmouse,_ymouse);
myarray.push([_xmouse,_ymouse]);
- Og når musen er oppe:
mc_pic.lineStyle(tykkelse,farve,100);
mymovieclip.moveTo(_xmouse,_ymouse);
myarray.push(5,"0xff0000",[_xmouse,_ymouse])

På den måde tegnes der direkte og tegningen gemmes i et array til senere brug!
Men er der nogen der har ide til hvordan man kan indføre en viskelæder-funktion?
Avatar billede barklund Nybegynder
30. august 2003 - 20:16 #1
du er nødt til at lave dine streger i hver sit movieclip:

_global.unik++;
var m = mymovieclip.createEmptyMovieClip("line"+_global.unik, _global.unik);
m.lineStyle(tykkelse,farve,100);
m.moveTo(old_x, old_y);
m.lineTo(_xmouse, _ymouse);
old_x = _xmouse;
old_y = _ymouse;
myarray.push([_xmouse,_ymouse]);

Så kan du tilføje en event der lytter efter, om du har valgt viskelæderet samtidig med at musen er nede og du er over et movieclip, der har en streg. Hvis det er tilfældet, så sletter du det pågældende movieclip. Der smarteste er nok en dragOver:

m.dragOver = function() {
    if (!_root.erasing) return;
    this.removeMovieClip();
}
m.useHandCursor = false;
Avatar billede alexander_j Nybegynder
31. august 2003 - 01:11 #2
Jeg er nok lidt mc-forskrækket - risikerer man ikke, at alle de mange mc's sløver filmen væsenligt? Er lineTo ikke mindre resourcekrævende?

Fandt selv en løsning uden at oprette et hav af mc's:

if(eraser==true){
    for(i=0;i<this["tegning"+nummer].length;i++){
        for(j=0;j<this["tegning"+nummer][i].length;j++){
            if(_xmouse<=this["tegning"+nummer][i][j][0]+155 and _xmouse>=this["tegning"+nummer][i][j][0]+145 and _ymouse<=this["tegning"+nummer][i][j][1]+5 and _ymouse>=this["tegning"+nummer][i][j][1]-5) {
                this["tegning"+nummer][i].splice(j,1);
                dodraw();
            }
        }
    }
}

Det min kode gør er at den går ind og tjekker mit array for sammenfaldende x og y værdier +-5 - og isåfald sletter den denne post i arrayet - og tegner tegningen forfra ud fra arrayet(dodraw)!

Det betyder også at den kun sletter hvis man visker fra en af enderne af stregen og ellers udligner den bare stregen!

Se den i funktion her: http://home19.inet.tele.dk/sirvival/tegnefilm.html

Smid et svar Morten - du ledte mig på sporet til noget brugbart(synes jeg i hvert fald)!
Avatar billede alexander_j Nybegynder
31. august 2003 - 01:18 #3
Måske kan du hjælpe mig med et andet problem i samme ombæring!
Hvis man skriver: myarray1=myarray2; - så vil ændringer i array1 medføre ændringer i array2 og omvendt, derfor skal man istedet bruge: for(i=0;i<myarray.length;i++) myarray2.push(myarray1[i]);
Men hvordan undgår man at eventuelle underarrays henviser til hinanden?
Avatar billede alexander_j Nybegynder
31. august 2003 - 09:14 #4
Kan du gennemskue om den her kode giver en præcis kopi ned i tredje led af under arrays?
//mit array
t=new Array("emne0",["emne1.0","emne1.1"],[["emne2.0.0","emne2.0.1"],"emne2.1.0"]);
t2=new Array();
trace(t);
//kopier array
for(i=0;i<t.length;i++){
    if(t[i]==t[i].toString()){
        t2[i]=t[i];
    } else if(t[i].length>0){
        t2[i]=[];
    }
    for(j=0;j<t[i].length;j++){
        if(t[i][j]==t[i][j].toString()){
            t2[i][j]=t[i][j];
        } else if(t[i][j].length>0){
            t2[i][j]=[];
        }
        for(k=0;k<t[i][j].length;k++){
            if(t[i][j][k]==t[i][j][k].toString()){
                t2[i][j][k]=t[i][j][k];
            } else if(t[i].length>0){
                t2[i][j][k]=[];
            }
        }
    }
}
trace(t2);
Avatar billede alexander_j Nybegynder
31. august 2003 - 09:18 #5
Jeg tror det virker ;)
Avatar billede barklund Nybegynder
31. august 2003 - 12:45 #6
Kan du ikke bare lave en "rigtig" rekursiv copy funktion på Array'ets prototype? Hvis et element har en recursiveCopy funktion, så kører du den:

Array.prototype.recursiveCopy = function() {
    var ret = new Array();
    var i, l = this.length;
    for (i in this) {
        if (typeof this[i].recursiveCopy == "function") {
          ret[i] = this[i].recursiveCopy();
        } else {
          ret[i] = this[i];
        }
    }
    return ret;
}
ASSetPropFlags(Array.prototype, ['recursiveCopy'], 1, 0);
Avatar billede alexander_j Nybegynder
31. august 2003 - 12:53 #7
Av der fik du mig - jeg har aldrig fået sat mig ind i det der prototype-halløj, så det sidste du skrev her blev sort snak for mig ;(
Avatar billede barklund Nybegynder
31. august 2003 - 13:17 #8
Men prøv om ikke det virker:

foo = [[[[1,3],5]];
bar = foo.recursiveCopy();

Hvis det er MX, kunne man endda bruge instanceof istedet for det andet crap ovenover...
Avatar billede alexander_j Nybegynder
31. august 2003 - 17:36 #9
Jeg kan ikke helt tyde din kode - hvis du gider må du meget gerne lave et eksempel til mig(gerne i tegneprogramsstilen),så kan det jo være jeg får lært det der med prototype og rekursiv copy funktioner - for det vil jeg nemlig gerne ;)
Avatar billede barklund Nybegynder
31. august 2003 - 17:54 #10
Du har da et eksempel ovenover... Funktioner på prototypen bliver bare nedarvet via __proto__ egenskaben. Ligger du funktioner på Array'ets prototype, findes det på alle arrays... Leg lidt rundt med det... Se for eksempel http://proto.layer51.com/ for en masse mulige prototyper funktioner
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