Mój blog programistyczny

0

Witam,
Chciałbym pokazać Wam mojego bloga: https://anonimowyprogramista.wordpress.com/
Dopiero zaczynam, ale prowadzę go systematycznie. Znajdziecie tutaj głównie krótkie notatki, ale i dłuższe wpisy. Zacząłem serię wpisów, związaną z Androidem i pisaniem pod niego gier 2D. Mam nadzieję, że będziecie go systematycznie odwiedzać :)

1

Prawdę mówiąc nic tam nie ma... po co komu wpisy na góra może 30 słów?

Nie rób miliona postów o niczym, napisz jeden, ale za to obszerny, konkretny, poruszający w całości tematykę, którą chcesz w nim zawrzeć (...), nadążasz, prawda?

Poza tym język, język, język:

Mój wybór padł na Android Studio. Czemu ? Nie lubię Eclipsa i jemu podobnych… Wolę coś innego, niż wszystko, a zarazem funkcjonalnego

1.Dlaczego?
2.Nie rób spacji przed znakiem zapytania.
3.coś innego niż wszystko (przecinek).

Oraz oczywiście kwestia czcionki/fontu/jak zwał tak zwał - nie wiem czy to Twoje pogrubienia czy po prostu tak ten font wygląda, ale nie mogę na niego patrzeć.
5a95778ee3.png

0

Finalny wygląd strony prezentuje się tak: https://anonimowyprogramista.wordpress.com/
Zacząłem serię pisania prostej, przykładowej gierki w LibGDX na Androida i Win, wykorzystując Box2D

1

Ja rozumiem że na początku przygody można robić brzydkie rzeczy, jak np. mieszkanie angielskiego i polskiego kodu, ale każdy kto nazywa siebie programistą powinien być za to bezwzględnie wychłostany! A jak jeszcze ktoś tak pisze na blogu i rozprzestrzenia tak wiedzę dalej, to powinna powstać specjalna, mocno piekielna kara.

2

Programowanie to coś zupełnie innego, niż tylko pisanie ciągów wyrazów. Należy odnaleźć w tym sztukę.

Nie. Tak samo jak piekarz, listonosz czy szewc - programista wykonuje swój wyuczony zawód - częściej lub rzadziej, potrzebuje do tego specjalistycznej wiedzy, ale częściej jednak będzie to po prostu wyuczony fach. Rzemieślnictwo nie sztuka. Główna różnica między byciem artystą a rzemieślnikiem będzie w tym przypadku taka, że sztuka nie musi być utylitarna, a appka owszem, może pod spodem wysrywac stacktrace ale ma dostarczyć funkcjonalność.

6

@niezdecydowany - gdyby nie bylo elementow sztuki nie byloby failujacych projektow. Teoretycznei to rzemeislnicza praca, ale liczba kombinacji roznych czynnikow po drodze jest tak potworna ze nie jest to proces zdefiniowany od poczatku do konca.

0

Będę stosował język polski w kodzie, bo widzę, że jest to bardzo ważne, nawet w kursach :)

1

Bardzo ważna jest znajomość języka angielskiego, a bez niej tworzy się właśnie takie dwujęzyczne kodopodobne "coś".

4

Programowanie na obecnym etapie naszej cywilizacji jest sztuką. Tyle że bardziej w znaczeniu "mistrz szachowy" niż "malarz".
Teoretycznie jest to praca mechaniczna i można sobie wyobrazić maszynę, która sama siebie programuje.

Niestety, przy obecnym stanie techniki ilość kombinacji powoduje że zawsze trzeba coś szacować, założyć, ustalić strategię lub standard - rzeczy te nie są zajęciami z zakresu nauk ścisłych i można to robić na kilka sposobów. A efekty ocenić będzie można dopiero po kilku latach używania i modyfikacji aplikacji.
A wnioski "mogliśmy zrobić to tak a tak" nie mają już wtedy żadnego znaczenia, bo technologia idzie ciągle do przodu, odkrywamy ciągle nowe paradygmaty, zmienia się target aplikacji (mainframe -> desktop -> mobile -> IoT -> ?), tak że wnioskowanie po czasie jest jak rozmowa o strategii obrony w '39.

A to że jeden programista wraca z pracy i marzy tylko o piwku przed TV, a drugi wraca i bierze się za własne projekty - to już kolejny wątek. Zwykle wpływa to na poziom kodu, ale nie zawsze. Pewnie z 1 na 100 rozwija się wystarczająco szybko w samej pracy a w domu może poświęcić się rodzinie.

0

Zmieniłem język w kodzie na angielski. Mam nadzieję, że nie zostawiłem błędów przez to...

9
public Line(float x, float y, String path, Type type) {

Znając hierarchię klas (patrząc wgłąb) można dojść do tego, o co chodzi z path oraz type, ale mój mózg nawet po przetworzeniu tego nieustannie pyta co autor miał na myśli.
tl;dr - zaprojektuj to patrząc z perspektywy usera, który będzie chciał to wykorzystać. Line(float x1, float y1, float x2, float y2), albo jeszcze lepiej Line(Point a, Point b) wygląda bardziej sensownie.

2.Dlaczego wewnątrz Box2dWorld WORLD jest polem statycznym oraz dlaczego jest inicjowany za każdym razem w konstruktorze? To nie jest jednoznaczne i po chwili namysłu można dojść, jakie było Twoje założenie, lecz wygląda to na typowy błąd projektowy.

Vector<Line>line; // nasz vector linii
Vector<Square>square; // nasz vector kwadratow

Gdybyś miał 50 rodzajów figur to też tak byś zrobił?
Dlaczego nie wykorzystasz po prostu listy na podstawie obiektu bazowego (Object)?

public Vector<Line> getLine()

Nazwa sugeruje, że metoda zwraca pojedynczą linię. A tutaj zonk.
Przy okazji nazwy pól line oraz square także są błędne, ponieważ w rzeczywistości zmienne te są listami, a nie pojedynczymi obiektami.

public void draw(Object o)
{
    batch.begin(); // poczatek rysowania
    o.getSprite().setPosition(o.getBody().getPosition().x, o.getBody().getPosition().y); // ustawiamy pozycje do rysowania
    o.getSprite().draw(batch); // rysuj
    batch.end(); // koniec rysowania
}

To żeś pojechał po czytelności.

public void draw(Object o)
{
    jakiś_typ sprite = o.getSprite();
    jakiś_typ bodyPosition = o.getBody().getPosition();

    batch.begin();
    sprite.setPosition(bodyPosition.x, bodyPosition.y);
    sprite.draw(batch);
    batch.end();
}

Oczywiste komentarze w stylu ustawienie pozycji sobie daruj, ponieważ nie wnoszą one do kodu nic. Komentarze mają służyć tłumaczeniu fragmentów, które są niejasne na pierwszy rzut oka (jeśli w ogóle takie muszą być zawarte w kodzie), a nie dopisywaniu do każdej linijki tego, co ona robi.

6.setPath2 i cała ta reszta w stylu pole2 - nie rób tak. Serio, nigdy.
a) ta nazwa sama w sobie jest nieoczywista, podobnie jak nazwa pola path - wystarczy texturePath i już każdy wie o co chodzi, mamy XXI wiek, naprawdę nie musisz oszczędzać na długości identyfikatorów,
b) skąd po samej nazwie mam się domyślić, co takiego robi setPath2? Muszę dopiero zerknąć do kodu srututututu i tracę czas.
c) poza tym ta metoda nie ma "sensu istnienia" - od takich rzeczy powinien być jakiś osobny menedżer tekstur...

7.setText2 - tak, faktycznie text to bardzo adekwatne zdrobnienie od texture. Zachowujesz całe trzy znaki w zamian za utworzenie słowa tekst z tekstura. Wina temu, kto bez zaglądania do kodu domyśli się, że setText ustawia teksturę, a nie jakiś napis/opis/tekst obiektu.

8.changeColor kolejna wykwitnie dobrana nazwa - zwłaszcza że formalnie nie możesz ustawić koloru, a jedynie zmienić teksturę obiektu. Poza tym to powinno być wrzucone do jakiegoś zdarzenia onObjectTouched, a nie tak z tyłka wrzucone nie-wiadomo-w-sumie-dlaczego...

9.if(text2Number > 3) // jesli numer jest wiekszy od 3
Faktycznie gdyby nie komentarz, nie wiedziałbym co się tutaj dzieje :|

10.float t_FromCreatingObject = 0; // czas od ostatniego stworzenia obiektu
from creating object? Co to ma być? Janusze angielskiego?

11.isCreateSquare fantastyczna nazwa - jest utworzyć kwadrat... canCreateSquare było pewnie za bardzo czytelne, stąd ta zmiana.

private void createSquare()
{
    if(isCreateSquare())
    {

Beeeeeeeeeeeeep *bardzo głośne i natarczywe*.
canCreateSquare powinno być sprawdzane poza samym createSquare.

        switch (random) // losujemy kierunek lotu kwadratu
        {
            case 0:
                square.lastElement().body.setLinearVelocity(3,0);
                break;
            case 1:
                square.lastElement().body.setLinearVelocity(-3,0);
                break;
            case 2:
                square.lastElement().body.setLinearVelocity(0,3);
                break;
            case 3:
                square.lastElement().body.setLinearVelocity(0,-3);
                break;
        }

Proszę powiedz, że widzisz, jak bardzo ten fragment jest upośledzony.

    private void drawObjects()
    {
        for(int i = 0; i != objectManager.getLine().size(); i++) {
            Mirror.GRAPHICS.draw(objectManager.getLine().get(i));
        }
        for( int i = 0; i != objectManager.getSquare().size(); i++)
        {
            Mirror.GRAPHICS.draw(objectManager.getSquare().get(i));
        }
    }

Nie czaję po co bawisz się w to całe dziedziczenie, aby potem i tak rozdzielać wszystko na linie oraz kwadraty :|
Przecież w ten sposób marnujesz 50% sensu istnienia dziedziczenia.

15.O oknie w „pełnym rozmiarze” decyduje Fullscreen janusze gramatyki - to zdanie brzmi jak gdyby Fullscreen było jakimś super-menedżerem dyktującym co się dzieje z oknem w pełnym rozmiarze. O tym, czy okno jest pełnoekranowe, czy też nie decyduje parametr "Fullscreen" - gdy jest równy 'true', okno jest uruchomione w trybie pełnoekranowym (...).

16.a [o] wysokości i szerokości okna kolejno height i width jakoś bardziej "następujące po sobie" wydaje mi się wskazanie a [o] szerokości i wysokości okna decydują odpowiednio "width" oraz "height", zwłaszcza że w praktycznie każdym silniku taka jest właśnie kolejność argumentów: najpierw szerokość, a dopiero potem wysokość.

Jeszcze odnośnie języka:

17.[tworzymy nowy projekt] i usuwamy domyślne wypełnienie naszej klasy: [jakiś kod] - to zdanie sugeruje, że kod znajdujący się poniżej jest tym, który jest domyślnym wypełnieniem. [tworzymy nowy projekt] i usuwamy domyślny szablon na rzecz: [jakiś kod]

18.Nic chyba w tym fragmencie tłumaczyć nie muszę ;) brzmi co najmniej dziwnie, zwłaszcza że jest to de facto pierwszy komentarz odnośnie kodu, jaki pojawia się w Twoim artykule.

19.// te wykonują się co klatkę w grze, czyli cały czas chwila, chwila, bo coś mi się wydaje, że na konstrukcję tego zdania miały wpływ dopalacze - to w końcu co klatkę czy cały czas?

20.W takim wypadku wystarczy w naszej głównej klasie Mirror dodać jednego switcha, czy kilka if, które będą zmieniać etap naszej aplikacji np. ze względu na enum State. słuchaj, fajnie że jakaś wizja Ci siedzi w głowie, ale jeśli nie masz zamiaru jej dokładnie opisywać to daruj sobie takie bezceremonialne wplątywanie zdań w główną treść. Ty się pochwalisz świadomością istnienia konstrukcji switch oraz enumów, ale czytelnik nic z tego nie wyniesie. Nie mówiąc oczywiście o tym, że rozwiązanie ze switchem i enumem State jest beznadziejne.

21.Pierwsza z nich będzie odpowiadała za rysowanie wszystkich obiektów, a druga za ich aktualizowanie. - (...) druga zaś za ich aktualizację bardziej mi podpada.

22.camera = new OrthographicCamera(1920f,1200f); // rozmiar naszego ekranu no ale że co, kamera jest rozmiarem ekranu?

23./* najpierw stworzymy klase obiektu, a potem to umiescimy wracamy do punktu 20., czyli: nie wyprzedzaj faktów, ponieważ wprowadzasz w ten sposób czytelnika w niemałą konsternację. Trzeba na to szczególnie uważać, gdy grupą docelową są osoby niezaznajomione z tematem.

24.bo Box2D liczy w metrach i odpowiada to 1920 x 1200 cm znowu wyczuwam jakieś dopalacze - w połączeniu z new OrthographicCamera(1920f,1200f) wychodzi na to, że Box2D liczy w centymetrach, a nie metrach. Jest to poważny błąd rzeczowy! (zaczynam brzmieć jak jakaś polonistka, brrr)

25.Object będzie rodzicem, dla naszych Square i Line, czyli krawędzi kwadrat jest krawędzią... każdego dnia dowiaduję się tylu nowych rzeczy...

26.Oczywiście wszystko w skali, bo musimy się dostosować do naszego Box2D po prostu dostosować do Box2D, a nie naszego.

27.(...) która będzie miała za zadanie, sygnalizować nam, kiedy Objectzostanie dotknięty. przecinki w, niewłaściwych, miejscach.

28.Na końcu dodajemy dwie metody get. to żeś zaszalał z tym opisem metod.

dalej już nawet nie mam siły, zatem kończąc:

tl;dl - naprawdę, nie ucz innych samemu nie mając praktycznie żadnej rozsądnej wiedzy z danego działu. Chociaż Ty nie przykładaj tej cegiełki, która powoduje, że ludzie mówią internet jest pełen bzdur.

1

Szanuję krytykę, ale przyczepiłeś się do każdej możliwej rzeczy.

Programowanie to taka dziedzina, gdzie trzeba być szczegółowym, zwłaszcza wtedy, gdy uczy się początkujących.
Chyba nie chciałbyś kiedyś obudzić się po operacji wyrostka z wyciętą nerką bo lekarz gdzieś tam w internecie kiedyś coś.
Albo z domem bez drzwi wejściowych, bo architekt kiedyś w internecie zobaczył, że ktoś coś.

Każdy myślący człowiek rozumie zdanie i nie musi go rozkładać na czynniki pierwsze i szukać błędu.

No proszę, a jednak tyle błędów popełniłeś. Najwyraźniej musisz wciąż rozkładać na czynniki pierwsze.
Plus wracamy do tematu programowania jako dziedziny wymagającej niemieckiej precyzji.

Materiał przygotowany jest dla początkującego, nie osoby, która ma doświadczenie wielu lat. Stąd większość komentarzy np. ze względu na język angielski, żeby nie utrudniać analizowania kodu.

Podczas gdy oczywiste komentarze utrudniają właśnie jego analizę.
Robisz kod dla początkujących czy idiotów?

sam napisz coś według Ciebie wartego uwagi, a ja ocenię.

Jeżeli natrafię na jakiś ciekawy i unikalny temat to jak najbardziej go opiszę ;)
Natomiast nie prowadzę bloga z tego właśnie powodu, że pisanie interesujących, bezbłędnych tekstów zajmuje masę czasu i stanowi po prostu wyzwanie mnie przerastające (tzn. jeśli mam wybierać między wyjściem ze znajomymi, a siedzeniem i pisaniem artykułu, to cóż...).

To takie wygodne i przyjemne skrytykować kogoś.

No ba :)

Nie mam pretensji,tylko nie lubie takiego podejscia

Jakiego podejścia? Mam Ci słodzić, że wszystko jest okej, kochaniutki, Agora już czeka na wersję książkową oraz adaptację?
Nie, odwalasz byle jaką moim zdaniem robotę i nie zamierzam Ci mówić co w tym poście jest okej, bo nic nie jest - nawet gramatyka pozostawia wiele do życzenia.
Jak dla mnie to jesteś po prostu kolejną osobą dosadnie doświadczającą życia poprzez efekt Krugera-Dunninga - myślisz, że opanowałeś temat już na tyle, aby nauczać innych, podczas gdy jesteś nie lepszy od czterolatka bawiącego się w piaskownicy.

Nie piszę Ci tego wszystkiego, bo mi się nudzi i chcę Ci dowalić - przedstawiam Ci po prostu drugą stronę tego medalu. I o ile jesteś mądrym człowiekiem, zrozumiesz że dla Ciebie jest jeszcze za wcześnie, aby chwalić się swoimi materiałami. Przerób kilka książek o gamedevie, przerób wzorce projektowe, poudzielaj się w projektach open source i rozpocznij jakiegoś bloga za trzy, cztery+ lat mając już konkretną wiedzę, którą warto w pigułce przekazać początkującym.

0

Postanowiłem zacząć od nowa i większą uwagę przywiązać do szczegółów. Jedynie pokazuje jak można używać biblioteki LibGDX. Mam nadzieję, że jest teraz dużo mniej błędów. Za literówki bardzo przeprasza, staram się je poprawiać jak tylko zobaczę. Jeśli nie umieściłem jakiegoś fragmentu kodu i czegoś brakuję, to od razu wstawię, gdy tylko się dowiem, ale mam nadzieje, że wszystko jest kompletne.
https://anonimowyprogramista.wordpress.com/

1 użytkowników online, w tym zalogowanych: 0, gości: 1