Pokaż wyniki od 1 do 8 z 8
Like Tree2Likes
  • 1 Post By Aravorn
  • 1 Post By Klaus Korner

Wątek: Model MVC a wyświetlanie walki

  1. #1
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie Model MVC a wyświetlanie walki

    Znowu o obiektowym programowaniu, ale taki problem jest również nawet podczas kodu strukturalnego.. Czytałem o wzorcach projektowych, sprawa jest dość oczywista, jednak nie widzę optymalnego rozwiązania.

    Wiadomo, że trzeba oddzielać kod php od kodu html, odpowiedzialnego za wyświetlanie.

    Weźmy sobie przypadek z Vallheru:
    wyświetlany jest plik head.php, który wyświetla nam lewą kolumnę, dane gracza, jego punkty życia np równe 30/40.
    następnie jest includowany plik battle.php, gdzie jest skrypt walki itp. Jest on wyświetlany na bierząco, jeżeli będzie unik, to wyświetla się informacja o uniku itp..
    Po walce prawdopodobnie mamy inne punkty życia niż 30/40, ale niestety, to zostało już wyświetlony, więc do tego nie wrócimy.
    Następnei includowana jest stopka i lista aktualnie zalogowanych graczy, która jest najbardziej "aktualna".


    Taki system jest "bardzo prawdopodobnie tragiczny".

    W jakichś swoich projektach używałem na początku drobnej mieszanki kodu obiektowego w php, np moja strona wyglądała w ten sposób:
    Kod php:
    //obiekty, klasy
    <html>
    <div>
    <?php echo $player->getHealth();?>
    </div>
    <div>
    <?php $battle = new battle(array(1,2), array(35); ?>
    walczą gracze 1 2 przeciwko 3 i 5. To załatwiało dosłownie wszystko. Wczytywało graczy, uaktualniało, na bierząco "echowałem" uniki i obrażenia.
    </div>
    Tutaj kod js, który uaktualniał div z punktami życia, żeby wszystko się pięknie zgadzało.
    To takie tragiczne nie było, no ale jestem pewien, że da się lepiej. Mój plan, obecnie założenia:

    1. ABSOLUTNIE nie używać echo w klasach. Czy to dobra praktyka?
    2. BEZWZGLĘDNIE najpierw generować cały kod php, a następnie to wszystko wyświetlać.

    Np.

    Kod php:
    <?php
    $battle 
    = new battle();
    $battle->addCharacter('id1''team1''player');
    $battle->addCharacter('id3''team2''monster'); //wiadomo, że liczby, chodzi mi o ukazanie pomysłu i za co odpowiadają poszczególne argumenty.
    $battle->fight();
    ?>

    <html>
    <div>
    <?php echo $player->getHealth(); ?>
    wyswietlanie zycia gracza. Pieknie, aktualne i w ogóle przyjazne.
    </div>
    <div>
    Jeżeli to walka, to muszę jakoś tę walkę wyświetlić.. Tu jednak pojawia się problem.
    </div>
    Jedyne co mi przychodzi do głowy to tworzenie olbrzymiej zmiennej, która mi to wszystko zachowa.

    Mogę też jakoś zapisać całą walkę do bazy danych, żeby potem się nią dzielić z innymi graczami czy coś. Fajna sprawa, tak mi się wydaje i rozwiązuje problem.
    Tylko raczej zapisywałbym wtedy całą walkę na chama, bo trzymanie ziarna to nie wszystko - trzeba pamietac jakie zdolnosci, przedmioty ktos mial aktualnie i to nie jest łatwe do ogarnięcia..
    Ostatnio edytowane przez Drikam ; 29-06-2013 o 09:55

  2. #2
    Programista Awatar Aravorn
    Dołączył
    Apr 2011
    Posty
    343

    Domyślnie

    Ja bym stworzył nowy widok i tam dla przykładu przekazał dane w JSON, a potem przeglądarka sama by to odpowiednio wygenerowała kod HTML objętościowo będzie o kilkadziesiąt procent jak nie kilkaset większy od kodu JSON, jak sensownie to wszystko napiszesz.
    Drikam likes this.

  3. #3
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Nigdy czegoś takiego nie robiłem, ale w sumie wydaje się być bardzo dobrym rozwiązaniem.

  4. #4
    Programista Awatar Aravorn
    Dołączył
    Apr 2011
    Posty
    343

    Domyślnie

    Warto pokombinować. Idziesz po linii programowania, nie kodzenia, dlatego też radzę zapoznać się z jakąś książką o wzorcach projektowych, co i tak na studiach w pewnym momencie będzie wręcz koniecznością
    Co do samego MVC polecam zajrzeć na Dzienniki Zyxowe, sprawdzić proces produkcji aplikacji z użyciem jakiegoś frameworka. Mogę polecić Laravela, w który z pracy będę miał do czynienia już niedługo, gdzie MVC przyzwoicie wygląda (prawda jest taka, że często mówi się, o MVC stosując w praktyce np. MVP). Bazuje on na funkcjach anonimowych, callbackach itd., ciekawie to wszystko wygląda z tego powodu właśnie w ujęciu MVC

  5. #5
    Programista
    Dołączył
    Sep 2007
    Posty
    622

    Domyślnie

    Rozwiązanie stosowane w Vallheru jest tragiczne - najpierw wyświetl nagłówek, potem wykonaj kod strony i wyświetl stronę, a na koniec wyświetl stopkę.

    Dobrym rozwiązaniem tego problemu jest tzw. dziedziczenie szablonów. Szablon jest ładowany raz, już po zakończeniu wszystkich obliczeń. Z tego rozwiązania korzysta m.in. Django. Kilka linków do poczytania:

    http://static.invenzzia.org/docs/opt...heritance.html

    https://docs.djangoproject.com/en/de...te-inheritance

    http://twig.sensiolabs.org/doc/templ...te-inheritance

    Przykład rozwiązania:

    1. Załaduj dane gracza, przekaż do szablonu.
    2. Wykonaj kod akcji. Zmienione dane ponownie przekaż do szablonu. Jeżeli przekazałeś cały obiekt (np. $player w Vallheru), to nawet nie musisz tego robić, bo do systemu szablonów trafiła referencja i twoje zmiany są już widoczne.
    3. Wyświetl główny szablon, który wczyta swojego rodzica i wyświetli całą stronę jednocześnie.

    Cały problem nie ma nic wspólnego z MVC :P. Zgadzam się z Aravornem - na dziennikach Zyxowych MVC jest całkiem nieźle opisane, razem z niektórymi błędami w rozumowaniu tego wzorca.

    Co do renderowania kodu HTML po stronie klienta - to już kompletnie inna magia. Osobiście nie sądzę żeby nakład pracy potrzebny do zrobienia tego był opłacalny, zwłaszcza przy projektach jednoosobowych. Nie widziałem jeszcze żadnej dużej strony (Google, FB, Twitter), która robiłaby takie sztuczki.
    Ostatnio edytowane przez Klaus Korner ; 29-06-2013 o 14:07
    Drikam likes this.
    http://orodlin.pl/ - Orodlin.pl Team Member
    http://blog.albitos.eu - Albi's Jogger - Z pamiętnika młodego programisty
    http://wsosnowski.pl - wizytówka

    Mam do wynajęcia miejsce na serwerze dedykowanym. Ktoś zainteresowany?

  6. #6
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Tak, nie ma nic wspólnego. Nawet napisałem to już na początku tematu, ale tak jakoś nie zmieniłem nazwy.

    Chyba nie ominą mnie jest szablony, z których jednak nie lubię korzystać.. Jeszcze przemyślę, ale biorę się za czytanie bo chcę znać wszystkie opcje.

    Albo po prostu przy logowaniu wczytam stronę, a resztę będę ogarniał ajaxem. To może być wygodne.


    edit:
    A co z używaniem echo w klasach/obiektach? Czy rozsądne jest całkowite ich nie używanie? Bo jakoś taki
    {% block content %}{% endblock %}
    musi się utworzyć.. /czytam dalej ; d

    Kod:
    <!DOCTYPE html>
    <html>
        <head>
            {% block head %}
                <link rel="stylesheet" href="style.css" />
                <title>{% block title %}{% endblock %} - My Webpage</title>
            {% endblock %}
        </head>
        <body>
            <div id="content">{% block content %}{% endblock %}</div>
            <div id="footer">
                {% block footer %}
                    &copy; Copyright 2011 by <a href="http://domain.invalid/">you</a>.
                {% endblock %}
            </div>
        </body>
    </html>
    Ostatnio edytowane przez Drikam ; 29-06-2013 o 14:29

  7. #7
    Programista
    Dołączył
    Sep 2007
    Posty
    622

    Domyślnie

    Zawartość bloków uzupełniasz w szablonach dziedziczących po szablonie głównym. Echo to zło (prawie zawsze ].
    http://orodlin.pl/ - Orodlin.pl Team Member
    http://blog.albitos.eu - Albi's Jogger - Z pamiętnika młodego programisty
    http://wsosnowski.pl - wizytówka

    Mam do wynajęcia miejsce na serwerze dedykowanym. Ktoś zainteresowany?

  8. #8
    Aktywny
    Dołączył
    Jul 2008
    Posty
    866

    Domyślnie

    Dzięki, doczytałem. : P
    Sam sposób już ogarniam, gorzej będzie się przestawić.

Informacje o wątku

Użytkownicy przeglądający ten wątek

Aktualnie 1 użytkownik(ów) przegląda ten wątek. (0 zarejestrowany(ch) oraz 1 gości)

Podobne wątki

  1. Zle wyświetlanie obrazka
    Przez Majkel w dziale Pytania dotyczące silnika Xnova
    Odpowiedzi: 11
    Ostatni post / autor: 05-05-2012, 13:08
  2. Błędne wyświetlanie if'ów
    Przez zabka229 w dziale Problemy przy tworzeniu własnej gry
    Odpowiedzi: 5
    Ostatni post / autor: 16-02-2012, 15:31
  3. [PHP] wyświetlanie błędu, (header)
    Przez fifi770 w dziale Kosz
    Odpowiedzi: 1
    Ostatni post / autor: 25-07-2010, 15:05
  4. Wyświetlanie mapy.
    Przez malpka321 w dziale Problemy przy tworzeniu własnej gry
    Odpowiedzi: 15
    Ostatni post / autor: 23-07-2010, 09:50
  5. Wy??wietlanie avatara
    Przez Kemsan w dziale Support Vallheru
    Odpowiedzi: 6
    Ostatni post / autor: 08-02-2008, 08:27

Zakładki

Uprawnienia umieszczania postów

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •