czwartek, 27 kwietnia 2017

Edytor map

W poprzednim artykule (I znowu gierka) napisałem, że do gry można dodawać własne figury. Należy w tym celu napisać w konsoli coś takiego:

shapes.push({ 
  map: [[0, 1, 1], [0, 1, 0], [1, 1, 0]], 
  color: '#0080c0' 
});
Jest to bardzo niewygodny sposób, więc pomyślałem sobie, że warto by było stworzyć narzędzie ułatwiające tworzenie nowych figur. Wynikiem tych przemyśleń stał się tzw. Edytor map, w którym definiowanie własnych figur odbywa się w sposób wizualny.

W edytorze widzimy mapy wszystkich figur gry, co jest ogromnym ułatwieniem dla gracza-projektanta. Już na pierwszy rzut oka widać, że największą zaletą edytora jest wygoda obsługi. Ale chyba najważniejszą jego cechą jest sprawdzanie, czy figura, którą stworzyliśmy, nie występuje już w kolekcji, i w takiej sytuacji poinformowanie nas o tym i niedopuszczenie do jej dodania. Również podczas edytowania map z kolekcji odbywa się takie sprawdzanie. A ponieważ figury mogą się podczas gry obracać, kontrola powtarzalności uwzględnia położenie mapy w każdym z czterech kierunków.

Oczywiście poza dodawaniem figur do kolekcji możemy je też usuwać. Co prawda możliwe to było również z konsoli poprzez wpisanie polecenia:

shapes.splice(3, 1);
gdzie pierwszy parametr oznacza indeks w kolekcji liczony od zera, a drugi - ilość usuwanych elementów. Ale działając w ten sposób nie wiedzieliśmy, która figura zostanie usunięta. A posługując się edytorem, widzimy dokładnie, którą figurę usuwamy.

Kolejną możliwością, już bardziej estetyczną, jest zmiana kolorów naszych figur - zarówno tych z kolekcji, jak i dodawanej.

Bawiąc się w ten sposób figurami możemy dojść do wniosku, że warto by było zachować naszą pracę, tak aby przy kolejnym uruchomieniu gry zestaw pieczołowicie przygotowanych przez nas figur nie przepadł. Użyłem do tego mechanizmu LocalStorage. Podczas uruchamiania gra sprawdza, czy w LocalStorage istnieje zapisany przez nas zestaw, i jeśli istnieje, ładuje go zastępując zestaw "fabryczny".

Oceńcie zresztą sami, czy warto było trudzić się nad takim rozwiązaniem. A przy okazji rozerwijcie się, grając w Tetrisa własnymi klockami. Zapraszam serdecznie: http://angular-cms.pl/page/21

poniedziałek, 24 kwietnia 2017

I znowu gierka

Tak mi się spodobało pisanie w Java Scripcie, że trzasnąłem następną gierkę. Jest to znana wszystkim układanka Tetris. Gra jest osadzona na podstronie mojego CMS-a, podobnie zresztą jak poprzednia gra, Snake. Udało mi się uzyskać w miarę zgrabny kod, z którego jestem całkiem zadowolony. Aczkolwiek jest jedna rzecz, do której bym mógł się przyczepić - algorytm obracania figur. Bazuje on na 2-wymiarowych macierzach 3x3 i gdybym chciał w przyszłości dodać figury o większych rozmiarach, algorytm należałoby przerobić na bardziej uniwersalny, obsługujący figury dowolnej wielkości. Dało mi to do myślenia i właśnie się nad tym głęboko zastanawiam... Może coś wymyślę, a tymczasem zapraszam do zagrania on-line: http://angular-cms.pl/page/21

PS: Już wymyśliłem - wystarczy zwykła transpozycja kolumn i wierszy w odpowiedniej kolejności.

Obrót w lewo:

for (i = 0; i < this.size; i++) {
  for (j = 0; j < this.size; j++) {
    this.shape.map[i][j] = map[this.size - j - 1][i];
  }
}
Obrót w prawo:
for (i = 0; i < this.size; i++) {
  for (j = 0; j < this.size; j++) {
    this.shape.map[i][j] = map[j][this.size - i - 1];
  }
}
gdzie map[][] jest mapą figury przed transformacją.

PS: Można tworzyć własne figury i je dodawać do puli klocków - wystarczy wpisać w konsoli coś takiego, jak na przykład:

shapes.push({ map: [[1, 1, 1, 1, 0], 
                    [1, 0, 0, 0, 0], 
                    [1, 1, 1, 0, 0], 
                    [1, 0, 0, 0, 0], 
                    [1, 1, 1, 1, 1]], 
              color: 'brown' 
});

środa, 12 kwietnia 2017

Wykresy w Angularze

Apka w Angularze aż się prosiła, aby dodać do niej wykresy. Sprawdziłyby się idealnie jako prezentacja statystyk odwiedzin. Należało więc rozejrzeć się za odpowiednim komponentem. Wybór był oczywisty - Angular Chart. W końcu nie na darmo ktoś napisał bibliotekę przeznaczoną do takich rzeczy. Pobrałem, dołączyłem do projektu, przetworzyłem dane o statystykach apki odpowiednio do wymagań komponentu, osadziłem w widoku i wyszło bardzo zgrabnie.