JAVAScript –animacja obiektów, tworzenie własnych obiektów
Transkrypt
JAVAScript –animacja obiektów, tworzenie własnych obiektów
Programowanie obiektowe– ćw.5 JAVAScript –animacja obiektów, tworzenie własnych obiektów Tworzenie i usuwanie obiektów (Uzupełnienie) Przykład zawiera kod dodawania i usuwania komórek tabeli: <HTML><HEAD> </HEAD> <BODY style="font-size:30px"> <TABLE name="xxx" id="t1" style="margin-left:30px;border:1px solid black"> <TR id="w"></TR> </TABLE> <DIV style="text-align:center;padding-top:30px"> <INPUT type="submit" value="DODAJ" onclick="dodaj( )" /> <INPUT type="submit" value="USUŃ" onclick="usun( )" /> </DIV> <SCRIPT language="JavaScript"> function dodaj() { var wiersz = document.getElementById("w");//referencja do elementu o id="w" var kom=document.createElement("TD") //ustalamy styl komórki kom.style.border="2px solid red"; kom.style.textAlign="center"; kom.style.fontSize="22px"; //tworzymy węzeł tekstowy, tekst jest numerem komórki – o 1 większy niż aktualna ich liczba var t3=document.createTextNode(wiersz.childNodes.length+1); //dołączamy do wiersza tabeli kom.appendChild(t3); wiersz.appendChild(kom);// } //========================================= function usun( ) { var wiersz = document.getElementById("w"); //pobranie ostatniej komórki – jej indeks o 1 mniejszy od liczby komórek ostatni=wiersz.childNodes[wiersz.childNodes.length-1] //usunięcie jej wiersz.removeChild(ostatni);//usuwamy ostatni } //========================================= </SCRIPT> </BODY></HTML> Sprawdzić i zrozumieć działanie powyższego kodu. Animacja obiektów Wykorzystamy tu poznaną wcześniej funkcję (metodę obiektu window) setTimeout() opóźniającą wykonanie czynności o określony czas. setTimeout("funkcja", czas w milisekundach) Uruchamianie i zatrzymywanie <HTML><HEAD></HEAD><BODY style="font-size:30px"> <SCRIPT language="JavaScript"> licznik=0;//początkowy licznik //========================================= function stoper( ) { //wstaw aktualny licznik jako tekst elementu T1 document.getElementById('T1').innerHTML=licznik; //zwiększ licznik o 1 licznik++; // po 1 sekundzie jeszcze raz wykonaj funkcję stoper( ) t=setTimeout("stoper()",1000); } //========================================= function startuj( ) { //uruchom stoper stoper(); } //========================================= function stopuj( ){ //wyczyść zmienną powtarzania – metoda obiektu window clearTimeout(t); } </SCRIPT> <P id="T1"></P> <INPUT type="button" value="Start" onclick="startuj( )" /> <INPUT type="button" value="Stop" onclick="stopuj( )" /><br> </BODY> </HTML> Animacja elementu Teraz już stosunkowo łatwo możemy wykonać animację obiektu na bazie powyższego przykładu. Umieszczamy na stronie element <DIV> z odpowiednim stylem i z opóźnieniem 50ms wykonujemy zmianę jej cechy stylu left (Uwaga: konieczne ustawienie dla stylu cechy position:absolute). Wykonajmy poniższy przykład: <HTML><HEAD></HEAD><BODY style="font-size:30px"> <SCRIPT language="JavaScript"> //zmienne pomocnicze licznik=0; //========================================= function stoper( ) { el=document.getElementById("T1"); el.style.left = licznik; licznik++; t=setTimeout("stoper( )",op); } //========================================= function jazda( ) { //ustalenie opóźnienia (szybkości) op=50; //zmienna globalna //uruchom stoper stoper( ); } //========================================= function stopuj( ) { clearTimeout(t); } </SCRIPT> <INPUT type="button" value="Start" onclick="jazda( )" /> <INPUT type="button" value="Stop" onclick="stopuj( )" /> <DIV id="T1" style="position: absolute; left: 0px; top: 60px; width:100px; height:100px; background-color:red"> </DIV> </BODY></HTML> Sprawdzić działanie powyższego przykładu. Zadanie Dodać dodatkową funkcję szybciej( ) uruchamianą trzecim przyciskiem, z inną wartością op (mniejsza wartość to szybszy ruch). Zauważyć, że da się przyspieszać tylko po uprzednim zatrzymaniu ruchu. Czy można sobie poradzić z tym problemem? Tak ... można uruchamiać funkcję stopuj() tuż przed uruchomieniem stopera w obu funkcjach: jazda() i szybciej() – konieczna jest jednak inicjacja zmiennej t przed definicjami funkcji: var t; ponieważ przed pierwszym wykorzystaniem funkcji setTimeout() zmienna ta byłaby nieznana. Tworzenie własnych obiektów Dotychczas wykorzystywaliśmy obiekty wizualne w dokumencie HTML. Przy pomocy skryptów JavaScript wykonywaliśmy na nich pewne operacje, ustalając i zmieniając ich właściwości oraz korzystaliśmy ze zdefiniowanych dla nich metod, które wspomagały wykorzystanie obiektów reprezentowanych przez znaczniki HTML (i innych, jak np. obiekt typu Date) w hierarchii DOM, ustalanie i zmianę ich właściwości, wykorzystywanie metod dla tworzenia nowych obiektów, ich usuwania itp. W dalszej części poznamy sposoby tworzenia własnych obiektów, definiowania ich właściwości i metod oraz ich korzystania z nich w skryptach JavaScript. Spróbujemy również poznać pewne charakterystyczne cechy programowania obiektowego, jak dziedziczenie obiektów czy polimorfizm. Słowo kluczowe this Nadając i wykorzystując identyfikatory właściwości i metod obiektów korzystamy ze słowa kluczowego this. Rozumiane jest ono jako odniesienie do obiektu bieżącego, właściciela metody lub właściwości. Poniżej prosty przykład wyjaśniający znaczenie słowa kluczowego this: <HTML> <HEAD> </HEAD> <BODY style="font-size:18px"> <PRE> <SCRIPT language="JavaScript"> function kolor1( ) { this.document.bgColor = "red"; } function kolor2(e) { e.style.color = "yellow"; } </SCRIPT> </PRE> <INPUT type="button" value="Kolor dla tła okna" onclick="kolor1( )"> <INPUT type="button" value="Kolor dla napisu na przycisku" onclick="kolor2(this)"> </BODY> </HTML> W powyższym przykładzie mamy dwie własne funkcje. W pierwszej o nazwie kolor1 ustalamy kolor tła dla dokumentu, którego właścicielem (this) - jest domyślnie obiekt window (okno przeglądarki). Druga funkcja o nazwie kolor2 zmienia kolor czcionki przekazanego do funkcji jako argument obiektu e - wywoływana jest kliknięciem przycisku z przekazaniem odniesienia do tego właśnie przycisku (this), a więc zmienia się kolor napisu na przycisku. Definicja obiektu i tworzenie instancji obiektu W definicji obiektu tworzymy: • • właściwości obiektu (zmienne proste lub obiektowe), metody obiektu (funkcje wewnętrzne). W JavaScript można tworzyć własne definicje obiektów (tzw. konstruktor obiektu) z wykorzystaniem funkcji. Potem można tworzyć ich egzemplarze (instancje). Przykładowo funkcja definiująca obiekt składający się z samych właściwości: function Nazwa(argument1, argument2) { this.właściwość1 = argument1; //nadanie wartości przez argument this.właściwość2 = argument2; //nadanie wartości przez argument this.właściwość3 = 5; //nadanie stałej wartości liczbowej this.właściwość4 = true; //nadanie stałej wartości logicznej //itd. } Jak widzimy właściwości obiektu (z wykorzystaniem słowa kluczowego this) są nadawane przy pomocy argumentów funkcji, mogą też mieć nadane stałe wartości. Teraz możemy wygenerować wiele "egzemplarzy" (instancji) obiektu o definicji Nazwa() i przypisać je do zmiennych referencji p1 i p2. Wykorzystujemy tu zapis ze słowem kluczowym new: var p1 = new Nazwa( argumenty aktualne); //zmienna lokalna p2 = new Nazwa( inne argumenty aktualne); //zmienna globalna Poniżej dodamy – już na konkretnym przykładzie - oprócz właściwości także metody (funkcje) w definicji obiektu: <PRE> <SCRIPT language="JavaScript"> //funkcja konstruktor (definicja) function Pies(imie, rasa, kolor, plec) { //własciwości this. imie = imie; this. rasa = rasa; this. kolor = kolor; this. plec = plec; this.glos ="HAUUUU"; //dla wszystkich psów ten sam //metoda this.dajGlos = function () { document.writeln ("robię – ", this.glos); }; };//koniec definicji //teraz utworzymy dwie instancje (dwa obiekty klasy Pies) var piesek1 = new Pies( "Misia", "Labrador", "czekoladowa", "suka" ); var piesek2 = new Pies( "Misiek", "Seter", "rudy", "pies" ); //możemy mieć dostęp do właściwości i metod document.writeln("Mam na imię:", piesek1.imie); // ->Misia piesek1.dajGlos ( ); //-> HAUUUU //itd. </SCRIPT> </PRE> Zwróćmy uwagę, że zmienne argumentów mają tu takie same nazwy jak właściwości obiektu (rozróżnienie dzięki słowu this), choć mogą też się różnić. Zwróćmy uwagę na sposób operowania na właściwościach – można je wyświetlić na ekranie, zmienić wartości itp. Metody też mogą wpływać na właściwości. Metody (funkcje obiektu) wykonujemy jako: • osobne instrukcje, • można funkcję użyć w kontekście zmiennej rezultatu - jeśli metoda zwraca jakieś dodatkowe rezultaty (tu wykorzystujemy słowo kluczowe return). Przykład Zdefiniujmy obiektowi dodatkową właściwość waga: this.waga=waga; Uwaga: Trzeba też dopisać wagę do listy argumentów funkcji Pies( ) Utworzymy też definicję metody jedz( ) jako: this.jedz= function(x){ this.waga+=x/10; return this.waga } Jako argument x przekazywany do funkcji jedz rozumiemy ilość jedzenia. Teraz możemy metodę wykorzystać, np. document.writeln("Waga początkowa:",piesek1.waga); piesek1.jedz(5); document.writeln("Waga po zjedzeniu +5:",piesek1.waga); //albo document.writeln("Waga po zjedzeniu +10:",piesek1.jedz(10)); Ćwiczenie 1. Sprawdzić powyższy przykład, dopisać metodę jedz() i wykorzystać w skrypcie. 2. Dopisać definicję metody biegaj(), która powoduje odpowiednie zmniejszanie wagi. Wykorzystać tę metodę. Zadania 1. Wykonać powyższe skrypty i zrozumieć ich działanie. 2. Utworzyć skrypt, w którym: a. utworzona jest definicja obiektu Prostokat z właściwościami: szerokosc i wysokosc oraz metodą obliczPole(). b. tworzone są dwie instancje obiektu Prostokat, c. dla obu wypisywane są długości oby wymiarów oraz wykorzystana jest metoda obliczania pola powierzchni zwracająca obliczone pole, Spróbować wykonać zadanie wykorzystując obie metody definiowania obiektów. 3. Utworzyć skrypt, w którym: • utworzona jest definicja obiektu Auto z zaprojektowanymi właściwościami, np. marka, pojemnosc, moc, predkosc itp. Wszystkie wartości właściwości inicjować przez argumenty funkcji definiującej, z wyjątkiem prędkości, którą dla wszystkich nowotworzonych obiektów ustawić na 0. • zdefiniować metody: • wypiszDane(), której zadaniem jest wypisanie danych auta, • start(s) gdzie s będzie prędkością początkową, • stop(), której zadaniem jest zatrzymanie pojazdu, • przyspiesz(p), gdzie p będzie wartością, o którą należy zwiększyć prędkość. • tworzona jest instancja (lub kilka) obiektu Auto, • po utworzeniu instancji wypisywane są wszystkie właściwości z wykorzystaniem metody wypiszDane(), a. następnie wykorzystujemy metody: start() przyspiesz() stop() (przyspieszać można wielokrotnie), każdorazowo wypisywać na ekranie dane (szczególnie interesuje nas prędkość początkowa, po starcie, po przyspieszeniu itd. – można utworzyć dodatkowo metodę wypiszPredkosc() i ją wykorzystać. Spróbować wykonać zadanie wykorzystując obie metody definiowania obiektów.