CS4 ActionScript 2.0 pohyblivá ciara

Programovacie jazyky, rady, poradňa...
COTHW
Medium Star
Medium Star
Príspevky: 497
Registrovaný: 08 aug 2009, 15:37

CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa COTHW »

Ahoj,
googlil som, hladal na hojku ale stále neviem nájsť návod, ako vo Flashi urobiť pohyblivú čiaru (kábel). Pre objasnenie, jedná sa o to, že potrebujem mať, zrejme najlepšie movie clip, ktorý predstavuje súčiastku a čiarami (káble) pospájať správne s ostatnými súčiastkami. Ale ako vravím tá čiara je problém, tak či by sa nenašiel dáky jednoduchší návod (čím jednoduchšie, tým lepšie).

PS: kontrola správneho zapojenia bude možná cez hitTest alebo budem musieť použiť iný spôsob ? resp. dáky návrh riešenia by ste odporučili

Moc Diky za odpovede ...
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa audiotrack »

neviem akým štýlom sa má pohybovať, ale zrejme myslíš motion tween. Na prvý frame si nakresli čiaru v prvej pozícii, na ďalší frame dáš pravý klik a vložiť kľúčový frame. Potom tam nakreslíš (resp presunieš tú čiaru) na inú pozíciu. Označíš framy medzi prvým a týmto novým, pravý klik a create motion tween. Ak si myslel niečo iné, skús to viac objasniť
COTHW
Medium Star
Medium Star
Príspevky: 497
Registrovaný: 08 aug 2009, 15:37

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa COTHW »

Myslel som to tak aby sa dala čiara zachytiť myšou a potiahnuť, pričom by sa táto čiara ľubovoľne zväčšovala/zmenšovala a bolo ňou možné manipulovať aj v uhloch. Mám jeden príklad, ale tomu som moc nepochopil, lebo samozrejme je už celý hotový a chcem sa to v prvom rade naučiť a nie len skopírovať a návod na nete som nenašiel.
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa weroro »

Momentálne nie som doma a ani dlhšiu dobu nebudem, tak nemám k dispozícii kompilátor, ale len tak z hlavy tu máš skript, ktorý ešte má muchy ale smeruje k tomu čo potrebuješ (dúfam), a vieš sa toho chytiť a dorobiť to.

Kód: Vybrať všetko

this.createEmptyMovieClip("kon", this.getNextHighestDepth());
kon.createEmptyMovieClip("ciara", kon.getNextHighestDepth());
kon.ciara.beginFill(0x000000);
kon.ciara.moveTo(0, 0);
kon.ciara.lineTo(0, 2);
kon.ciara.lineTo(300, 2);
kon.ciara.lineTo(300, 0);
kon.ciara.lineTo(0, 0);
kon.ciara.endFill();
kon._x = 150;
kon._y = 150;
kon.createEmptyMovieClip("u1", kon.getNextHighestDepth());
kon.u1.beginFill(0xFF0000);
kon.u1.moveTo(0, 0);
kon.u1.lineTo(0, 6);
kon.u1.lineTo(6, 6);
kon.u1.lineTo(6, 0);
kon.u1.lineTo(0, 0);
kon.u1.endFill();
duplicateMovieClip(kon.u1, "u2", kon.getNextHighestDepth());
kon.u2._x = kon.ciara._width;
//
kon.u1.onPress = function() {
    kon.startDrag();
};
kon.u1.onRelease = function() {
    kon.stopDrag();
};
kon.u2.onPress = function() {
    this.startDrag();
    u2_d = true;
};
kon.u2.onRelease = kon.u2.onReleaseOutside=function () {
    this.stopDrag();
    u2_d = false;
};
function onMouseMove() {
    if (u2_d) {
        a = _xmouse-kon._x;
        b = _ymouse-kon._y;
        c = Math.sqrt(a*a+b*b);
        uhol = Math.asin(b/c);
        uhol = uhol*180/Math.PI;
        if ((_xmouse<kon._x) && (uhol<90) && (uhol>-90)) {
            uhol = 180-uhol;
        }
        kon.ciara._rotation = uhol;
        kon.u1._rotation = uhol;
        kon.u2._rotation = uhol;
        if (uhol<0 || uhol>0) {
            kon.ciara._width = Math.pow((Math.pow(_xmouse-kon._x, 2)+Math.pow(_ymouse-kon._y, 2)), 1/2);
        }else{
            kon.ciara._width = _xmouse -kon._x
        }
    }
}
 
Skús sem hodiť tú tvoju ukážku, ktorej nerozumieš, lebo ak je funkčná tak nie je čo riešiť a vysvetliť ti čo a ako je to najmenej.
COTHW
Medium Star
Medium Star
Príspevky: 497
Registrovaný: 08 aug 2009, 15:37

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa COTHW »

Jedná sa o tri movieClipy, dva z nich predstavujú ťažné body (pos1, pos2) a tretí čiaru (/pos1_/pos2). Script je na scéne len jeden a to stop(); Ďaľší skript je až vnútri MovieClipu, ktorý predstavuje čiaru.

Ďalej nasleduje Skript, ktorý je v niekoľkých framoch vnútri movieCliput (/pos1_/pos2)

Kód: Vybrať všetko

pos1 = "";
pos2 = "";
set("var", 1);
totCount = 1;
while (Number(totCount)<=Number(length(_name))) {
	if (Number(eval("var")) == 1) {
		if (substring(_name, totCount, 1) ne "_") {
			pos1 = pos1 add substring (_name,totCount,1);
		} else {
			set("var", 2);
		}
	} else if (Number(eval("var")) == 2) {
		if (substring(_name, totCount, 1) ne "_") {
			pos2 = pos2 add substring (_name,totCount,1);
		} else {
			set("var", 2);
		}
	}
	totCount = Number(totCount)+1;
}

Kód: Vybrať všetko

call("ddd");

Kód: Vybrať všetko

gotoAndPlay(3);

Kód: Vybrať všetko

setProperty("", _x, getProperty(pos1, _x));
setProperty("", _y, getProperty(pos1, _y));
call("calcSUBT");
if (Number(getProperty(pos1, _x))>=Number(getProperty(pos2, _x))) {
	Xmult = 1;
	if (Number(getProperty(pos1, _y))>=Number(getProperty(pos2, _y))) {
		Ymult = 1;
		setProperty("line", _rotation, 90);
	} else {
		Ymult = -1;
		setProperty("line", _rotation, 0);
	}
} else {
	Xmult = -1;
	if (Number(getProperty(pos1, _y))>=Number(getProperty(pos2, _y))) {
		Ymult = 1;
		setProperty("line", _rotation, 180);
	} else {
		Ymult = -1;
		setProperty("line", _rotation, 270);
	}
}
setProperty("", _xscale, (Xmult*substractorX)/20);
setProperty("", _yscale, (Ymult*substractorY)/20);
/:w = substractorX;
/:h = substractorY;
/:fr = getProperty("line", _rotation);

Kód: Vybrať všetko

substractorX = (getProperty(pos1, _x)-getProperty(pos2, _x));
if (Number(substractorX) == 0) {
	substractorX = 1;
}
substractorY = (getProperty(pos1, _y)-getProperty(pos2, _y));
if (Number(substractorY) == 0) {
	substractorY = 1;
}
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa weroro »

:shock: to čo je za syntax? Však to vyzerá ako AS1: add a ne operátori už nie sú validné a podporovane, boli nahradene + a !=. Takže by som to v prvom rade urobil takto:

Kód: Vybrať všetko

pos1 = "";
pos2 = "";
set("var", 1);
totCount = 1;
while (Number(totCount)<=Number(length(_name))) {
    if (Number(eval("var")) == 1) {
        if (substring(_name, totCount, 1) != "_") {
            pos1 = pos1+substring(_name, totCount, 1);
        } else {
            set("var", 2);
        }
    } else if (Number(eval("var")) == 2) {
        if (substring(_name, totCount, 1) != "_") {
            pos2 = pos2+substring(_name, totCount, 1);
        } else {
            set("var", 2);
        }
    }
    totCount = Number(totCount)+1;
}
 
Tak isto aj ostatná syntax je stará (hlavne Number(eval("var")) používané v podmienkach) a čudujem sa, že ti to vôbec kompilátor zožerie (či?). Kde si zohnal ten skript? Mam otázku ohľadne toho čo si sem postol. To ako si to rozdelil ten skript do zvlášť CODE tagov znamená, že prvý skript je na frame 1, druhy na frame 2 atď ? Lebo ak hej, prečo je príkaz gotoAndPlay(3) na treťom frame, ak odkazuje sám na seba? Zatiaľ mi ten kód nedáva žiadny zmysel. A ak je to tak ako hovorím (že každý CODE tag značí jeden frame), tak je to robené v AS1, lebo ak by to bolo robene v AS2 (čo aj vidím, že nie je) tak by bola miesto rozdelenia scriptu do frameov použitá funkcia onEnterFrame().

Ďalej, ako je to teda urobené s tými movieclipmi? Sú použité 3:
Line = to je čiara;
pos1 = prvý (ľavý) úchytný bod;
pos2 = druhý (pravý) úchytný bod.

A podľa toho čo si napísal som pochopil, že tento skript je vo vnútri každého z tých dvoch uchytných bodov (pos1 a pos2) na zvlášť frameoch. Ak ano aj to je blbosť. V skripte je jasne napísané, že Number(getProperty(pos2, _x));. Ako môže byt zisťovaná pozícia _x dákeho movieclipu z neho samého, ak je použitý iba názov objektu bez úplnej cesty _root.pos2, alebo bez this? Lebo v opačnom prípade by to znamenalo, že sa zisťuje poloha dákeho ďalšieho objektu v tomto movieclipe pos2, ktorý je tiež nazvaný pos2. Poprosím o vysvetlenie lebo som z toho jeleň a zatiaľ ja sám tomu skriptu nerozumiem, čo ma dosť desí. Ak sa ti dá daj do prílohy Fla súbor alebo SWFko nech vidim, že to naozaj funguje, lebo zatiaľ sa mi tomu nechce verit.
COTHW
Medium Star
Medium Star
Príspevky: 497
Registrovaný: 08 aug 2009, 15:37

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa COTHW »

No upol som ti to aby si si to mohol dobre pozrieť a tento príklad som získal tak, že som sa jedného človeka pýtal ako urobiť vo Flash tú pohyblivú čiaru a on mi poslal toto ako príklad, čo našiel.

PS: v tých movieClipoch pos1 a pos2 nie je žiadny script, všetko je v ciare. Upol som to na tú stránku, lebo mi vypísalo, keď som chcel pridať prílohu, že prípona fla nie je povolená.

Kód: Vybrať všetko

http://uloz.to/5551189/ciara.fla
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa weroro »

(FLA súbory dávame do RAR a potom do prílohy)
No tak som sa trochu viac prepočítal. Nevedel som, že fla súbory CS3 a vyššie sú chránené proti konvertovaniu. :( Upni mi prosím SWF, lebo s tým fla nič neurobím. To SWF si aspoň dekompilujem. (swf sa dajú dať aj do prílohy)
COTHW
Medium Star
Medium Star
Príspevky: 497
Registrovaný: 08 aug 2009, 15:37

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa COTHW »

Tu to je ... ja by som vlastne nepotreboval ani dva aktívne konce ale proste súčiastku, dajme tomu základný štvorec, z ktorého by na jednej strane trčal kábel, s ktorým by sa dal spojiť s inou súčiastkou. Každá súčiastka by mala na jednej strane 2x nepohyblivé pripojenie a na druhej strane 1x pohyblivú čiaru. Dúfam, že sa z toho môjho výkladu vysomáriš.
Prílohy
ciara.swf
(2.67 KiB) 149 stiahnutí
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa weroro »

Takže sa chcem v prvom rade ospravedlniť, že mi to chvíľku trvalo, ale ako som už spomínal nie som doma (som na dovolenke), tak som sa tomu veľmi nevenoval.
Mal som pravdu bol to ActionScript 1. Tak som to celé prerobil do Action Script 2 a celú aplikáciu som optimalizoval - co vidno aj na vyslednej velkosti SWF - a script je len na jednom mieste v snímku (všetko je urobené cez jeden frame a nič sa nehýbe).
Tu je script aj s komentármi.

Kód: Vybrať všetko

/*cyklus pre hromadné priradenie funkcie viacerým objektom
i=1; i je menšie alebo sa rovná 2, ak druhá podmienka 
nie je pravdivá pripočítaj k i +1.
*/
for (i=1; i<=2; i++) {
    /*objekt uchyt1 a 2 onPress event
    vytvorenie funkcie*/
    _root["uchyt"+i].onPress = function() {
        //funkcia uchopenie objektu kurzorom myši (this = tento objekt)
        startDrag(this);
    };
    /*objekt uchyt1 a 2 onRelease a onReleaseOutside event
    vytvorenie funkcie*/
    _root["uchyt"+i].onRelease = _root["uchyt"+i].onReleaseOutside=function () {
        //funkcia koniec uchopenia
        stopDrag();
    };
}
//koniec cyklu
//
/*onEnterFrame funkcia ("cyklus" bez podmienky), rýchlosť
frekvencie opakovania je závislá na počte nastavených FPS
v SWF a od výkonu užívateľovho PC))*/
//vytvorenie funkcie
onEnterFrame = function () {
    /*poloha x aktuálneho objektu ciara,
    sa rovná polohe x objektu uchyt1*/
    this._x = _root.uchyt1._x;
    /*poloha y aktuálneho objektu ciara,
    sa rovná polohe y objektu uchyt1*/
    this._y = _root.uchyt1._y;
    //
    /*podmienka
    ak je pozícia x objektu uchyt1 väčšia 
    alebo sa rovná pozícii x objektu uchyt2*/
    if (uchyt1._x>=uchyt2._x) {
        //vytvor premennú Xmult a naplň ju hodnotou 1
        Xmult = 1;
        /*podmienka: 
        ak je pozícia y objektu uchyt1 väčšia 
        alebo sa rovná pozícií y objektu uchyt2*/
        if (uchyt1._y>=uchyt2._y) {
            //vytvor premennú Ymult a naplň ju hodnotou 1
            Ymult = 1;
            /*objekt ciara otoč v smere hodinových ručičiek 
            o 90 stupňov od aktuálnej pozície*/
            ciara._rotation = 90;
            //ak nie je splnená podmienka tak vykonaj
        } else {
            //vytvor premennú Ymult a naplň ju hodnotou -1
            Ymult = -1;
            /*objekt ciara otoč v smere hodinových ručičiek 
            o 0 stupňov od aktuálnej pozície*/
            ciara._rotation = 0;
        }
        //ak nie je splnená podmienka tak vykonaj
    } else {
        //vytvor premennú Xmult a naplň ju hodnotou -1
        Xmult = -1;
        /*podmienka: 
        ak je pozícia y objektu uchyt1 väčšia 
        alebo sa rovná pozícii y objektu uchyt2*/
        if (uchyt1._y>=uchyt2._y) {
            //vytvor premennú Ymult a naplň ju hodnotou 1
            Ymult = 1;
            /*objekt ciara otoč v smere hodinových ručičiek 
            o 180 stupňov od aktuálnej pozície*/
            ciara._rotation = 180;
            //ak nie je splnená podmienka tak vykonaj
        } else {
            //vytvor premennú Ymult a naplň ju hodnotou -1
            Ymult = -1;
            /*objekt ciara otoč v smere hodinových ručičiek 
            o 270 stupňov od aktuálnej pozície*/
            ciara._rotation = 270;
        }
    }
    //koniec podmienky
    //
    /*vytvor premennú subX a naplň ju výsledkom odčítania 
    polohy x objektu uchyt1, polohou x objektu uchyt2*/
    subX = _root.uchyt1._x-_root.uchyt2._x;
    //podmienka: ak sa subX = 0
    if (subX == 0) {
        //vytvor premennú subX a naplň ju hodnotou 1
        subX = 1;
    }
    //koniec podmienky       
    //
    /*vytvor premennú subY a naplň ju výsledkom odčítania 
    polohy y objektu uchyt1, polohou y objektu uchyt2*/
    subY = _root.uchyt1._y-_root.uchyt2._y;
    //podmienka: ak sa subY = 0
    if (subY == 0) {
        //vytvor premennú subY a naplň ju hodnotou 1
        subY = 1;
    }
    //koniec podmienky       
    //
    /*deformácia aktuálneho objektu ciara v osi x ,
    je priamo úmerná súčinu premennej Xmult a subX
    a nepriamo úmerná hodnote 20*/
    this._xscale = Xmult*subX/20;
    /*deformácia aktuálneho objektu ciara v osi y ,
    je priamo úmerná súčinu premennej Ymult a subY
    a nepriamo úmerná hodnote 20*/
    this._yscale = Ymult*subY/20;
};
//koniec
 
Zdrojový *.fla a *.as súbor je v prílohe. Súbor *.fla je zdroják, ktorý otvor vo flashi a obsahuje iba grafiku a cez #include je do neho načítavaný script, ktorý je v súbore *.as, takže obidva súbory musia byt v jednom priečinku (pri exportovaní SWF animácie ostane script v SWFku, takže SWF nenačítava súbor *.as).

Maj sa.
Prílohy
ciara.rar
Zdrojové *.fla a *.as súbory.
(3.39 KiB) 15 stiahnutí
ciara.swf
SWF export.
(638 Bajtov) 140 stiahnutí
COTHW
Medium Star
Medium Star
Príspevky: 497
Registrovaný: 08 aug 2009, 15:37

Re: CS4 ActionScript 2.0 pohyblivá ciara

Príspevok od používateľa COTHW »

Strešne moc ďakujem za pomoc ... :)
Napísať odpoveď