2013-07-22 7 views
8

के साथ मॉडल करने का प्रयास कर रहा हूं, मैं पूरी ऑब्जेक्ट उन्मुख प्रतिमान के लिए बिल्कुल नया हूं।ऑब्जेक्ट उन्मुख जावास्क्रिप्ट

मैं एक निश्चित गेम में एक चरित्र को मॉडल करने की कोशिश कर रहा हूं, आपके पास विभिन्न स्तर, कक्षाएं और कई सारे उपकरण विकल्प हैं और ऐसे।

अंत में मेरा लक्ष्य, एक किसी प्रकार जहां खिलाड़ियों साइट को खोलने सकता है की "ड्रेसर" बनाने के कुछ सज्जित पर कोशिश करते हैं और देखें कि यह कैसे अपने मापदंडों को प्रभावित है, यह कितना खर्च आएगा होगा, आदि

मेरे पास पहले से ही मुख्य भाग प्रोग्राम किए गए हैं (here), लेकिन यह एचटीएमएल, सीएसएस और जावास्क्रिप्ट के साथ मेरा पहला काम था और यह फिलहाल सिर्फ एक बड़ी गड़बड़ है। मैं ठीक से इस बार शुरू करना चाहते हैं :)


मान लीजिए मैं चरित्र के लिए एक वस्तु है कि हम अनुकरण किया जाएगा: एक नाइट के साथ बाहर शुरू होता है:

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 
    }; 
}; 

मेरे समस्या यह है 1 रक्षा और 1 मनोबल, विभिन्न गुट आपको अलग-अलग स्टेट बूस्ट देंगे। इन मानों को पुन: आवंटित नहीं किया जा सकता है। एक खिलाड़ी को स्तर पर विभिन्न मानकों पर खर्च करने के लिए कुछ स्टेट पॉइंट प्राप्त होते हैं और इन्हें फिर से आवंटित किया जा सकता है।

इसके अलावा, एक खिलाड़ी कुछ उपकरणों को लैस कर सकता है जो स्टेट बूस्ट देते हैं, और इन्हें भी पुन: आवंटित नहीं किया जा सकता है (केवल इसे असमान करके)।

जो मैंने पहले किया है वह यह है कि मैंने प्रत्येक पैरामीटर के अनुरूप अपने सूचकांक के साथ सरणी का पूरा समूह बनाया, प्रत्येक सरणी अलग-अलग गुटों से डिफ़ॉल्ट स्टेट बूस्ट का प्रतिनिधित्व करती है, उपकरणों से कुल स्टेट बूस्ट, और मैन्युअल रूप से आवंटित खिलाड़ी आंकड़े। मैं फिर प्रदर्शित करने के लिए पैरामीटर की अंतिम सरणी देने के लिए प्रत्येक सूचकांक को जोड़ता हूं। एक खिलाड़ी फिर तीसरी सरणी में अंक को फिर से आवंटित कर सकता है, और कोई अन्य सरणी नहीं।

ऑब्जेक्ट उन्मुख प्रोग्रामिंग का उपयोग करके इसे कार्यान्वित करने के बारे में मुझे कैसे जाना चाहिए?

मैं मूलभूत अवधारणाओं (कैप्सूलीकरण, विरासत, बहुरूपता) में से कुछ पर पढ़ा है, लेकिन वे नहीं बल्कि सार कर रहे हैं और जब मैं यह करने के लिए नीचे लाने के लिए, मैं वास्तव में नहीं पता है क्या करना काफी क्या: रों

-

-


प्रतिक्रियाएँ


01 , ओ

ठीक है, मैं कोशिश करते हैं और देखते हैं मैं qternion के जवाब से क्या प्राप्त कर सकते हैं करेंगे:

यह webstie उपयोग करने के लिए काफी कठिन है

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); 
तब प्रभु वस्तु पर

, मैं होता

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

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

मैं http://javascript.crockford.com/prototypal.html

का उपयोग कर प्रोटोटाइप के साथ ऊपर में सुधार करने के लिए देख रहे होंगे

आपके सभी योगदानों के लिए सभी को धन्यवाद :)

+0

'एक नाइट 1 Defense' के साथ बाहर शुरू होता है - इसलिए आपकी वस्तु शाब्दिक में 1 के लिए सेट ...' रक्षा: 0, '=>' रक्षा: 1, ' –

+0

दाएं, लटकाएं :) – Sylin

+1

अपने जावास्क्रिप्ट ओओ कौशल को बढ़ाने की इच्छा रखने की भावना में, आप प्रोटोटाइप कार्यों के बारे में इस SO पोस्ट को भी देखना चाहेंगे: http://stackoverflow.com/questions/12238103/जावास्क्रिप्ट-प्रोटोटाइप-बनाम-सामान्य-कार्य-प्रदर्शन-पठनीयता –

उत्तर

2

आप सदस्य चर के बजाय अपने आंकड़े मूल्य विधियां हो सकते हैं। इस तरह, आप उदाहरण के लिए किसी दिए गए स्टेट को कॉल करने के दौरान गणना कर सकते हैं, उदाहरण के लिए knight.defense()। बदले में, आपके चरित्र वर्ग में विधि रक्षा() गुट वर्ग, रक्षा() से उपकरण वर्ग, आदि से रक्षा() को कॉल कर सकती है। इसका लाभ यह है कि आप अतिरिक्त स्टेट संशोधक जोड़ सकते हैं, उदाहरण के लिए यदि आप निर्णय लेते हैं आप एक पर्क प्रणाली या कुछ चाहते हैं।

प्रत्येक गुट वर्ग उनके संशोधक के लिए अपने रक्षा() फ़ंक्शन को ओवरराइड कर सकता है।

मैं इसे सबसे अधिक ऑब्जेक्ट उन्मुख तरीके से नहीं कहूंगा लेकिन इस तरह मैं इसे जावास्क्रिप्ट प्रोग्रामर के रूप में स्वयं करता हूं।

अनुपूरक: प्लूटो का जवाब यह भी है कि आप कैसे "वर्ग" (व्यक्तिगत वस्तुओं के बजाय) प्राप्त करते हैं जो पुन: प्रयोज्य होते हैं। जैसा कि बताया जा रहा भी गुट सिर्फ एक स्ट्रिंग के बजाय एक वर्ग बनाने चाहते हैं (आप 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;}; 

उदाहरण के लिए।

+0

ठीक है, मुझे आज़माएं और अनुसरण करें: q – Sylin

+0

ठीक है, इसलिए जब से मैं गणना करने जा रहा हूं इसे प्रस्तुत करने से पहले रक्षा, मैं केवल इसे गणना करने के बजाय रक्षा पद्धति के वापसी मूल्य का उपयोग कर सकता हूं, इसे रक्षा संपत्ति को सौंप सकता हूं, और फिर संपत्ति का उपयोग कर सकता हूं? मुझे लगता है कि मैं इसे थोड़ा सा शुरू करना शुरू कर रहा हूं: डी – Sylin

+0

हां, यही वह है। यदि आप इसे किसी कारण से कैश करना चाहते हैं तो आपको केवल वापसी मान को मैन्युअल रूप से असाइन करने की आवश्यकता है (उदाहरण के लिए आपके पास अस्थायी स्टेट संशोधन हो सकते हैं और आप किसी अन्य चेक के लिए चरित्र की मूल रक्षा को कैश करना चाहते हैं)। – qternion

2

यदि आप चाहें तो अपने सरणी रख सकते हैं। ऑब्जेक्ट उन्मुख प्रोग्रामिंग के बारे में सबसे महत्वपूर्ण बात encapsulation है, जो निम्न स्तर के कार्यान्वयन के बारे में कुछ भी जानने के बिना आपके कैरेक्टर ऑब्जेक्ट के साथ बातचीत करने का साधन प्रदान करने के लिए उबलती है। आप (! भी यह सब नीचे हैं, कि कैसे वस्तु वास्तव में बनाया गया है है) क्या आप चाहते हैं कोड है कि इस तरह दिखता है लिखना है वस्तुओं, नहीं सरणियों या hashtables के साथ सौदा करना चाहते हैं:

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

एह, @qternion तरह मुझे इसे हराया। तो मैं इस जवाब को विकी में बदल रहा हूं! आइए इस पर एसओ के ज्ञान को उजागर करें।

+0

मुझे पूरा यकीन नहीं है कि answer2wiki का क्या अर्थ है, लेकिन अगर यह आपकी मदद करता है और मैं, तो मैं इसके साथ ठीक हूं :) – Sylin

2

बस भगवान को एक फ़ंक्शन (यानी var Lord = function() { /* current code */ }) बदलने के लिए बदलें और इसकी गुण this.Level = 1; के साथ सेट करें।फिर से, आप अधिक ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषाओं की तरह new Lord() के साथ जितना चाहें उतने लॉर्ड्स बना सकते हैं।

व्यवहार में इस का एक उदाहरण ...

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

ठीक है, शायद मैं इस में बदल जाऊंगा, मैं उपकरणों आदि के लिए इस नोटेशन का उपयोग करने की योजना बना रहा था, और साथ ही साथ पहनने के लिए केवल एक चरित्र होगा शाब्दिक संकेत, लेकिन मैं इसके साथ काफी परिचित नहीं था – Sylin

संबंधित मुद्दे