আমি কীভাবে টপ ডাউন ডাউন আরপিজি চলাচল সামলবো?


13

আমার একটি খেলা আছে যা আমি জাভাতে লিখছি। এটি একটি শীর্ষ ডাউন আরপিজি এবং আমি বিশ্বের আন্দোলন পরিচালনা করার চেষ্টা করছি। বিশ্বটি মূলত প্রক্রিয়াজাত এবং বিশ্বজুড়ে চরিত্রের চলাচল পরিচালনা করতে এবং স্ক্রিনে পরিবর্তনগুলি কীভাবে রেন্ডার করতে হয় তা মোকাবেলায় আমার একটি কঠিন সময় হচ্ছে। আমার কাছে বিশ্বগুলি ব্লকগুলিতে লোড হয়েছে যাতে সমস্ত টাইল থাকে।

আমি কীভাবে চরিত্রের গতিবিধি মোকাবেলা করব?

আমি স্ট্যাম্পড হয়েছি এবং এটি নিয়ে আমার কোথায় যাওয়া উচিত তা বুঝতে পারি না।

সম্পাদনা : ভাল আমি বিষয়টি হাতে নিয়ে বিমূর্ত ছিলাম।

এই মুহূর্তে আমি কেবল কঠোরভাবে সমস্ত কিছু 2D অ্যারে আঁকিয়ে রাখতে এবং ব্লক আইডি এবং প্লেয়ারটিকে ব্লকের অফসেটে সংরক্ষণ করার কথা ভাবতে পারি বা আমি কথা বলতে "টাসতে" পারি এবং টাইলসের মাঝে চলাফেরা করতে পারি।

উত্তর:


11

ওয়ার্ল্ড কোঅর্ডিনেট ব্যবহার করুন

(বা যেমন আপনি এটি রেখেছেন, সবকিছু ভাসিয়ে দিন))

ওয়ার্ল্ড কোঅর্ডিনেটগুলি হ'ল আপনি যা নিয়ে সাধারণত কাজ করেন এবং এর প্রচুর কারণ রয়েছে। এগুলি পৃথিবীতে আপনার অবস্থানকে উপস্থাপনের সবচেয়ে সহজ এবং স্বজ্ঞাত উপায় এবং একই পৃথিবীতে যে কোনও দুটি সত্তার অবস্থানের তুলনা করার একমাত্র উপায়।

আপনি ব্যক্তিগত ব্লকের মধ্যে তাকে ট্র্যাক করে কাজ করে ছাড়া আর কিছুই অর্জন করেন না। ঠিক আছে, একটি সুবিধা হ'ল তিনি কোন ব্লকে রয়েছেন তা নির্ধারণ করা তবে আপনি ইতিমধ্যে বিশ্ব সমন্বয়কারীদের সাথে এটি গণনা করতে পারেন।


এই উত্তরটির বাকী অংশটি কীভাবে কোনও খেলোয়াড়কে তার বিশ্বের স্থানাঙ্কের উপর ভিত্তি করে ওয়ার্ল্ড ব্লকের গণনা করতে হবে তার ব্যাখ্যা।

আমি কোড স্নিপেটটি লিখব যেন আপনার নামে 2D ভেক্টর শ্রেণি রয়েছে Vector2- যে ধরণের ভেক্টর আপনি জ্যামিতিতে খুঁজে পান, Vectorপ্রস্তাবিত তালিকার মতো নয় java.util। আপনার যদি কোনও জ্যামিতিক ভেক্টর ক্লাস না থাকে তবে আপনার কিছু অনলাইন খুঁজে পাওয়া উচিত বা নিজের কিছু লিখতে হবে (জাভাটির জন্য যে কোনও মানের জ্যামিতি লাইব্রেরিগুলি কি কেউ জানেন?)

ভেক্টর 2 শ্রেণিতে একটি Xক্ষেত্র এবং Yক্ষেত্র থাকবে, যা সর্বজনীন সংখ্যা (এখানে কোন সংখ্যার প্রকারের তা বিবেচ্য নয়)।

// Current player X,Y position in the world
Player.Position.X, Player.Position.Y

// An array of map blocks with consistent width and height
Block[x][y] blocks = World.GetBlocks();

// We'll wing it with an example global width/height for all blocks
Block.GetWidth() == 100;
Block.GetHeight() == 100;

// To ensure we're on the same page:
// blocks[0][0] should be at position (0,0) in the world.
// blocks[2][5] should be at position (200,500) due to the width/height of a block.

// Also:
// Assuming (0,0) is in the top-left of the game world, the origin of a block
// is its top-left point. That means the point (200,500) is at the top-left of
// blocks[2][5] (as oppose to, say, its center).

public Vector2 GetPlayersBlockPosition() {
    Vector2 blockPosition = new Vector2();
    blockPosition.X = (int)(Player.Position.X / Block.GetWidth());
    blockPosition.Y = (int)(Player.Position.Y / Block.GetHeight());

    return blockPosition;
}

public Block GetPlayersBlock() {
    Vector2 bp = GetPlayersBlockPosition();
    return blocks[bp.X, bp.Y];
}

Block block = GetPlayersBlock();

2 ফাংশন> ব্লক ট্র্যাকিং এবং আন্তঃ-ব্লক স্থানান্তরকরণের সমস্ত বিশৃঙ্খলা


1
আমি যা চেয়েছিলাম তার থেকে ভাল উত্তর
ওয়ার্ম ওয়াফলস

0

আপনার প্রশ্নটি কিছুটা বিমূর্ত তবে সম্ভবত আপনি একটি অ্যালগোরিদম সন্ধানের জন্য সন্ধান করছেন, আমি এ * (http://en.wikedia.org/wiki/A*_search_algorithm) এর পরামর্শ দিই। টাইলটি যদি অবরুদ্ধ ভূখণ্ডে অবরুদ্ধ না থাকে তবে এটি আপনাকে অক্ষরের টাইলকে টালি সরাতে সহায়তা করবে।


1
আমি কীভাবে রেন্ডারিংকে সামলাব তা আরও অনেক কিছু। আমি কি প্রতিটি ব্লকে অফসেট ব্লক আইডি এবং প্লেয়ার সংরক্ষণ করব?
ওয়ার্ম ওয়াফলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.