• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

W jaki sposob pisać taki kod

+1 głos
119 wizyt
pytanie zadane 28 marca 2021 w JavaScript przez wsnofi Bywalec (2,550 p.)

Witam, tworze sobie hobbystycznie grę RPG typu visual-novel (te z opcjami dialogowymi do klikania), jest klasa która odpowiada za wyswietlanie scen/ dialogów oraz interakcje z nimi/ innymi czesciami interfejsu, ogółem wszystko

jest klasą abstrakcyjną, sama nie może działać jako obiekt, ta klasa główna nazywa się "Scena"

aby utworzyć np. dialog w sklepie, trzeba rozszerzyć nową scenę z sklepem o tą abstrakcyjną o nazwie Scena

np. class Sklep extends Scena

nowa klasa Sklep musi przyjmować 1 tablicę w konstruktorze (z dialogami i informacjami) oraz metodą Change();


A dziala to tak

class Sklep extends Scena () {

constructor(){
super()

// tutaj sa dialogi jakie będą w scenie
this.dialogs = 
 [
  {
idSceny:'scenaPierwsza'
napisNaScenie:'Ten tekst sie pojawi nad opcjami do wyboru'
opcjeDoWyboru: [{id:'opt1',text:'Wejdz do sklepu'},{id:'opt2',text:'Omin sklep'}]
  },
 ]

}


// ta metoda wykonuje sie przed każdym wyświetleniem opcji
change(dialog){

const zlotoGracza= app.player.stats.get('gold'); // pobiera jako int ilosc waluty gracza

if(dialog.idSceny === 'scenaPierwsza' && zlotoGracza < 1000){dialog.opcjeDoWyboru.shift()} 
// jesli scena to "scenaPierwsza" i gracz ma mniej niz 1000 zlota, to usuwa mu pierwszą opcje

}

}

metoda Change jest po to aby manipulować dialogami, zmieniać kolor elementow, na podstawie statystyk wybierać opcje, losować je i wprowadzać dowolne zmiany w obiekcie przed jego wyświetleniem.

 

Ale dałem sobie sprawę, że mogę takie coś zrobić w głównej klasie Scena, dodać opcjonalny parametr do opcji który sprawdza czy ma ona zostać wyświetlona np.

opcjeDoWyboru: [{id:'opt1',text:'Wejdz do sklepu',  need: function () {return app.player.stats.get('gold') >= 1000}  },{id:'opt2',text:'Omin sklep'}]

I teraz się zastanawiam, czy ta metoda Change() ma w ogóle sens, czy lepiej jest rozbudować klase tak aby pracowała na samych obiektach z this.dialogs, czy zostawić ta metoda która ingeruje w scene przed jej wyswietleniem do rzadziej wykonywanych sytuacji o które nie ma sensu rozbudowywać glownej sceny

Nie wiem jak to wygląda w innych wzorcach, jak się powinno robić, będę wdzięczny za pomoc

1 odpowiedź

+3 głosów
odpowiedź 28 marca 2021 przez edutomek Mądrala (7,000 p.)
wybrane 30 marca 2021 przez wsnofi
 
Najlepsza

1) Odpowiedź (?) na pytanie.

jest klasa która odpowiada za wyswietlanie scen/ dialogów oraz interakcje z nimi/ innymi czesciami interfejsu

Wielkim znawcą (ani zwolennikiem) OOP nie jestem, ale już tu widzę problem: złamanie zasady SRP (ang. Single Resposibility Principle). Każda klasa (ogólniej: moduł, funkcja, etc.) powinna być odpowiedzialna tylko za jedno zadanie. (Dosłowne tłumacznie zasady SRP na polski jest chyba takie, że dla każdej klasy powinien być TYLKO JEDEN powód, aby zmienić kod.)

Jeśli klasa ma być odpowiedzialna za (1) wyświetlanie, oraz za (2) interakcje, to powody do zmiany będą przynajmniej dwa.

No i człowiek potem zaczyna się zastanawiać, czy dana funkcja na pewno należy do tej klasy, bo równie dobrze mogłaby się znaleźć w innej...

A trzeba po prostu zacząć od zaprojektowania właściwej architektury oprogramowania.

W ogóle może pomyśleć o MVC (ang. Model View Controller)?

2) Uwagi do samego kodu.

Pomieszanie angielskiego z polskim:
this.dialogs, a za chwilę napisNaScenie
const zlotoGracza = app.player.stats.get('gold');

Zawsze zalecam język angielski. Jak ktoś nie zna - uczyć się i nieco bardziej trudzić przy pisaniu kodu (wiem, że to nie jest łatwe, sam też przez to przechodziłem).

No ale zdecydować się na jedno - albo wszystko po angielsku (co wygląda bardziej profesjonalnie, nawet jak człowiek popełnia błędy językowe), albo po polsku.

3) Pisanie gry typu Visual Novel.

Uwaga dodatkowa: rozumiem, nauka nauką, ale do pisania gier typu Visual Novels są dostępne specjalne narzędzia, jak np. RenPy. Też warto o tym wiedzieć.

komentarz 28 marca 2021 przez wsnofi Bywalec (2,550 p.)
1. Głównie chodziło o to czy zostawić tą metodę change, czy wszystko co potrzebuje dodać w głównej klasie i potem po prostu dopisywać w obiektach dialogowych jako opcjonalne parametry (np. zamiast kontroli wyswietlania jednej opcji w metodzie change(), dodać wartość "need" do opcji obiektu i jeśli istnieje i się spełnia, to wyświetlić tą opcje)

Bo w większości takie rzeczy pisałem w tej metodzie, ale zaczeły się powtarzać w roznych klasach/ scenach i pomyslalem ze mozna edytować główną klasę / rodzica i dodać aby potrzebne rzeczy było interpretowane przez wartości obiektu, a nie metodą change()

 

2. Nazwa zmiennych miała być dla przykładu aby łatwiej zrozumieć, stosuje tylko i wyłącznie angielski

3. Właśnie cała zabawa polega na pisaniu silnika i jego możliwości pod własne potrzeby, a wielu z opcji ktorych potrzebuje obecnie silniki nie posiadają
komentarz 28 marca 2021 przez edutomek Mądrala (7,000 p.)

No to poniekąd sam sobie odpowiadasz na zadane pytanie. AFAIR, to paradygmat OOP polega (m.in.) na tym, aby wspólne metody zamieszczać w klasie, po której się dziedziczy (zapomniałem już, jak się taką klasę nazywa - nadrzędną? bazową?). Generalnie powtarzanie takiego samego (albo bardzo podobnego) kodu do dobrych praktyk nie należy (znowu mógłbym przytoczyć znaną zasadę DRY - Don't Repeat Yourself).

Wystarczy chwilę pomyśleć: co będzie, jeśli będziesz miał np. 10 klas, w których będą takie metody jak change, robiące właściwie to samo, a potem nagle się okaże, że trzeba zmienić sposób ich implementacji? Odpowiedź: trzeba będzie zmieniać implementację we wszystkich klasach. (A spróbuj zapomnieć o jednej z nich, to będziesz miał błąd...)

A przy jednej klasie, po której ta metoda jest dziedziczona, to wystarczy modyfikacje w tej jednej klasie i po sprawie.

Podobne pytania

0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 6 kwietnia 2018 w HTML i CSS przez niezalogowany
0 głosów
1 odpowiedź 104 wizyt
pytanie zadane 21 lipca 2021 w C i C++ przez Daaa22 Mądrala (7,380 p.)
+2 głosów
1 odpowiedź 128 wizyt
pytanie zadane 4 kwietnia 2018 w Grafika i multimedia przez niezalogowany

86,448 zapytań

135,207 odpowiedzi

300,348 komentarzy

57,196 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...