Dowiadujmy się dalej, co można
zrobić z obiektami.
Sięgnijmy do programu
z filmiku o funkcjach.
Ma on funkcję „drawWinston”,
która umie narysować Winstona
w danym „x” i „y”...
Tutaj przywołujemy tę funkcję
cztery razy,
zawsze z innymi współrzędnymi.
Znacie mnie. Gdy patrzę na te cztery
rysunki Winstona,
tak podobne do siebie,
myślę tylko, że dużo lepiej
byłoby użyć pętli.
I przywołać funkcję raz,
wewnątrz pętli,
zmieniając „x” i „y”
w każdym powtórzeniu pętli.
W tym celu musimy znaleźć sposób
na przechowywanie pozycji „x” i „y”,
w tablicy, żebyśmy mieli
do nich dostep.
Mamy dwa zestawy wartości,
więc moglibyśmy zrobić dwie tablice.
Jedną dla pozycji „x”,
drugą dla pozycji „y”.
Dajmy pozycje „x”:
99, 294, 101 i 294...
a pozycje „y”
to 117, 117, 316, 316.
Teraz możemy zrobić tu pętlę,
pisząc: for-loop var i = 0;
i < xPositions.length; i++
Przejdziemy przez każdy
element „xPositions”,
i napiszemy:
drawWinston(xPositions[i],
yPositions[i]);
Sprawdźmy, czy to działa.
Skasujmy...
Udało się!
Możemy to przywołać.
Jedna linijka programu
rysuje Winstona
w każdej pozycji
z tablicy „xPositions”.
Możemy dodawać więcej.
Powiedzmy od 10.
Potem dodajemy 1, i 1, i 1...
a później 100, i 1...
Zrobił się tu bałagan.
Niedobrze, bo trudno mi zobaczyć,
który „x” odnosi się do którego „y”.
A ja chcę na pierwszy
rzut oka widzieć
pary x-y, zamiast pilnować,
żeby były idealnie ustawione
w pionie, np. tak.
Chcę znaleźć inny sposób
przechowywania tych pozycji.
Możemy przechowywać je
jako obiekty.
Każda pozycja to dwie
informacje: „x” i „y”.
Możemy zrobić obiekt
o właściwościach „x” i „y.”
Możemy mieć tablice obiektów
z pozycjami „x” i „y”.
Zróbmy to więc.
Napiszemy: „var positions”
równa się... i to też będzie tablica.
Ale każdy element, zamiast być
liczbą, będzie obiektem.
Mamy klamry...
I napiszemy „x:99” i „y:117”.
Mamy tu jedną z naszych pozycji,
a drugą dodamy tutaj.
Dobrze; „x” wyniesie 294, 117,
dalej 101,
dalej 316,
a na koniec 294 i 316.
I jest tablica obiektów,
z których każdy
ma właściwości „x” i „y”.
Teraz za pomocą pętli FOR
wypiszemy każdy obiekt
tablicy „positions”.
Następnie przekażemy obiekt.
Na razie przekazujemy cały obiekt,
a chcemy przekazać wartości „x” i „y”.
Potrzebujemy zatem
positions[i].X i positions[i].Y.
Hura!
Możemy skasować te stare,
zaśmiecone tablice.
Teraz wygląda to znacznie ładniej,
a program jest prostszy do czytania.
Im łatwiej, tym lepiej!
I łatwiej jest dodawać nowe obiekty.
Jeśli chcę dodać 1...
Dodam tę parę.
Powiedzmy, że „x” to 200,
„y” też...
i pośrodku pojawi się Winston.
Fajnie!
A teraz pokażę wam
coś jeszcze lepszego.
Zauważcie, że nasza funkcja
przyjmuje dwie liczby
i korzysta z nich.
Możemy zmienić funkcję tak,
że będzie oczekiwać obiektu
i weźmie z niego „x” oraz „y”.
To znaczy, że możemy
zabrać stąd obiekt.
Spróbujmy.
Zabieramy obiekt, teraz nie działa.
Bo nasza funkcja
oczekuje dwóch obiektów,
a dostaje tylko jeden.
Zmienimy to więc.
Damy tu „facePosition”,
ale widać komunikat o błędzie,
bo FaceX nie jest zdefiniowane.
Wcześniej „faceX” było argumentem,
lecz teraz nie istnieje.
Mamy tylko obiekt.
Możemy zapisać pozycję „x”
z obiektu wewnątrz zmiennej „faceX”.
Mamy więc obiekt,
wiemy, że ma właściwość „x”,
i będziemy go przechowywać
w zmiennej „faceX”.
To samo możemy zrobić z „y”:
„faceY = facePosition.y”.
I proszę! A reszta funkcji
używa „faceX” i „faceY”.
Trzeba to dobrze zapisać.
„xx” nie zadziała,
bo tego nie ma tutaj,
w naszej tablicy obiektów.
Musi pasować!
Wspaniale: teraz możecie mieć
tablice obiektów,
funkcje przyjmujące obiekty,
i przekonacie się,
że programy są świetne
w organizacji danych.
Zwłaszcza że często chcemy
łączyć „x” z „y”.
Tablice obiektów przydadzą się
podczas rysowania i animacji.
Korzystajcie z nich
i bawcie się dobrze!