ধাওয়া খেলায় খেলোয়াড়ের সরলরেখায় শত্রু চলাচল


10

আমি এমন একটি গেম তৈরি করছি যেখানে শত্রুরা মানচিত্রে এলোমেলোভাবে ছড়িয়ে পড়ে তারপর প্রতিটি ফ্রেমকে এলোমেলো গতিতে প্লেয়ারের দিকে এগিয়ে যায়। মানচিত্রে কোনও বাধা নেই তাই শত্রুরা সবসময় একটি সরলরেখায় চলে যায়। আমি কয়েকবার আন্দোলনের ফাংশনটি লিখেছি তবে শত্রুরা সর্বদা 0, 45, 90, 135, 180, 225, 270, 315 কোণগুলিতে আঘাত করে তবে তা কখনও সরলরেখা নয় no কোডের উদাহরণ এখানে:

    base_speed = random();

    diff_x = abs(enemy_y_pos - player_x_pos);
    diff_y = abs(enemy_x_pos - player_y_pos);
     if (diff_x > diff_y) {
      y_speed = base_speed;
     } else if (diff_y > diff_x) {
      x_speed = base_speed;
     }

     if (enemy_x_pos < player_x_pos) {
      velocity.x = x_speed;
     } else if (enemy_x_pos > player_x_pos) {
      velocity.x = -x_speed;
     } else {
      velocity.x = 0;
     }

     if (enemy_y_pos < player_y_pos) {
      velocity.y = y_speed;
     } else if (enemy_y_pos > player_y_pos) {
      velocity.y = -y_speed;
     } else {
            velocity.y = 0;
    }

    enemy_x_pos = enemy_x_pos + velocity.x;
    enemy_y_pos = enemy_y_pos + velocity.y;

গেম প্রোগ্রামিং এ এটি আমার প্রথম প্রচেষ্টা। আমি অনুমান করছি এটি ব্রেনহ্যামের লাইনের মতো আলগোরিদিম ব্যবহার করা উচিত ( http://en.wikedia.org/wiki/Bresenham%27s_line_algorithm ) তবে বাস্তবায়নের আমার প্রচেষ্টাতে একই সমস্যা রয়েছে have আমি কীভাবে শত্রুদের সরলরেখায় সরানো করব?

উত্তর:


17

ব্রেনহ্যামের লাইন অ্যালগরিদমটি ফ্লোটিং পয়েন্ট অপারেশনগুলি (পূর্ণসংখ্যার ক্রিয়াকলাপগুলি দ্রুততর) ব্যবহার না করে দ্রুত অঙ্কনের লাইনের জন্য তৈরি করা হয়েছিল। এটি অত্যন্ত আকর্ষণীয় yতিহাসিক তবে কোনও গেমের জন্য খুব ভাল সমাধান নয় (বিশেষত কারণ আপনি গতি নির্দিষ্ট করতে পারবেন না)।

2 ডি মুভমেন্ট করার সময় সর্বদা ভেক্টর ব্যবহার করুন। এটি আপনার জন্য সমস্ত জিনিস করবে। কখনও কখনও বীজগণিত ঠিক দুর্দান্ত।

Vec2d playerPos;
Vec2d direction; // always normalized
float velocity;

update()
{
   direction = normalize(playerPos - enemyPos);
   playerPos = playerPos + direction * velocity;
}

আপনার লক্ষ্য ভাষার জন্য অবশ্যই কিছু ভেক্টর 2 ডি শ্রেণি থাকবে 2


যে নিখুঁতভাবে কাজ। আমার প্রয়োজনীয় ফাংশনটি নর্মালাইজ করা ছিল। ধন্যবাদ।
ব্যবহারকারী 4761

9

আপনি কি প্রতিটি ফ্রেম গণনা করছেন? আপনার কোড হয় এক্স_স্পিড বা y_speed এলোমেলো সংখ্যায় এবং অন্যটি শূন্য (বা ডিফল্ট) সেট করে। ধরা যাক শত্রু 0, 0 এবং খেলোয়াড়টি 20, 10 এ রয়েছে This হয় প্রতিটি x বা y প্রতিটি ফ্রেম যাতে মনে হয় সে 45 ডিগ্রি কোণে 10, 10 পর্যন্ত চলে moves

নোটাবেনের ভেক্টরের ব্যাখ্যা সঠিক তবে এটি কীভাবে কাজ করে তা এখানে। ভেক 2 ডিতে একটি এক্স এবং ওয়াই উপাদান থাকবে। উপরের উদাহরণে, প্লেয়ারপোস - শত্রুপোস আপনাকে (20, 10) এর একটি ভেক্টর দেবে। স্বাভাবিককরণ () ভেক্টরকে পরিবর্তন করে যাতে দৈর্ঘ্য 1 হয় Currently বর্তমানে দৈর্ঘ্য স্কয়ার্ট (20 * 20 + 10 * 10)। এটি প্রায় 22.36068। এক্স এবং ওয়াই উভয়কে এই সংখ্যা দ্বারা বিভক্ত করে, দিকনির্দেশের জন্য আপনাকে প্রায় (0.89443, 0.44721) দেয়, যা শত্রু থেকে প্লেয়ারের দৈর্ঘ্য 1 নিয়ে ইঙ্গিত করে এমন একটি ভেক্টর যা আপনার এলোমেলো গতিতে এটির গুণক আপনি যা চান তা করেন।

তবে আমি প্রতিটি ফ্রেমকে একটি নতুন এলোমেলো গতি গণনা করব না। আপনি সম্ভবত একবারে এলোমেলো গতি সেট করতে চান বা প্রাথমিক গতি এবং একটি লক্ষ্য গতি পেতে পারেন যা আপনি প্রতিটি ফ্রেমের কাছাকাছি চলে যান। আপনার শত্রুটিকে প্রাথমিকভাবে 100 মাইল প্রতি ঘণ্টা যেতে অনুভূত হয় না, তারপরে একটি ফ্রেমের জন্য 50 মাইল এবং পরবর্তী মাইলের জন্য 200 মাইল ph

float targetSpeed = random(); // do this only rarely, or each frame if you don't mind slowing down and speeding up constantly

float acceleration = max(abs(targetSpeed - speed), 0.5) * sgn(targetSpeed - speed); // cap accel/decel at 0.5 per frame
speed = speed + acceleration;

সুন্দর ব্যাখ্যা এবং সংযোজন জেসন, ধন্যবাদ। আমি আপনার ত্বরণ ফাংশনটি পছন্দ করি
নোটাবেন

এলোমেলোভাবে () স্কোপটিতে টাইপ ছিল। নোটবেইন যা লিখেছিল তার সাথে আপনার ব্যাখ্যা এবং কোড গেমটি কাজ করতে সহায়তা করে। ধন্যবাদ।
ব্যবহারকারী 4761
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.