2013-07-22 13 views
8

Jestem całkiem nowy w całym paradygmacie obiektowego.Próba modelowania za pomocą javascript zorientowanego obiektowo

Próbuję modelować postać w określonej grze, masz różne poziomy, klasy i wiele opcji wyposażenia i takie.

Moim celem w końcu byłoby stworzenie „kredens” jakiegoś gdzie gracze mogą otworzyć witrynę, spróbuj na niektórych wyposaża i zobaczyć jak to wpływać na swoje parametry, ile to będzie kosztować, itp

Mam już zaprogramowane główne części (here), ale to była moja pierwsza praca z html, css i javascript i jest to po prostu wielki bałagan w tej chwili. Chcę zacząć się właściwie tym razem :)


Załóżmy, że mam obiektu dla postaci, które będziemy symulacji:

var Lord = function(){ 

    this.Level =  1; 
    this.Gender =  'Male'; 
    this.Faction =  'Knight'; 

    this.Attack =  0; 
    this.Defense =  1; 
    this.SpellPower = 0; 
    this.Knowledge = 0; 
    this.Luck =  0; 
    this.Morale =  1; 
    this.Initiative = 0; 

    this.addParameter = function(Parameter, amount){ 
     this[Parameter] += amount; 
    }; 
    this.changeLevelTo = function(Level){ 
     this.Level = Level; 
    }; 
    this.changeGenderTo = function(Gender){ 
     this.Gender = Gender; 
    }; 
    this.changeFactionTo = function(Faction){ 
     this.Faction = Faction; 
     //adjust default stats based on new faction 
    }; 
}; 

Mój problem jest taki: Rycerz rozpoczyna się z 1 Obrona i 1 morale, różne frakcje dadzą ci różne bonusy statyczne. Wartości te nie mogą zostać ponownie przydzielone. Gracz zyskuje także kilka punktów statystycznych, które można wydać na różne parametry po wyrównywaniu, a te można ponownie przydzielić.

Co więcej, gracz może wyposażyć niektóre urządzenia, które zwiększają statystykę, a także nie można ich ponownie rozdzielić (tylko po ich usunięciu).

Co wcześniej zrobiłem to to, że stworzyłem całą masę tablic z ich indeksami odpowiadającymi każdemu z parametrów, każda tablica reprezentuje domyślne wzmocnienie statystyk z różnych frakcji, całkowitą statystykę ze sprzętu i statystyki gracza przydzielonego ręcznie. Następnie sumuję każdy z indeksów, aby podać ostateczną tablicę parametrów do wyświetlenia. Gracz może wtedy ponownie przydzielić punkty w trzeciej macierzy, a nie w innych tablicach.

W jaki sposób powinienem wdrożyć to przy użyciu programowania obiektowego?

czytałem się na niektóre z podstawowych pojęć (hermetyzacja, dziedziczenie, polimorfizm), ale są one dość abstrakcyjne i kiedy się do niego, ja naprawdę nie wiem zupełnie co robić: s

-

-


Odpowiedzi


Ten webstie jest dość trudny w użyciu: o

Ok, spróbuję i zobaczę, co mogę dostać od qternion za odpowiedź:

var Faction = function(atk, def, sp, kn, luk, mor, ini){ 
    this.Attack =  atk; 
    this.Defense =  def; 
    this.SpellPower = sp; 
    this.Knowledge = kn; 
    this.Luck =  luk; 
    this.Morale =  mor; 
    this.Initiative = ini; 
} 

var Knight = new Faction(0,1,0,0,0,1,0); 
var Wizard = new Faction(0,0,0,1,0,1,0); 

następnie na obiekcie Lord, musiałbym

//this.Faction = 'Knight' 
    this.Faction = Knight 

    this.Defense = function(){ 
     return this.Faction.Defense + this.someOtherClass.Defense; 
    } 

będę chcą poprawić powyższe prototypy z użyciem http://javascript.crockford.com/prototypal.html

Dziękuję wszystkim za wszystkie Twoje uwagi :)

+0

'Rycerz rozpoczyna się z 1 Defense' - tak ustawić na 1 w dosłownym obiektu ...' Obrona: 0, '=>' Obrona: 1, ' –

+0

prawo, trzymaj się :) – Sylin

+1

W duchu chęci zwiększenia swoich umiejętności OO Javascript, możesz również chcieć przyjrzeć się temu postowi SO o funkcjach prototypowania: http://stackoverflow.com/questions/12238103/javascript-prototype-vs-general-functions-performance-readability –

Odpowiedz

2

Możesz mieć swoje wartości statystyki jako metody zamiast zmiennych członkowskich. W ten sposób możesz obliczyć podczas rozmowy dane statystyki, na przykład knight.defense(). Z kolei metoda defense() w twojej klasie postaci może wywołać defence() z klasy frakcji, defense() z klasy equipmentSet, itp. Zaletą tego jest to, że możesz dodać dodatkowe modyfikatory statystyk kiedy, na przykład, jeśli zdecydujesz chcesz system profitowy czy coś takiego.

Każda klasa frakcji może wtedy zastąpić ich funkcję obrony() dla ich modyfikatora.

Nie nazwałbym tego najbardziej obiektowo zorientowanym sposobem, ale tak bym to zrobił sam jako programista JavaScript.

Dodatek: odpowiedź Plutona to także sposób uzyskiwania "klas" (zamiast pojedynczych obiektów), które można wielokrotnie wykorzystać. Jak już wspomniano, sprawiłbym, że Faction byłaby klasą zamiast zwykłego ciągu znaków (możesz sprawdzić tekst za pomocą instanceof):

var Faction = function(){ 
    this.prototype.defense = function() { return this.Defense; }; 
    this.prototype.initStats = function() { this.Defense = 0;}; 
    this.initStats(this); 
}; 

var Knight = new Faction(); 
Knight.prototype.initStats = function() { this.Defense = 1;}; 

Na przykład.

+0

ok czekaj, pozwól mi spróbować i wykonaj: q – Sylin

+0

ok czekaj, więc skoro mam zamiar obliczyć i tak przed obroną, mogę tylko użyć wartości zwracanej metody obrony zamiast jej obliczenia, przypisać ją do właściwości obrony, a następnie użyć samej własności? Myślę, że zaczynam to teraz trochę: D – Sylin

+0

Tak, to wszystko. Musisz tylko przypisać wartość zwracaną ręcznie, jeśli chcesz z jakiegoś powodu ją buforować (na przykład możesz mieć tymczasowe modyfikacje statystyk i chcesz buforować bazową obronę postaci w celu sprawdzenia innych). – qternion

2

Możesz zachować swoje tablice, jeśli chcesz. Najważniejszą rzeczą w programowaniu obiektowym jest enkapsulacja, która sprowadza się do zapewnienia możliwości interakcji z obiektem Character bez konieczności jakichkolwiek informacji o implementacji niskiego poziomu. Aby poradzić sobie z obiektów, a nie tablic lub hashtables (nawet jeśli pod tym wszystkim, to w jaki sposób obiekt zostanie zbudowany!) Co chcesz jest napisanie kodu, który wygląda tak:

var link = Knight(); 
link.equip(new MasterSword()); 
alert(link.getAttackPoints()); 

Eh, @qternion rodzaj pokonał mnie do tego. Więc zmieniam tę odpowiedź w wiki! Uwolnijmy na tym mądrość SO.

+0

Nie jestem do końca pewien, co sugeruje answer2wiki, ale jeśli to pomaga i ja, to mi się nie podoba :) – Sylin

2

Po prostu zmień Lorda na funkcję (tj. var Lord = function() { /* current code */ }) i ustaw jego właściwości na this.Level = 1;.Odtąd możesz tworzyć tak wielu Lordów, jak chcesz, przy pomocy new Lord() jak większość języków programowania obiektowego.

Przykładem tego w praktyce ...

var Lord = function() { 

    this.Level=1; 
    this.Gender='Male'; 
    this.Faction='Knight'; 

    /* ... */ 

    this.addParameter=function(Parameter, amount){ 
     this[Parameter] += amount; 
    }; 

    /* ... */ 
}; 
var a=new Lord(); 
var b=new Lord(); 
+0

OK, może zmienię to na Planowałem użyć tej notacji dla urządzeń itp., a będzie tylko jedna postać do przebierania się, więc użyłem literalna notacja, ale nie byłem do końca jej obeznany – Sylin

Powiązane problemy