CodeGym/Blog Java/Random-PL/Na początku był...
John Squirrels
Poziom 41
San Francisco

Na początku był...

Opublikowano w grupie Random-PL
Na początku było... - 1 Okres próbny mojej pierwszej pracy skończył się 3 lata temu, ale dopiero teraz znalazłam czas na napisanie artykułu. Spędziłem rok na różnych wydziałach mojej uczelni: na pierwszym semestrze studiowałem zarządzanie, a na drugim przeniosłem się na inżynierię oprogramowania. Miałem nadzieję, że nauczą mnie programować, ale myliłem się. Zebrałam więc materiały i postanowiłam wszystkiego uczyć się sama. Jedynym powodem, dla którego jestem wdzięczny mojemu nauczycielowi, jest to, że polecił mi zacząć od ebooka Stephena Pratta „Język programowania C”. To naprawdę dobra książka z wieloma praktycznymi ćwiczeniami. Spędziłem nad książką około 2 miesięcy, po czym natknąłem się na ten internetowy kurs Java w grupach znajomych i tak się zaczęło. Na początku planowałem zostać programistą Androida, ale backend wydawał mi się bardziej interesujący w miarę postępów w nauce. Nawiasem mówiąc, osiągnięcie poziomu 20 zajęło mi 3 miesiące nauki, po czym postanowiłem spróbować znaleźć pracę. Pierwszym celem było przeniesienie się do innego miastaponieważ mój nie miał żadnych ofert dla młodszego programisty Java. Znalazłem firmę, złożyłem podanie i otrzymałem zadanie testowe, na wykonanie którego dostałem tydzień. Musiałem napisać prostą aplikację internetową przy użyciu Hibernate, Servlet/JSP i MySQL. Widząc te wszystkie terminy, wiedziałem tylko, że MySQL to baza danych. Na początku byłem bardzo rozczarowany. Postanowiłem nawet poszukać ofert pracy w jakimś KFC, ale potem postanowiłem spróbować zadania testowego. W końcu zawsze mogłem dostać pracę w KFC. Pracowałem non stop przez cały tydzień i udało mi się ukończyć test. Przesłałem swoje rozwiązanie, ale „nie było ładne”, więc poprawiłem je jeszcze 4 razy. Moje ostatnie rozwiązanie okazało się trafne, ale miejsca były już obsadzone i dodatkowe zgłoszenia nie były przyjmowane przez 3 miesiące. Co zamierzasz zrobić, prawda? Przez następne 3 miesiące Nauczyłem się HTML, CSS, JS, SQL i PHP. Dlaczego PHP? Potrzebowałem języka serwera, który odpowiadałby na żądania i tym podobne. W tamtym czasie serwlety i jsp wydawały się zbyt skomplikowane. W końcu stworzyłem pełnoprawną aplikację internetową z okropnym interfejsem. Opublikowałem kod na GitHub dla mojego portfolio. Do tego czasu minęły 3 miesiące i ponownie skontaktowała się ze mną ta sama firma i zaprosiła na rozmowę kwalifikacyjną, dając kolejne proste zadanie sprawdzające moją znajomość SQL, które udało mi się wykonać w kilka godzin. Osoba, z którą rozmawiałem w sprawie zatrudnienia, zasugerowała, że ​​zapytają o algorytmy i struktury danych — tematy, których nie miałem jeszcze czasu opanować. To powiedziawszy, do wywiadu zostało 15 dni. Mam to! Pomogła mi książka Roberta Lafore'a „Struktury danych i algorytmy w Javie”. Ja nie' Nie miałem czasu przeczytać i zrozumieć tego wszystkiego w ciągu dwóch tygodni, ale i tak wiele się nauczyłem. I nadszedł dzień wywiadu. Przybyłem na umówioną godzinę. Przywitało mnie dwóch mężczyzn i rozpoczęła się rozmowa. Powiedzieć, że się martwiłem, byłoby dzikim niedopowiedzeniem. Mój głos drżał. Pytali o wszystko oprócz algorytmów i struktur danych. Pytali o Spring, DI, IoC, Hibernate, jak działa JVM, jak działa Garbage Collector — nie byłem w stanie odpowiedzieć na żadne z tych pytań. Udało mi się odpowiedzieć tylko na pytania dotyczące Java Core (kolekcje, wyjątki, OOP itp.). Jeszcze na rozmowie kwalifikacyjnej wiedziałem, że mi się nie udało, ale i tak byłem rozczarowany, że nie otrzymałem żadnej informacji zwrotnej. Zamiast tego zidentyfikowałem luki w mojej wiedzy i zacząłem pilnie pracować nad ich usunięciem. I nadszedł dzień wywiadu. Przybyłem na umówioną godzinę. Przywitało mnie dwóch mężczyzn i rozpoczęła się rozmowa. Powiedzieć, że się martwiłem, byłoby dzikim niedopowiedzeniem. Mój głos drżał. Pytali o wszystko oprócz algorytmów i struktur danych. Pytali o Spring, DI, IoC, Hibernate, jak działa JVM, jak działa Garbage Collector — nie byłem w stanie odpowiedzieć na żadne z tych pytań. Udało mi się odpowiedzieć tylko na pytania dotyczące Java Core (kolekcje, wyjątki, OOP itp.). Jeszcze na rozmowie kwalifikacyjnej wiedziałem, że mi się nie udało, ale i tak byłem rozczarowany, że nie otrzymałem żadnej informacji zwrotnej. Zamiast tego zidentyfikowałem luki w mojej wiedzy i zacząłem pilnie pracować nad ich usunięciem. I nadszedł dzień wywiadu. Przybyłem na umówioną godzinę. Przywitało mnie dwóch mężczyzn i rozpoczęła się rozmowa. Powiedzieć, że się martwiłem, byłoby dzikim niedopowiedzeniem. Mój głos drżał. Pytali o wszystko oprócz algorytmów i struktur danych. Pytali o Spring, DI, IoC, Hibernate, jak działa JVM, jak działa Garbage Collector — nie byłem w stanie odpowiedzieć na żadne z tych pytań. Udało mi się odpowiedzieć tylko na pytania dotyczące Java Core (kolekcje, wyjątki, OOP itp.). Jeszcze na rozmowie kwalifikacyjnej wiedziałem, że mi się nie udało, ale i tak byłem rozczarowany, że nie otrzymałem żadnej informacji zwrotnej. Zamiast tego zidentyfikowałem luki w mojej wiedzy i zacząłem pilnie pracować nad ich usunięciem. Powiedzieć, że się martwiłem, byłoby dzikim niedopowiedzeniem. Mój głos drżał. Pytali o wszystko oprócz algorytmów i struktur danych. Pytali o Spring, DI, IoC, Hibernate, jak działa JVM, jak działa Garbage Collector — nie byłem w stanie odpowiedzieć na żadne z tych pytań. Udało mi się odpowiedzieć tylko na pytania dotyczące Java Core (kolekcje, wyjątki, OOP itp.). Jeszcze na rozmowie kwalifikacyjnej wiedziałem, że mi się nie udało, ale i tak byłem rozczarowany, że nie otrzymałem żadnej informacji zwrotnej. Zamiast tego zidentyfikowałem luki w mojej wiedzy i zacząłem pilnie pracować nad ich usunięciem. Powiedzieć, że się martwiłem, byłoby dzikim niedopowiedzeniem. Mój głos drżał. Pytali o wszystko oprócz algorytmów i struktur danych. Pytali o Spring, DI, IoC, Hibernate, jak działa JVM, jak działa Garbage Collector — nie byłem w stanie odpowiedzieć na żadne z tych pytań. Udało mi się odpowiedzieć tylko na pytania dotyczące Java Core (kolekcje, wyjątki, OOP itp.). Jeszcze na rozmowie kwalifikacyjnej wiedziałem, że mi się nie udało, ale i tak byłem rozczarowany, że nie otrzymałem żadnej informacji zwrotnej. Zamiast tego zidentyfikowałem luki w mojej wiedzy i zacząłem pilnie pracować nad ich usunięciem. Udało mi się odpowiedzieć tylko na pytania dotyczące Java Core (kolekcje, wyjątki, OOP itp.). Jeszcze na rozmowie kwalifikacyjnej wiedziałem, że mi się nie udało, ale i tak byłem rozczarowany, że nie otrzymałem żadnej informacji zwrotnej. Zamiast tego zidentyfikowałem luki w mojej wiedzy i zacząłem pilnie pracować nad ich usunięciem. Udało mi się odpowiedzieć tylko na pytania dotyczące Java Core (kolekcje, wyjątki, OOP itp.). Jeszcze na rozmowie kwalifikacyjnej wiedziałem, że mi się nie udało, ale i tak byłem rozczarowany, że nie otrzymałem żadnej informacji zwrotnej. Zamiast tego zidentyfikowałem luki w mojej wiedzy i zacząłem pilnie pracować nad ich usunięciem.Znalazłem pracę miesiąc po nieudanej rozmowie kwalifikacyjnej. Nawiasem mówiąc, znalazłem ofertę pracy w dyskusjach na CodeGym ( CodeGym to rosyjskojęzyczna wersja CodeGym — przyp. red.)). Najpierw była rozmowa Skype z rekruterem (trwała około 2 godzin). Pytali o Java Core, wyrzucanie elementów bezużytecznych (teraz już wiedziałem, jak to działa), bazy danych i struktury danych. Ankieter poprosił mnie o udostępnienie ekranu i napisanie kalkulatora. Prawie płakałem z radości, bo tydzień wcześniej napisałem kalkulator. Ufny w siebie przystąpiłem do zadania. Ale czy to z powodu ekscytacji, czy z innego powodu, zapomniałem o części algorytmu. Udostępniono mój ekran. Bałem się konsultacji z Google. Na szczęście miałem telefon komórkowy, który uratował mi tyłek. Następnego dnia wezwali mnie na osobistą rozmowę, a kilka dni później otrzymałem ofertę. To nie było oficjalne stanowisko. Moja rola polegała na praktykowaniu u jednoosobowego właściciela. Napisaliśmy serwis do planowania imprez, sprzedaży biletów itp. Pamiętam swój pierwszy dzień pracy. Mojemu szefowi zajęło 15 minut wyjaśnienie, co należy zrobić. — Czy wszystko jasne? on zapytał. „Hmm, raczej nie. Możesz to przeanalizować jeszcze raz?” — zapytałem z wielką troską. Szef znowu wszystko wyjaśnił. — Teraz jest jasne? — Tak, teraz jest. Właściwie to NIC nie zrozumiałem. Ale bałam się poprosić o inne wyjaśnienie. Myślę, że każdy zatrudniony jest w stanie to zrozumieć. Zadanie sprowadzało się do przeportowania z Thymeleaf na AngularJS. Na szczęście znalazłem fragment gotowego kodu i użyłem go jako przykładu tego, co robić. Nie rozumiałem, jak to działa, ale wykonałem zadanie. Następnie przydzielono mi zadania bezpośrednio związane z backendem. Dopiero po praktycznym doświadczeniu ze Springiem zacząłem rozumieć, co czytam w „Spring for Professionals”. Pracowałem tam 8 miesięcy, a potem przeniosłem się do innego miasta, gdzie szybko znalazłem oficjalną pracę, przepracowałem 2 lata i po drodze zmieniłem tytuł z „młodszego” na „średni”. Potem zmierzyłem się z faktem, że moja praca stała się rutyną i nie sprawiała mi ani kropli przyjemności. Więc zrobiłem sobie przerwę. Aby nie dopuścić do atrofii palców podczas przerwy, postanowiłem spróbować swoich sił w innej dziedzinie: tworzeniu gier. Mówiąc dokładniej, tworzenie gier mobilnych, zbieranie Androida, ponieważ znałem już Javę. I o tym teraz szczegółowo opowiem. Dopiero po praktycznym doświadczeniu ze Springiem zacząłem rozumieć, co czytam w „Spring for Professionals”. Pracowałem tam 8 miesięcy, a potem przeniosłem się do innego miasta, gdzie szybko znalazłem oficjalną pracę, przepracowałem 2 lata i po drodze zmieniłem tytuł z „młodszego” na „średni”. Potem zmierzyłem się z faktem, że moja praca stała się rutyną i nie sprawiała mi ani kropli przyjemności. Więc zrobiłem sobie przerwę. Aby nie dopuścić do atrofii palców podczas przerwy, postanowiłem spróbować swoich sił w innej dziedzinie: tworzeniu gier. Mówiąc dokładniej, tworzenie gier mobilnych, zbieranie Androida, ponieważ znałem już Javę. I o tym teraz szczegółowo opowiem. Dopiero po praktycznym doświadczeniu ze Springiem zacząłem rozumieć, co czytam w „Spring for Professionals”. Pracowałem tam 8 miesięcy, a potem przeniosłem się do innego miasta, gdzie szybko znalazłem oficjalną pracę, przepracowałem 2 lata i po drodze zmieniłem tytuł z „młodszego” na „średni”. Potem zmierzyłem się z faktem, że moja praca stała się rutyną i nie sprawiała mi ani kropli przyjemności. Więc zrobiłem sobie przerwę. Aby nie dopuścić do atrofii palców podczas przerwy, postanowiłem spróbować swoich sił w innej dziedzinie: tworzeniu gier. Mówiąc dokładniej, tworzenie gier mobilnych, zbieranie Androida, ponieważ znałem już Javę. I o tym teraz szczegółowo opowiem. gdzie szybko znalazłem oficjalną pracę, przepracowałem 2 lata i po drodze zmieniłem tytuł z "młodszego" na "średniego szczebla". Potem zmierzyłem się z faktem, że moja praca stała się rutyną i nie sprawiała mi ani kropli przyjemności. Więc zrobiłem sobie przerwę. Aby nie dopuścić do atrofii palców podczas przerwy, postanowiłem spróbować swoich sił w innej dziedzinie: tworzeniu gier. Mówiąc dokładniej, tworzenie gier mobilnych, zbieranie Androida, ponieważ znałem już Javę. I o tym teraz szczegółowo opowiem. gdzie szybko znalazłem oficjalną pracę, przepracowałem 2 lata i po drodze zmieniłem tytuł z "młodszego" na "średniego szczebla". Potem zmierzyłem się z faktem, że moja praca stała się rutyną i nie sprawiała mi ani kropli przyjemności. Więc zrobiłem sobie przerwę. Aby nie dopuścić do atrofii palców podczas przerwy, postanowiłem spróbować swoich sił w innej dziedzinie: tworzeniu gier. Mówiąc dokładniej, tworzenie gier mobilnych, zbieranie Androida, ponieważ znałem już Javę. I o tym teraz szczegółowo opowiem. Postanowiłem spróbować swoich sił w innej dziedzinie: tworzeniu gier. Mówiąc dokładniej, tworzenie gier mobilnych, zbieranie Androida, ponieważ znałem już Javę. I o tym teraz szczegółowo opowiem. Postanowiłem spróbować swoich sił w innej dziedzinie: tworzeniu gier. Mówiąc dokładniej, tworzenie gier mobilnych, zbieranie Androida, ponieważ znałem już Javę. I o tym teraz szczegółowo opowiem.Moja drużyna. W krótkim czasie zebrałem mały zespół składający się z 4 osób (w tym ja): 2 programistów, 1 projektant gry i 1 inżynier dźwięku. Ponieważ nikt w zespole nie miał doświadczenia w tworzeniu gier, a mój urlop był ograniczony, postanowiliśmy wdrożyć prosty projekt, który na pewno uda nam się ukończyć. I tak też zrobiliśmy! Początkowo terminem był 15 listopada, ale jak wiadomo, terminowe zakończenie projektu jest po prostu złe. Skończyliśmy więc z dwutygodniowym opóźnieniem. Nasz stos technologiczny składał się z Java 8 i libGDX.

Rozwój

Rozwój rozpoczął się 17 października. W sumie spędziliśmy 45 dni podczas których:
  1. Nauczyliśmy się korzystać z libGDX.
  2. Napisaliśmy kod.
  3. Stworzyliśmy grafikę.
  4. Tworzyliśmy muzykę.
Każdy, kto widział grę, może zapytać: „Dlaczego trwało to tak długo? Gra jest taka prosta”. Tak, to prawda, a dokładniej, część programistyczna (napisanie kodu) zajęła około półtora tygodnia. Resztę czasu podzielono między:
  1. Opanowanie obsługi silnika gry.
  2. Rysowanie i przerysowywanie dzieł sztuki.
  3. Pisanie muzyki.
  4. Wyszukiwanie dźwięków na https://freesound.org .
  5. Czytając mnóstwo artykułów o tym, jak promować gry.
Mieliśmy też momenty „przestoju” z różnych powodów: ktoś miał egzamin, ktoś inny miał makijaż próbny itp. Z pewnością możemy przypisać półtora tygodnia lub więcej przestojowi. Trochę czasu poświęcono też na „dyskusje”: prawie codziennie pojawiały się nowe pomysły na to, co dodać do gry, więc dyskutowaliśmy: „to zbędne”, „to nie pasuje” itp. Wyrzuciliśmy wiele pomysłów, na przykład dodanie biegających karaluchów, które można było zmiażdżyć, aby zdobyć dodatkowe punkty: moim zdaniem jedną z najtrudniejszych rzeczy było z góry zdecydować, co będzie w grze i trzymać się planu bez próby dodania „jeszcze tylko jednego " funkcja. Tak narosło te 45 dni. Prototyp gry był gotowy po półtora tygodnia. W tym okresie tak naprawdę nie mieliśmy żadnych grafik, Na początku było... - 2Gra jest bardzo prosta pod względem technicznym. Nie potrzebowaliśmy nawet używać box2d (silnika fizycznego). Samodzielnie radzimy sobie z kolizjami i obliczamy przeciwprostokątną. Najciekawsze punkty, które zwrócę uwagę, to:
  1. Początkowo wszystkie elementy gry były generowane losowo. Innymi słowy, umieszczamy dostawców (czarnych dziur, nożyczek, gwiazdek ninja, ołówka, serc) w tablicy, otrzymujemy losowego dostawcę, otrzymujemy element o losowych współrzędnych. Dość szybko stało się jasne, że to podejście „naprawdę nie było dobre”. Znajomi biorący udział w testach powiedzieli nam to samo, zalecając korzystanie z szablonów. Dla osób zajmujących się tworzeniem gier jest to chyba oczywiste rozwiązanie. Ale ponieważ byliśmy nowicjuszami w tej dziedzinie, była to dla nas bardzo praktyczna rada.

    Stworzyliśmy więc kilka szablonów: dolinę nożyc; ołówki — całkiem fajne jest zbieranie ich w superszybkim tempie (szu, fuuuuuuu palcem); i jeszcze jeden szablon, którego nie wiem jak nazwać — powiem tylko, jak nazwaliśmy tę klasę w naszym kodzie: StraightForwardPattern.

    Na początku było... - 3

    Te szablony poprawiły to, ale jakoś stało się zbyt przewidywalne. Dlatego dodaliśmy jeszcze jeden: losowy szablon. Innymi słowy, mamy teraz kilka „statycznych” szablonów i jeden losowy (tu wstaw mem „idealnie zrównoważony”).

  2. Oto główny problem, który napotkaliśmy. LibGDX wywołuje metodę renderowania (float delta) w nieskończonej pętli. Tutaj rysowane są wszystkie elementy. Linia ołówka jest rysowana w następujący sposób: otrzymujemy współrzędne palca i rysujemy tam teksturę. Tak więc, gdybyśmy bardzo szybko przesunęli palec po ekranie, linia miałaby „przerwy” spowodowane milisekundami między wywołaniami metody render(delta).

    Rozwiązanie było dość proste: zapamiętujemy ostatnie współrzędne miejsca rysowania tekstury, pobieramy kolejne współrzędne i jeśli odległość między nimi jest większa niż X, a palec nie został puszczony, wypełniamy lukę. Na początku myśleliśmy, że ta opcja może nie działać — linie będą kanciaste. Ale nasze obawy były bezpodstawne, wszystko działało tak, jak powinno.

O grze

Rozgrywka nie pretenduje do miana wyjątkowej, ale jest całkiem niezła i potrafi wciągnąć użytkowników. Sterujesz ołówkiem, dosłownie rysujesz na papierze i unikasz przeszkód — nożyczek, gwiazdek ninja i czarnych dziur. W międzyczasie twój ołówek się kończy i musisz podnieść małe ołówki. Jeśli twój ołówek dobiega końca, zanim zbierzesz mały ołówek, możesz podnieść kawałek lustra. Na kilka sekund, zamiast konsumować grafit ołówka, zostanie on przywrócony, jednak w tym samym czasie elementy sterujące są lustrzane — jeśli palec przesunie się w lewo, ołówek przesunie się w prawo. Możesz także podnieść serce, które pozwoli ci raz uderzyć w przeszkodę i pozostać przy życiu. Im dłużej poruszasz ołówkiem bez podnoszenia palca, tym wyższa jest Twoja kombinacja, co oznacza, że ​​szybciej zdobędziesz punkty. Na początku było... - 4Szybkość gry również wzrasta stopniowo. Brakuje tylko wściekłych ptaków. Początkowo planowaliśmy nazwać grę Karan Dash (transliteracja rosyjskiego słowa oznaczającego ołówek to karandash — ha! rozumiesz?), ale później zmieniliśmy zdanie i zdecydowaliśmy się na Pencil Dash. Zrobiliśmy to, ponieważ ta pełna wdzięku gra słów byłaby zrozumiała tylko dla rosyjskojęzycznej publiczności. Wydaliśmy grę kilka dni temu i teraz ją promujemy. Tutaj również nikt w zespole nie ma doświadczenia. Całą naszą wiedzę na temat promocji gier czerpaliśmy z różnych artykułów. Opublikowaliśmy informacje o grze na różnych stronach/forach za darmo. Nasze płatne kanały obejmowały reklamy na 4pd, reklamy z jednym blogerem, kilka postów w grupach publicznych na VKontakte oraz reklamy AdMob. Przy okazji, ten post jest również częścią naszej promocji, więc za zgodą administracji serwisu zamieszczam tutaj link do gry. Grę można znaleźć w Google Play tutaj . Byłbym wdzięczny, gdybyś go zainstalował (może ci się spodoba!), a jeśli zostawisz ocenę, obiecuję nazwać dziecko twoim imieniem! :) Na początku było... - 6
Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy