সুতরাং, আমি কেবল মজাদার জন্য একটি HTML5 আরপিজি তৈরি করছি। মানচিত্রটি একটি <canvas>(512px প্রস্থ, 352 px উচ্চতা | 16 টি টাইল জুড়ে, 11 টাইল উপরে থেকে নীচে)। ছবি আঁকার আরও কার্যকর উপায় আছে কিনা তা আমি জানতে চাই <canvas>।
এই মুহূর্তে আমার এটি কেমন আছে তা এখানে।
টাইলস কীভাবে লোড করা হয় এবং মানচিত্রে আঁকা হয়
Image()টুকরাটি ব্যবহার করে মানচিত্রটি টাইলস দ্বারা আঁকা হচ্ছে (32x32) । ইমেজ ফাইলগুলি একটি সাধারণ forলুপের মাধ্যমে লোড হয় এবং একটি অ্যারেতে tiles[]ব্যবহার করা হয় যা ব্যবহার করার জন্য পয়েন্ট করা হয় drawImage()।
প্রথমত, আমরা টাইলগুলি লোড করি ...

এটি এখানে কীভাবে করা হচ্ছে তা এখানে:
// SET UP THE & DRAW THE MAP TILES
tiles = [];
var loadedImagesCount = 0;
for (x = 0; x <= NUM_OF_TILES; x++) {
var imageObj = new Image(); // new instance for each image
imageObj.src = "js/tiles/t" + x + ".png";
imageObj.onload = function () {
console.log("Added tile ... " + loadedImagesCount);
loadedImagesCount++;
if (loadedImagesCount == NUM_OF_TILES) {
// Onces all tiles are loaded ...
// We paint the map
for (y = 0; y <= 15; y++) {
for (x = 0; x <= 10; x++) {
theX = x * 32;
theY = y * 32;
context.drawImage(tiles[5], theY, theX, 32, 32);
}
}
}
};
tiles.push(imageObj);
}
স্বাভাবিকভাবেই, যখন কোনও খেলোয়াড় কোনও গেম শুরু করে তখন তারা শেষ ম্যাপটি লোড করে। তবে এখানকার জন্য, এটি একটি সমস্ত-ঘাসের মানচিত্র।
এখনই, মানচিত্রগুলিতে 2D অ্যারে ব্যবহার করা হয়েছে। এখানে একটি উদাহরণ মানচিত্র।
[[4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 1, 1, 1, 1],
[1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 1, 1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 13, 13, 1, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 13, 13, 11, 11, 11, 13, 13, 13, 13, 13, 13, 13, 1],
[13, 13, 13, 1, 1, 1, 1, 1, 1, 1, 13, 13, 13, 13, 13, 1],
[1, 1, 1, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1]];
আমি একটি সাধারণ ifকাঠামো ব্যবহার করে বিভিন্ন মানচিত্র পাই । উপরের 2d অ্যারেটি একবার হয়ে গেলে returnপ্রতিটি অ্যারেতে সংশ্লিষ্ট নম্বরটি Image()ভিতরে সঞ্চিত অনুযায়ী আঁকা হবে tile[]। তারপর drawImage()ঘটতে এবং অনুযায়ী আঁকবে xএবং yএবং বার এটি দ্বারা 32সঠিক উপর আঁকা x-yতুল্য।
একাধিক মানচিত্রের স্যুইচিং কীভাবে ঘটে
আমার খেলা সঙ্গে, মানচিত্র পাঁচটি জিনিস ট্র্যাক রাখতে আছে: currentID, leftID, rightID, upID, এবং bottomID।
- কারেন্টআইডি: আপনি যে মানচিত্রটিতে আছেন তার বর্তমান আইডি।
- বামIDID: আপনি
currentIDযখন বর্তমান মানচিত্রের বামে প্রস্থান করবেন তখন কী আইডি লোড করতে হবে। - রাইটআইডি: আপনি
currentIDবর্তমান মানচিত্রের ডানদিকে প্রস্থান করার সময় কী আইডি লোড করতে হবে। - ডাউনআইডি: আপনি
currentIDযখন বর্তমান মানচিত্রের নীচে প্রস্থান করবেন তখন কী আইডি লোড করতে হবে। - আপড: আপনি
currentIDবর্তমান মানচিত্রের শীর্ষে বেরোনোর সময় কী আইডি লোড করতে হবে।
নোট কিছু: হয় তাহলে leftID, rightID, upID, অথবা bottomID, না নির্দিষ্ট উপায়ে যে তারা একটি হয় 0। তার মানে তারা মানচিত্রের সেই দিকটি ছেড়ে যেতে পারে না। এটি নিছক একটি অদৃশ্য অবরোধ।
সুতরাং, একবার কোনও ব্যক্তি মানচিত্রের একপাশ থেকে বেরিয়ে যায়, যেখানে তারা কোথায় বেরিয়েছে তার উপর নির্ভর করে ... উদাহরণস্বরূপ যদি তারা নীচে থেকে বেরিয়ে আসে, লোড করার bottomIDসংখ্যাটি কীভাবে mapএইভাবে মানচিত্রে আঁকা হবে।
আপনাকে আরও ভাল রূপায়িত করতে সহায়তা করার জন্য এখানে একটি প্রতিনিধিত্বমূলক .GIF রয়েছে:

আপনি দেখতে পাচ্ছেন, শীঘ্রই বা পরে অনেকগুলি মানচিত্র নিয়ে আমি অনেক আইডি নিয়ে কাজ করব। এবং এটি সম্ভবত কিছু বিভ্রান্তিকর এবং জঘন্য হতে পারে।
সুস্পষ্ট যুক্তিটি হ'ল এটি একবারে 176 টাইল লোড করে, একটি ছোট 512x352 ক্যানভাস রিফ্রেশ করে এবং সময়ে একটি মানচিত্র পরিচালনা করে। কনটি হ'ল এমএপি আইডিগুলি, যখন অনেকগুলি মানচিত্রের সাথে লেনদেন করা হয়, তখন মাঝে মাঝে বিভ্রান্তি পেতে পারে।
আমার প্রশ্ন
- মানচিত্র সংরক্ষণের এটি কি কার্যকর উপায় (টাইলসের ব্যবহারের ভিত্তিতে), বা মানচিত্রগুলি পরিচালনা করার জন্য আরও ভাল উপায় আছে?
আমি দৈত্যাকার মানচিত্রের লাইন ধরে ভাবছিলাম। মানচিত্রের আকার বড় এবং এটি সমস্ত এক 2D অ্যারে। ভিউপোর্টটি এখনও 512x352 পিক্সেল।
ভিজ্যুয়ালাইজ করতে সহায়তা করার জন্য এখানে আরও একটি .gif করেছি (এই প্রশ্নের জন্য):

আপনি আমার ইংরেজি বুঝতে না পারলে দুঃখিত। আপনার বুঝতে সমস্যা হয়েছে এমন কিছু জিজ্ঞাসা করুন। আশা করি, আমি এটি পরিষ্কার করে দিয়েছি। ধন্যবাদ।