এমভিসি এত জায়গায় আবৃত হয়েছে তাই এখানে পুনরায় পুনরুক্তি করার মতো বেশি কিছু হওয়া উচিত নয়। মূলত আপনি চান যে আপনার অবজেক্টের গ্রাফ, সহায়ক এবং যুক্তি মডেল স্তরটিতে অন্তর্ভুক্ত থাকে। দর্শনগুলি হ'ল পর্দা যা পৃষ্ঠার গতিশীল অংশটি পূরণ করতে পারে না (এবং এতে হালকা পরিমাণে যুক্তি এবং সহায়ক থাকতে পারে)। এবং নিয়ামক, যা বস্তুর গ্রাফ, সহায়ক এবং লজিক থেকে কী পাওয়া যায় তার উপর ভিত্তি করে পর্দাগুলিকে পরিবেশন করতে একটি হালকা ওজনের বাস্তবায়ন হতে পারে।
মডেল
এটি যেখানে আবেদনের মাংস বসবে সেখানেই এটি হওয়া উচিত। এটি কোনও পরিষেবা স্তর, যুক্তিযুক্ত স্তর এবং একটি সত্তা স্তরতে ভাগ করা যায়। এটি আপনার উদাহরণের অর্থ কী?
সত্তা স্তর
এটিতে আপনার গেমের মডেলগুলি এবং অভ্যন্তরীণ আচরণগুলির সংজ্ঞা রাখা উচিত। উদাহরণস্বরূপ, যদি আপনার মাইনসুইপারের জন্য খেলা থাকে তবে বোর্ড এবং বর্গ সংজ্ঞাগুলি কীভাবে তাদের অভ্যন্তরীণ অবস্থার পরিবর্তন করে তা এইখানে ছিল।
function Location(x,y){
this.x = x;
this.y = y;
}
function MineTile(x,y){
this.flagged = false;
this.hasMine = false;
this.pristine = true;
this.location = new Location(x,y);
}
MineTile.prototype.expose = function(){
if( this.hasMine ) return false;
this.pristine = false;
return this.location;
};
সুতরাং মাইনটাইল তার অভ্যন্তরীণ অবস্থা জানতে পারবে, যেমন এটি প্রদর্শিত হচ্ছে বা পরীক্ষা করা হয়েছে ( this.pristine
), যদি এটি একটি টাইল ছিল যা খনি ছিল ( this.hasMine
) তবে এটি নির্ধারণ করবে না যে এটি খনি হওয়ার কথা ছিল কিনা। এটি লজিক স্তর পর্যন্ত হবে। (আরও ওওপি-তে যেতে মাইনটাইল জেনেরিক টাইলের উত্তরাধিকারী হতে পারে)।
লজিক স্তর
এতে অ্যাপ্লিকেশনটির জটিল পদ্ধতিগুলি পরিবর্তিত পদ্ধতিগুলি, রাষ্ট্র বজায় রাখা ইত্যাদির সাথে ইন্টারঅ্যাক্ট করবে game এটি হ'ল যেখানে গেমের যুক্তিটি কোনও গেমের সময় কী ঘটেছিল তা নির্ধারণের জন্য উদাহরণস্বরূপ বা মাইনটাইলে কোন খনি থাকবে তা স্থাপনের জন্য স্থির ছিল। এটি যুক্তিযুক্তভাবে নির্ধারিত পরামিতিগুলির উপর ভিত্তি করে ইনস্ট্যান্টিয়েটেড স্তরগুলি পাওয়ার জন্য সত্তা স্তরে কল করবে।
var MineSweeperLogic = {
construct: function(x,y,difficulty){
var mineSet = [];
var bombs = 7;
if( difficulty === "expert" ) bombs = 15;
for( var i = 0; i < x; i++ ){
for( var j = 0; i j < y; j++ ){
var mineTile = new MineTile(i,j);
mineTile.hasMine = bombs-- > 0;
mineSet.push(mineTile);
}
}
return mineSet;
},
mineAt: function(x,y,mineSet){
for( var i = 0; i < mineSet.length; i++ )
if( mineSet[i].x === x && mineSet[i].y === y ) return mineSet[i];
}
};
পরিষেবা স্তর
এটি হবে যেখানে নিয়ামকের অ্যাক্সেস রয়েছে। গেমসটি তৈরির জন্য এটি লজিক স্তরে অ্যাক্সেস পাবে। একটি সম্পূর্ণ তাত্ক্ষণিক গেম বা পরিবর্তিত গেমের অবস্থা পুনরুদ্ধার করার জন্য পরিষেবা স্তরে উচ্চ স্তরের কল করা যেতে পারে।
function MineSweeper(x,y,difficulty){
this.x = x;
thix.y = y;
this.difficulty = difficulty;
this.mineSet = MineSweeperLogic.construct(x,y,difficulty);
}
MineSweeper.prototype.expose = function(x,y){
return MineSweeperLogic.mineAt(x,y,this.mineSet).expose();
}
নিয়ামক
নিয়ন্ত্রকদের হালকা ওজন হওয়া উচিত, মূলত এটি হ'ল মডেলের ক্লায়েন্ট হিসাবে প্রকাশিত। অনেকগুলি নিয়ামক থাকবে, সুতরাং তাদের গঠন গুরুত্বপূর্ণ হয়ে উঠবে। কন্ট্রোলার ফাংশন কলগুলি হ'ল ইউআই ইভেন্টগুলির উপর ভিত্তি করে জাভাস্ক্রিপ্ট কলগুলি হিট করবে। এগুলি পরিষেবা স্তরে উপলব্ধ আচরণগুলি প্রকাশ করে এবং তারপরে পপুলেট করা বা এই ক্ষেত্রে ক্লায়েন্টের জন্য মতামত পরিবর্তন করতে হবে।
function MineSweeperController(ctx){
var this.context = ctx;
}
MineSweeperController.prototype.Start = function(x,y,difficulty){
this.game = new MineSweeper(x,y,difficulty);
this.view = new MineSweeperGameView(this.context,this.game.x,this.game.y,this.game.mineSet);
this.view.Update();
};
MineSweeperController.prototype.Select = function(x,y){
var result = this.game.expose(x,y);
if( result === false ) this.GameOver();
this.view.Select(result);
};
MineSweeperController.prototype.GameOver = function(){
this.view.Summary(this.game.FinalScore());
};
দৃশ্য
নিয়ামকের আচরণের সাথে মতামতগুলি সংগঠিত করা উচিত। তারা সম্ভবত আপনার আবেদনের সবচেয়ে নিবিড় অংশ হবে কারণ এটি ক্যানভ্যাসিংয়ের সাথে সম্পর্কিত।
function MineSweeperGameView(ctx,x,y,mineSet){
this.x = x;
this.y = y;
this.mineSet = mineSet;
this.context = ctx;
}
MineSweeperGameView.prototype.Update = function(){
//todo: heavy canvas modification
for(var mine in this.mineSet){}
this.context.fill();
}
সুতরাং এখন এই একটি গেমের জন্য আপনার পুরো এমভিসি সেটআপ রয়েছে। বা কমপক্ষে, একটি খালি হাড়ের উদাহরণ, পুরো গেমটি লেখার জন্য অতিরিক্ত ছিল।
এটি সব শেষ হয়ে গেলে, কোথাও কোথাও আবেদনের জন্য বিশ্বব্যাপী সুযোগ থাকা দরকার। এটি আপনার বর্তমান নিয়ামকের জীবনকাল ধরে রাখবে, যা এই দৃশ্যের সমস্ত এমভিসি স্ট্যাকের প্রবেশদ্বার।
var currentGame;
var context = document.getElementById("masterCanvas").getContext('2d');
startMineSweeper.click = function(){
currentGame = new MineSweeperController(context);
currentGame.Start(25,25,"expert");
};
এমভিসি নিদর্শনগুলি ব্যবহার করা খুব শক্তিশালী, তবে সেগুলির প্রতিটি প্রতিবিম্ব অনুসরণ করা সম্পর্কে খুব বেশি চিন্তা করবেন না। শেষ পর্যন্ত, এটি গেমের অভিজ্ঞতা যা অ্যাপ্লিকেশনটি সফল কিনা তা নির্ধারণ করবে :)
বিবেচনার জন্য: আর্কিটেকচার নভোচারী আপনাকে জোয়েল স্পলস্কির দ্বারা ভয় দেখাতে দেবেন না