Ghostman Opublikowano 28 Grudnia 2010 Zgłoś Opublikowano 28 Grudnia 2010 Witam Mam animację wędkarza, który na kliknięcie i przytrzymanie kręci kołowrotkiem. Chciałem do tej animacji dodać dźwięk, ale nie za bardzo mi to wychodzi. Dźwięk mam załadowany do biblioteki. Znajduje się na ścieżce "F:/kołowrotek.wav" Kod mam taki. addEventListener(Event.ENTER_FRAME, onStart);addEventListener(MouseEvent.MOUSE_DOWN, mouse_down)addEventListener(MouseEvent.MOUSE_UP, mouse_up)var wartosc:Boolean = false;var kołowrotek:Sound = new Sound();kołowrotek.load( new URLRequest( "kołowrotek.wav" ) );function mouse_down(e:MouseEvent) { wartosc = true}function mouse_up(e:MouseEvent) { wartosc = false}function onStart(evt:Event):void { AnimacjaRęki.stop(); AnimacjaKołowrotka.stop(); kołowrotek.stop(); if(wartosc==true) { AnimacjaRęki.play(); AnimacjaKołowrotka.play(); kołowrotek.play() } else { AnimacjaRęki.stop(); AnimacjaKołowrotka.stop(); kołowrotek.stop(); }}Czego mi tu brakuje i co oznacza urlrequest. Jako link z netu czy z dysku? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
m4r Opublikowano 29 Grudnia 2010 Zgłoś Opublikowano 29 Grudnia 2010 Trochę masz zamęt w tej funkcji odpowiedzialnej za animację. Podłączyłeś ją do Event.ENTER_FRAME, czyli będzie wywoływana przy każdej klatce. No i byłoby to ok, o ile miałbyś AS 2. W AS3 to marnowanie zasobów i lekkie druciarstwo. Funkcja za każdym razem będzie odpalać niepotrzebne starty, stopy, tak dla animacji, jak i dla dźwięków. O ile przy prostej animacji nie odczujesz problemu, o tyle przy "cięższych" animacjach będziesz miał zużycie cpu i ramu na dość dużym poziomie. Przykład: masz stop przy każdym kliku, po czym sprawdzenie warunku i odpalenie animacji, albo jej ponowne zatrzymanie (mimo że zatrzymana już jest). I tak w każdej klatce. Nie prościej jakoś tak? stage.addEventListener(MouseEvent.MOUSE_DOWN, mouse_down)stage.addEventListener(MouseEvent.MOUSE_UP, mouse_up)var gramy:Boolean = false;var kolowrotek:Sound = new Sound();var sChan:SoundChannel;kolowrotek.load( new URLRequest('muzyczka.mp3') ); //plik jest w tym samym katalogu co swffunction mouse_down(e:MouseEvent) { // AnimacjaRęki.play(); // AnimacjaKołowrotka.play(); trace('klik'); sChan = kolowrotek.play(); gramy = true;}function mouse_up(e:MouseEvent) { // AnimacjaRęki.stop(); // AnimacjaKołowrotka.stop(); trace('release'); if(gramy) { sChan.stop(); gramy = false; }}Aha, dorobiłem parę drobiazgów- SoundChannel, czyli obiekt kontrolujący dźwięk i pozwalający m.in. go pauzować/zatrzymać (co działa w listenerze mouse_up), poza tym dodałem listenerom stage jako obiekt, dla którego będą wykonywane. Zrobiłem tak głównie dlatego, że nie wiedziałem dla jakiego obiektu je przypisałeś u siebie (samo addEventListener zadziała bez wyszczególnionego obiektu tylko w pewnych warunkach, może to było problemem), a nie chciało mi się dłubać nowych mc. Nie wiem jak dokładnie Ci wyjaśnić kwestię przypisywania obiektom listenerów, bo nigdy nie byłem dobry w tłumaczeniu z angielskiego programistycznego na zdrowochłopskorozumowy polski. Jeszcze tylko wspomnę, że listenery dla myszy potrafią "ominąć" klatki. W załączniku masz prosty skrypt - 2 obiekty, jeden ma update zgodne z timeline filmu, drugi - zgodne z wywołaniem eventu (tutaj akurat ruchu myszą). mouse.zip Instrukcja obsługi - klikasz i przeciągasz. Myślę,że po odpaleniu animacji domyślisz się, który jest odświeżany zgodnie z fps filmu, a który zgodnie z eventem. Ale to tylko ciekawostka. Btw, śmieszna sprawa- myślałem że film ma 12 fps, ma 24. Ale i tak widzę różnicę przy poruszaniu kwadratów. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ghostman Opublikowano 30 Grudnia 2010 Zgłoś Opublikowano 30 Grudnia 2010 (edytowane) Dzięki Ja już ten event listener poprawiłem wcześniej i dodałem na które obiekty on ma reagować On frame enter mam dlatego, że ja jadę na jednej klatce w głównym timelinie. Wszystkie obiekty, które się ruszają są zrobione na movie clip (to są w większości szape tween i motion tween dlatego, że mam płynącą wodę (kod dostępny w necie) i ona nie może się zapętlać, bo to widać. O tym listenerze, którym mi pisałeś w drugim temacie to właśnie tutaj ma być ten kod i ja doszukałem się w manualu sound_complete,ale jak dawałem soundchannel.addeventlistener to to nie działało. Wygląda to u mnie teraz tak, ale nadal na zakończenie dźwięku nie wyskakuje pole tekstowe import flash.text.TextField;import flash.text.TextFieldType;import flash.display.Sprite;import flash.events.Event;addEventListener(Event.ENTER_FRAME, onStart); //potrzebne do zastopowania obiektów AnimacjaKołowrotka, AnimacjaRękiAnimacjaRęki.addEventListener(MouseEvent.MOUSE_DOWN, mouse_down)AnimacjaRęki.addEventListener(MouseEvent.MOUSE_UP, mouse_up)AnimacjaKołowrotka.addEventListener(MouseEvent.MOUSE_DOWN, mouse_down)AnimacjaKołowrotka.addEventListener(MouseEvent.MOUSE_UP, mouse_up)var wartosc:Boolean = false;var snd:Sound = new Sound();var channel:SoundChannel = new SoundChannel();var req:URLRequest = new URLRequest("kołowrotek.mp3"); snd.load(req);var k:String = "Złapałeś karpia";var o:String = "Złapałeś okonia";var l:String = "Złapałeś lina";var s:String = "Złapałeś szczupaka";var a:String = "Złapałeś amura";var liczba;var label1:TextField = createTextField(300, 300, 200, 20);snd.addEventListener(Event.SOUND_COMPLETE, koniec);/*problem może być taki, że mi w tle leci szum wody, ale on jest wstawiony do layer, a "kołowrotek.mp3" nie. Czy snd nie próbuje załadować tego drugiego dźwięku mimo, że dałem snd.load(req) gdzie req = kołowrotek.mp3*/function koniec(e:Event){ liczba = Math.random() * 100; if (liczba > 40) //tutaj będzie case dla reszty ryb, na razie mi to nie działa { label1.text = k } else { label1.text = l }}function createTextField(x:Number, y:Number, width:Number, height:Number):TextField { var result:TextField = new TextField(); result.x = x; result.y = y; result.width = width; result.height = height; addChild(result); return result;}function mouse_down(e:MouseEvent) { wartosc = true channel = snd.play(); }function mouse_up(e:MouseEvent) { wartosc = false channel.stop(); liczba = 0}function onStart(evt:Event):void { AnimacjaRęki.stop(); AnimacjaKołowrotka.stop(); if(wartosc==true) { AnimacjaRęki.play(); AnimacjaKołowrotka.play(); } else { AnimacjaRęki.stop(); AnimacjaKołowrotka.stop(); }} mogę nie korzystać ze stopowania na frame enter, ale powidz mi jak mam zatrzymać na początku movieclip AnimacjaRęki i AnimacjaKołowrotka i żeby to startowało tylko po przyciśnięciu na te obiekty (naciskam na dowolny z nich i obydwa muszą startować). I jeszcze takie pytanie Co mi daje, że sprawdzam warunek if(gramy){ sChan.stop(); gramy = false;} skoro on i tak się zawsze musi wykonać jak puszczam przycisk? Edytowane 30 Grudnia 2010 przez Ghostman Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
m4r Opublikowano 30 Grudnia 2010 Zgłoś Opublikowano 30 Grudnia 2010 mogę nie korzystać ze stopowania na frame enter, ale powidz mi jak mam zatrzymać na początku movieclip AnimacjaRęki i AnimacjaKołowrotka i żeby to startowało tylko po przyciśnięciu na te obiekty (naciskam na dowolny z nich i obydwa muszą startować). this.parent['nazwa drugiej animacji'].stop(); powinno załatwić sprawę, jeżeli obie animacje mają ten sam nadrzędny mc. W sumie, można by nawet obie wepchnąć w jeden mc i to jemu przypisać nasłuch eventów. I jeszcze takie pytanie Co mi daje, że sprawdzam warunek if(gramy){ sChan.stop(); gramy = false;} skoro on i tak się zawsze musi wykonać jak puszczam przycisk? To takie moje stare przyzwyczajenie. Bo - jeżeli klikniesz gdzieś poza obiektem, a puścisz klawisz na nim, to mimo braku odtwarzanego dźwięku, listener będzie chciał go zatrzymać. Ten if przed czymś takim właśnie zabezpiecza. Może nie jest to duży problem przy samym odtwarzaniu dźwięku, ale przy bardziej złożonych animacjach, gdzie kontrolujesz o wiele więcej elementów, mogą być problemy (coś się nie zatrzyma, coś się pogubi, a jeszcze coś w ogóle nie uruchomi). Całkiem niezłe jazdy mogą być, jeżeli niechcący w listenerze naciśnięcia myszy przypisujesz jakąś wartość zmiennej, która ma być użyta przy puszczeniu myszy... Jeżeli zrobisz taką dziwną sztuczkę, jak opisałem, to możesz sobie wybierać - od dzielenia przez zero, aż po nieskończone pętle itp. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ghostman Opublikowano 30 Grudnia 2010 Zgłoś Opublikowano 30 Grudnia 2010 Zrobiłem tak: wędkarz i jego ręka stał się jednością przez co mogłem wyrzucić ifa na sprawdzenie czy przycisk jest przyciśnięty i enter_frame dodałem to co poradziłeś dźwięk niestety mi nadal nie działa. jakbyś mógł jeszcze na ten problem coś poradzić import flash.text.TextField;import flash.text.TextFieldType;import flash.display.Sprite;import flash.events.Event;import flash.events.MouseEvent;wędkarz.addEventListener(MouseEvent.MOUSE_DOWN, mouse_down)wędkarz.addEventListener(MouseEvent.MOUSE_UP, mouse_up)wędkarz.addEventListener(MouseEvent.MOUSE_OUT, mouse_out)var snd:Sound = new Sound();var channel:SoundChannel = new SoundChannel();var req:URLRequest = new URLRequest("kołowrotek.mp3"); snd.load(req);snd.addEventListener(Event.SOUND_COMPLETE, koniec)wędkarz.stop();var k:String = "Złapałeś karpia";var o:String = "Złapałeś okonia";var l:String = "Złapałeś lina";var s:String = "Złapałeś szczupaka";var a:String = "Złapałeś amura";var liczba;var label1:TextField = createTextField(300, 300, 200, 20);var gramy:Boolean = false;function createTextField(x:Number, y:Number, width:Number, height:Number):TextField { var result:TextField = new TextField(); result.x = x; result.y = y; result.width = width; result.height = height; addChild(result); return result;}function mouse_down(e:MouseEvent) { channel = snd.play(); wędkarz.play(); gramy = true;}function mouse_up(e:MouseEvent) { if(gramy) { wędkarz.stop(); channel.stop(); liczba = 0; gramy = false; }}function mouse_out(e:MouseEvent){ if(gramy) { wędkarz.stop(); channel.stop(); liczba = 0; gramy = false; }}function koniec(e:Event){ liczba = Math.random() * 100; if (liczba > 40) { label1.text = k } else { label1.text = l }} Poprzestawiałem kolejność tych funkcji, bo ten AC 3.0 działa lekko proceduralnie. wstawiłem snd.addeventlistener przed konstruktor sound, żeby to było jakoś poukładane i mi się gra wysypała Co do kwadratów - mam rozumieć, że e.updateAfterEvent(); powoduje, że klatka się wykonuje eventlistenermove i po jego wykonaniu funkcja czeka z updatem aż drugi raz się wykona? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ghostman Opublikowano 2 Stycznia 2011 Zgłoś Opublikowano 2 Stycznia 2011 Dobra poradziłem sobie z dźwiękiem. miałbyć channel.addEventListener(Event.SOUND_COMPLETE funkcja); A teraz pytanie inne. Mam 2 zdjęcia lin1.jpg i karp 1.jpg w katalogu zdjęcia Poniższy kod wywala mi błąd "text=Error #2035: Nie znaleziono adresu URL." var container:Sprite = new Sprite();addChild(container);var pictLdr:Loader = new Loader(); function imgLoaded(event:Event):void{ container.addChild(pictLdr.content); }function ryba(e:Event) { wędkarz.stop(); var pictURL:String; liczba = Math.random() * 100; if (liczba > 40) { pictURL = "zdjęcia/lin1.jpg"; } else { pictURL = "zdjęcia/karp1.jpg"; } var pictURLReq:URLRequest = new URLRequest(pictURL); pictLdr.load(pictURLReq); pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded); channel.removeEventListener(Event.SOUND_COMPLETE, ryba);}function mouse_down(e:MouseEvent) { channel = snd.play(); wędkarz.play(); gramy = true; channel.addEventListener(Event.SOUND_COMPLETE, ryba);} Co robię źle? oczywiście zdjecia są załadowane do biblioteki Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
m4r Opublikowano 2 Stycznia 2011 Zgłoś Opublikowano 2 Stycznia 2011 Bardzo prawdopodobne, że masz gdzieś duże litery, albo małe litery. Flash jak linux- rozpoznaje "obrazek.jpg" i "Obrazek.jpg" jako dwa różne pliki (i prawidłowo). Istnieje też prawdopodobieństwo (nikłe, ale pamiętam ze starego flasha), że burzy się o polskie znaki. Właściwie, to powinienem Ci o tym napisać na samym początku - staraj się nie używać polskich znaków w nazwach zmiennych, plików, katalogów (zwanych dumnie folderami), folderów, etc. W Windowsie możesz mieć 2 zestawy znaków - utf-8 i win-1250. W Linuxach - latin-2 i utf-8. Aha, czy ja dobrze widzę, że chcesz pobierać obrazki zawsze przez urlRequest? Jak powiedział kiedyś były prezydent - Ludwiku Dornie, Sabo, nie idźcie tą drogą. Masz plusy, ale i minusy takiego czegoś: [+] - możesz zawsze podmienić pliki na inne - nie musisz za każdym razem od nowa tworzyć swf. [-] - za każdym razem komunikujesz się z serwerem przez URLRequest, a więc uruchamiasz mechanizm po stronie flasha, ale też po stronie serwera (nawiązanie połączenia, sprawdzenie czy plik istnieje i czy masz uprawnienia, transfer, etc). To zawsze zajmuje co najmniej kilka millisekund. - dodajesz kilka zmiennych więcej (nowy URLRequest, nazwa_pliku, dodatkowe listenery, etc.) - jeżeli ktoś sobie pobierze animację, a potem np. odejdzie od hotSpota, to będzie miał zonk przy którymś kliknięciu, bo plik(i) się nie załaduje(ą). Możesz dodać sobie wszystkie potrzebne grafiki i dźwięki do biblioteki i z niej je pobierać. Btw, co do pytania o eventy: Zawsze, kiedy zostanie wywołane zdarzenie mające listener, to użycie updateAfterEvent() spowoduje, że skrypt nie będzie czekać do "standardowego" update (czyli najczęściej następnej klatki), tylko wykona się i wyświetli wynik od razu po zdarzeniu. Przydatne właśnie przy "wygładzaniu" ruchu w czasie przeciagania myszą (nie ma szarpania), czasem przy strumieniach, etc. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ghostman Opublikowano 2 Stycznia 2011 Zgłoś Opublikowano 2 Stycznia 2011 No dobrze, a jak to w takim razie wstawić do warunku? coś takiego nie działa w bibliotece oczywiście zrobiłem linkage jedno zdjecie ma nazwe lin drugie karp var libImage; liczba = Math.random() * 100; if (liczba > 10) { libImage:lin = new lin(0,0); } else { libImage:karp = new karp(0,0); } var holder:Bitmap = new Bitmap(libImage); addChild(holder); holder.x = 342; holder.y = 226; Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
m4r Opublikowano 2 Stycznia 2011 Zgłoś Opublikowano 2 Stycznia 2011 libImage:lin = ...libImage:karp = ... bez ":lin" i bez ":karp". Może trochę głupie pytanie, ale... czytasz czasem komunikaty debuggera? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...