ওয়েব / ইউআই জেএস দেব হিসাবে বোঝার চেষ্টা করে যদি আমি দেখতে পাই তবে আমি সাহায্য করতে পারি। এছাড়াও, ভাষা অজ্ঞাতবাদে খুব বেশি দূরে যাবেন না। অন্যান্য ভাষায় প্রতিষ্ঠিত প্রচুর নিদর্শনগুলি অধ্যয়নের জন্য উপযুক্ত তবে এটির নমনীয়তার কারণে জেএসে খুব আলাদাভাবে প্রয়োগ করা যেতে পারে বা ভাষার ক্ষতিকারক প্রকৃতির কারণে সত্যই প্রয়োজন হয় না। আপনি যদি জেএস সম্পর্কে আপনার কোড চিন্তাভাবনাটি একই ধরণের সীমানার সমাহার করে যা আরও ক্লাসিকাল ওওপি-ভিত্তিক ভাষা করে তবে আপনি লিখতে পারেন কিছু সুযোগ blow
প্রথমত, "ওওপি ব্যবহার করবেন না" ফ্যাক্টারে, মনে রাখবেন যে জাভাস্ক্রিপ্ট অবজেক্টগুলি অন্যান্য ভাষার তুলনায় প্লেডফের মতো এবং জেএস ক্লাস না হওয়ায় আপনাকে আসলে একটি ক্যাসকেডিং-উত্তরাধিকার স্কিমের দুঃস্বপ্ন তৈরির পথে যেতে হবে বেসড এবং কম্পোজিটিং এটিতে প্রাকৃতিকভাবে অনেক বেশি আসে। আপনি যদি আপনার জেএসে কিছু মূর্খ শ্রেণি বা প্রোটোটাইপ হ্যান্ড-মি-ডাউন সিস্টেম বাস্তবায়ন করে থাকেন তবে এটি খনন বিবেচনা করুন। জেএসে আমরা ক্লোজার, প্রোটোটাইপ ব্যবহার করি এবং আমরা ক্যান্ডির মতো চারপাশে ফাংশনগুলি পাস করি। এটি জঘন্য এবং নোংরা এবং ভুল তবে শক্তিশালী, সংক্ষিপ্ত এবং এটি আমাদের পছন্দ like
উত্তরাধিকার ভারী পন্থাগুলি আসলে নকশার প্যাটার্নগুলিতে অ্যান্টি-প্যাটার্ন হিসাবে বানানো হয় এবং সঙ্গত কারণেই যে 15+ স্তরের শ্রেণি বা শ্রেণীর মতো কাঠামোকে অনুসরণ করে দেখেছিল এবং হ্যাকটি কোনও পদ্ধতির ফাঁসানো সংস্করণটি কোথায় তা খুঁজে বের করতে পারে থেকে আসা ছিল আপনি বলতে পারেন।
আমি জানি না কেন এতোগুলি প্রোগ্রামাররা এটি করতে পছন্দ করে (বিশেষত জাভা ছেলেরা কোনও কারণে জাভাস্ক্রিপ্ট লিখছে), তবে অতিরিক্ত ব্যবহার করার সময় এটি ভয়াবহ, অযৌক্তিক এবং সম্পূর্ণ অপ্রত্যাশিত। উত্তরাধিকার এখানে এবং সেখানে ঠিক আছে, তবে জেএসে সত্যই প্রয়োজনীয় নয়। যে ভাষাগুলিতে এটি আরও আকর্ষনীয় শর্টকাট, সেখানে এটি সত্যিকার অর্থে আর্কিটেকচার উদ্বেগের পরিবর্তে আরও আক্ষরিক মডেলিং প্রকল্পগুলির পরিবর্তে একটি বেনি রবিতকে অন্তর্ভুক্ত একটি উত্তরাধিকার শৃঙ্খলের মাধ্যমে একটি জম্বি প্রয়োগ বাস্তবায়নের মতো সংরক্ষণ করা উচিত কারণ এটি কাজ করার কারণে ঘটেছে। এটি ভাল কোডের পুনরায় ব্যবহার নয় not এটি একটি রক্ষণাবেক্ষণ দুঃস্বপ্ন।
জেএস ডেভ সত্তা / উপাদান / সিস্টেম ভিত্তিক ইঞ্জিনগুলি আমাকে ডিজাইন উদ্বেগগুলি ডিউপল করার জন্য সিস্টেম / প্যাটার্ন হিসাবে আঘাত করে এবং তারপরে উচ্চতর দানাদার স্তরে বাস্তবায়নের জন্য অবজেক্টগুলি সংমিশ্রণ করে। অন্য কথায়, জাভাস্ক্রিপ্টের মতো ভাষায় বাচ্চার খেলা। তবে আমাকে দেখতে দিন আমি প্রথমে এটি সঠিকভাবে ছাঁটাই করছি কিনা।
সত্তা - আপনি নকশা করা নির্দিষ্ট জিনিস। আমরা যথাযথ বিশেষ্যগুলির দিকনির্দেশে আরও কথা বলছি (তবে বাস্তবে তা অবশ্যই নয়)। 'দৃশ্য' নয়, 'ইন্ট্রোআরিয়াভেলওন'। ইন্ট্রোআরিয়াভেল কোনও ধরণের দৃশ্যের ইন্টিটি বক্সের অভ্যন্তরে বসে থাকতে পারে তবে আমরা নির্দিষ্ট কিছুতে ফোকাস করছি যা অন্যান্য সম্পর্কিত জিনিস থেকে আলাদা। কোডটিতে, কোনও সত্তা সত্যিকার অর্থে কেবলমাত্র একটি নাম (বা আইডি) যা গুচ্ছ জিনিসগুলির সাথে জড়িত যা এটি কার্যকর হওয়ার জন্য প্রয়োগ করা বা প্রতিষ্ঠিত (উপাদানগুলি) প্রয়োজন।
উপাদান - একটি সত্তা প্রয়োজনীয় জিনিসগুলির ধরণের। এগুলি হ'ল সাধারণ বিশেষ্য। ওয়াকিংএনিমেশনের মতো। ওয়াকিংএনিমেশনের মধ্যে আমরা আরও নির্দিষ্টভাবে পেতে পারি, যেমন "শ্যাম্বলিং" (জম্বি এবং উদ্ভিদ দানবদের জন্য ভাল পছন্দ), বা "চিকেনওয়ালার" (বিপরীত-যৌথ এড -209ish রোবোট-প্রকারের জন্য দুর্দান্ত)। দ্রষ্টব্য: নিশ্চিত যে এটি কীভাবে 3 ডি মডেলের উপস্থাপনা থেকে দ্বিগুণ হতে পারে - তাই সম্ভবত একটি বোকা উদাহরণ তবে আমি অভিজ্ঞ গেম ডেভের চেয়ে জেএস প্রো বেশি। জেএসে আমি উপাদানগুলির সাথে একই বাক্সে ম্যাপিংয়ের ব্যবস্থা রাখব। তাদের নিজস্ব অংশের উপাদানগুলি যুক্তিবাদে হালকা হতে পারে এবং একটি রোডম্যাপ আপনার সিস্টেমগুলিকে জানায় যে সিস্টেমগুলি এমনকি প্রয়োজন হলে কী প্রয়োগ করতে হবে (ইসিএসে আমার প্রচেষ্টায় কিছু উপাদান কেবল সম্পত্তির সেট সংগ্রহ)। একবার উপাদান তৈরি হয়ে গেলে, এটি '
সিস্টেম - আসল প্রোগ্রামমি মাংস এখানে। এআই সিস্টেমগুলি নির্মিত এবং সংযুক্ত, রেন্ডারিং অর্জিত হয়, অ্যানিমেশন সিকোয়েন্সগুলি প্রতিষ্ঠিত হয় ইত্যাদি ... আমি কপি করছি এবং এগুলি বেশিরভাগ কল্পনাতে রেখে দিচ্ছি তবে উদাহরণস্বরূপ সিস্টেম.এআইআই একগুচ্ছ বৈশিষ্ট্য গ্রহণ করে এবং একটি ফাংশন স্পিট করে যা অবশেষে বাস্তবায়নে ব্যবহৃত হয় এমন বস্তুটিতে ইভেন্ট হ্যান্ডলার যুক্ত করতে ব্যবহৃত হয়। সিস্টেম.এআইএর মূল বিষয়টি হ'ল এটি একাধিক উপাদান ধরণের। আপনি একটি উপাদান দিয়ে সমস্ত এআই জিনিসগুলি বাছাই করতে পারেন তবে এটি করার জন্য জিনিসগুলিকে দানাদার তৈরি করার বিষয়টিকে ভুল বোঝা উচিত।
লক্ষ্যগুলি মনে রাখুন: আমরা নন-ডিজাইনারদের জন্য বিভিন্ন ধরণের স্টাফকে সহজেই সাদৃশ্যপূর্ণ করে তুলনামূলকভাবে একটি প্যারাডিমের মধ্যে উপাদানগুলি মেলানো এবং এটি থেকে সরে যেতে চাই some জনপ্রিয় স্বেচ্ছাসেবক কোড স্কিমগুলি যা তারা পরিবর্তন বা রক্ষণাবেক্ষণের চেয়ে অনেক বেশি সহজ লেখায়।
তাই জেএসে, সম্ভবত এরকম কিছু। গেম ডেভস দয়া করে আমাকে বলুন আমি এটি ভয়াবহভাবে ভুল পেয়েছি কিনা:
//I'm going with simple objects of flags over arrays of component names
//easier to read and can provide an opt-out default
//Assume a genre-bending stealth assassin game
//new (function etc... is a lazy way to define a constructor and auto-instantiate
var npcEntities = new (function NpcEntities(){
//note: {} in JS is an object literal, a simple obj namespace (a dictionary)
//plain ol' internal var in JS is akin to a private member
var default={ //most NPCs are humanoids and critters - why repeat things?
speedAttributes:true,
maneuverAttributes:true,
combatAttributes:true,
walkingAnimation:true,
runningAnimation:true,
combatAnimation:true,
aiOblivious:true,
aiAggro:true,
aiWary:true, //"I heard something!"
aiFearful:true
};
//this. exposes as public
this.zombie={ //zombies are slow, but keep on coming so don't need these
runningAnimation:false,
aiFearful:false
};
this.laserTurret={ //most defaults are pointless so ignore 'em
ignoreDefault:true,
combatAttributes:true,
maneuverAttrubtes:true, //turning speed only
};
//also this.nerd, this.lawyer and on and on...
//loop runs on instantiation which we're forcing on the spot
//note: it would be silly to repeat this loop in other entity collections
//but I'm spelling it out to keep things straight-forward.
//Probably a good example of a place where one-level inheritance from
//a more general entity class might make sense with hurting the pattern.
//In JS, of course, that would be completely unnecessary. I'd just build a
//constructor factory with a looping function new objects could access via
//closure.
for(var x in npcEntities){
var thisEntity = npcEntities[x];
if(!thisEntity.ignoreDefaults){
thisEntity = someObjectXCopyFunction(defaults,thisEntity);
//copies entity properties over defaults
}
else {
//remove nonComponent property since we loop again later
delete thisEntity.ignoreDefaults;
}
}
})() //end of entity instantiation
var npcComponents = {
//all components should have public entityMap properties
//No systems in use here. Just bundles of related attributes
speedAttributes: new (function SpeedAttributes(){
var shamblingBiped = {
walkingAcceleration:1,
topWalking:3
},
averageMan = {
walkingAcceleration:3,
runningAcceleration:4,
topWalking: 4,
topRunning: 6
},
programmer = {
walkingAcceleration:1,
runningAcceleration:100,
topWalking:2
topRunning:2000
}; //end local/private vars
//left is entity names | right is the component subcategory
this.entityMap={
zombie:shamblingBiped,
lawyer:averageMan,
nerd:programmer,
gCostanza:programmer //makes a cameo during the fire-in-nursery stage
}
})(), //end speedAttributes
//Now an example of an AI component - maps to function used to set eventHandlers
//functions which, because JS is awesome we can pass around like candy
//I'll just use some imaginary systems on this one
aiFearful: new (function AiFearful(){
var averageMan = Systems.AI({ //builds and returns eventSetting function
fearThreshold:70, //%hitpoints remaining
fleeFrom:'lastAttacker',
tactic:'avoidIntercept',
hazardAwareness:'distracted'
}),
programmer = Systems.AI({
fearThreshold:95,
fleeFrom:'anythingMoving',
tactic:'beeline',
hazardAwareness:'pantsCrappingPanic'
});//end local vars/private members
this.entityMap={
lawyer:averageMan,
nerd:averageMan, //nerds can run like programmers but are less cowardly
gCostanza:programmer //makes a cameo during the fire-in-nursery stage
}
})(),//and more components...
//Systems.AI is general and would get called for all the AI components.
//It basically spits out functions used to set events on NPC objects that
//determine their behavior. You could do it all in one shot but
//the idea is to keep it granular enough for designers to actually tweak stuff
//easily without tugging on developer pantlegs constantly.
//e.g. SuperZombies, zombies, but slightly tougher, faster, smarter
}//end npcComponents
function createNPCConstructor(npcType){
var components = npcEntities[npcType],
//objConstructor is returned but components is still accessible via closure.
objConstructor = function(){
for(var x in components){
//object iteration <property> in <object>
var thisComponent = components[x];
if(typeof thisComponent === 'function'){
thisComponent.apply(this);
//fires function as if it were a property of instance
//would allow the function to add additional properties and set
//event handlers via the 'this' keyword
}
else {
objConstructor.prototype[x] = thisComponent;
//public property accessed via reference to constructor prototype
//good for low memory footprint among other things
}
}
}
return objConstructor;
}
var npcBuilders= {}; //empty object literal
for (var x in npcEntities){
npcConstructors[x] = createNPCConstructor(x);
}
এখন যে কোনও সময় আপনার এনপিসি প্রয়োজন, আপনি এটি তৈরি করতে পারেন npcBuilders.<npcName>();
একটি জিইউআই এনপিসিটিটিটিস এবং উপাদান উপাদানগুলিতে প্লাগ করতে পারে এবং ডিজাইনারদের পুরানো সত্তাগুলিকে ঝাঁকিয়ে বা সহজে মেশানো এবং উপাদানগুলির সাথে মিলিয়ে নতুন সত্তা তৈরি করতে দেয় (যদিও অ-ডিফল্ট উপাদানগুলির জন্য সেখানে কোনও ব্যবস্থা নেই তবে ফ্লাইটিতে বিশেষ উপাদানগুলি যুক্ত করা যেতে পারে) কোড যতক্ষণ না এটির জন্য একটি সংজ্ঞায়িত উপাদান ছিল।