পার্লিন শব্দের দ্বারা তৈরি একটি বিশ্বে স্প্যানিং ইউনিট?


16

আমার পার্লিন শব্দ-ভিত্তিক গেমটিতে আমি এমন কিছু সমস্যা পেয়েছি। নীচে সংযুক্ত স্ক্রিনশটটি একবার দেখুন।

এখানে চিত্র বর্ণনা লিখুন

আপনি যে সাদা অঞ্চলগুলি দেখেন সেগুলি দেয়াল এবং কালো অঞ্চলগুলি হাঁটা যায়। মাঝের ত্রিভুজটি প্লেয়ার।

আমি এই গেমটিতে পদার্থবিজ্ঞানটিকে কোনও টেক্সচারে (সাদা বা কালো পিক্সেল) আঁকিয়ে, এবং তারপরে সিপিইউ থেকে পেয়ে তা প্রয়োগ করেছি।

যাইহোক, আমি এখন হাতে অন্য একটি সমস্যা নিয়ে দাঁড়িয়ে আছি। আমি পর্দার কিনারায় ইউনিটগুলি (বা ক্রিপস, আপনি তাদেরকে যাই বলুন) অবিচ্ছিন্নভাবে ছড়িয়ে পড়তে চাই। এখানে মুল বক্তব্যটি হ'ল চূড়ান্ত খেলায় একটি "যুদ্ধের কুয়াশা" থাকবে যা খেলোয়াড়কে যেভাবেই দেখাতে দেয় না।

আমি অনুভব করেছি যে আমি কেবল পর্দার প্রান্তে পিক্সেলগুলি স্ক্যান করতে পারি এবং তাদের পদার্থবিজ্ঞানের টেক্সচারটি কালো কিনা তা দেখতে এবং সেখানে এলোমেলোভাবে জিনিস স্প্যান করতে পারি। তবে, আপনি যদি স্ক্রিনশটটি দ্বিতীয়বার দেখেন তবে (উপরের-বাম কোণে) একটি উদাহরণ রয়েছে যেখানে আমি ক্রিপগুলি স্পোন করতে চাই না (যেহেতু তারা সেখান থেকে খেলোয়াড়ের কাছে পৌঁছাতে সক্ষম হবে না) ।

জিপিইউ কীভাবে আমার পক্ষে এই স্প্যান-স্পটগুলি নির্ধারণ করতে পারে বা অন্য কোনও উপায়ে সম্ভব? আমি স্ক্রিন এবং প্লেয়ারের প্রান্তে প্রস্তাবিত পয়েন্টের মধ্যে ভেক্টর তৈরির বিষয়ে চিন্তা করেছি এবং তারপরে প্রতি 10 ভক্সেল অনুসরণ করব এবং দেখুন সেখানে কোনও ইউনিট তৈরির আগে কোনও প্রাচীর ধাক্কা খায় কিনা।

তবে উপরের প্রস্তাবিত সমাধানটি খুব সিপিইউ নিবিড় হতে পারে।

এই বিষয়ে কোন পরামর্শ?

দ্রষ্টব্য 1 ইউনিটগুলির তৈরি হওয়া জন্য, প্রাচীরের সংঘর্ষগুলি এড়াতে আমি কোনও ধরণের পথনির্দেশক ব্যবহার করতে চাই না কারণ এই ইউনিটগুলি খেলোয়াড়ের দিকে চলে। সুতরাং, ইউনিটগুলি অবশ্যই পর্দার প্রান্তে ছড়িয়ে পড়তে হবে, এমন কোনও স্থানে যেখানে প্লেয়ারের দিকে সরলরেখায় হাঁটলে কোনও দেয়ালের সাথে সংঘর্ষ না ঘটে ।


1
মানচিত্রটি প্লেয়ারের সাথে ঘোরাঘুরি করে, বা প্লেয়ারটি মানচিত্রে ঘোরাফেরা করে? অর্থাৎ মানচিত্র কি বদলে যাবে? যদি তা না হয় তবে আমি প্রজন্মের সমস্ত অ-অ্যাক্সেসযোগ্য পয়েন্ট পূরণ করার পরামর্শ দিচ্ছি, যাতে আপনাকে সেগুলি সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই।
dlras2

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

1
অথবা, ব্লুর মন্তব্যটিকে অন্যভাবে বোঝাতে: প্লেয়ারটি সরে যেতে পারলে আপনার প্রশ্নের সম্ভবত কোনও বৈধ উত্তর নেই (কোনও মানচিত্রের তুচ্ছ ঘটনা বাদে কোনও দেয়াল টাইলস / পিক্সেল নেই) player এটি এখনও প্রয়োজন যে আপনি "স্ট্রেট লাইন" দিয়ে বোঝাচ্ছেন যা বোঝাতে প্লেয়ারটি যদি স্থির থাকে তবে তার উত্তর পেতে হবে।
মার্টিন সোজকা

উত্তর:


3

এই কাজের জন্য একটি কার্যকরী কার্যকর অ্যালগরিদম রয়েছে, এই পরিস্থিতিতে বন্যার অ্যালগরিদমের চেয়ে অনেক বেশি দক্ষ (এটির জটিলতা বন্যাকবলিত অঞ্চলটির চেয়ে সীমানা আকারের সমানুপাতিক): এটি মার্চিং স্কোয়ার অ্যালগরিদম। ধারণাটি সহজ: প্লেয়ারগুলির অবস্থান (স্ক্রিন মিডপয়েন্ট) থেকে শুরু করুন, দিকনির্দেশ চয়ন করুন এবং কোনও প্রাচীর না পাওয়া পর্যন্ত হাঁটুন। আপনি যখন প্রাচীরের সাথে সংঘর্ষের সময়, আপনি অ্যালগরিদম শুরু করবেন: আপনি একটি ওরিয়েন্টেশন বেছে নেবেন (উপরে বা নীচে) এবং এই অঞ্চলের সীমানা পেরিয়ে পিক্সেলগুলি হাইলাইট করে start এটি আপনাকে অনুমোদিত অঞ্চলের অভ্যন্তরীণ সীমানা দেয়। এরপরে, আপনি কেবল পরীক্ষা করতে পারেন যে স্পাঙ্কিং ইউনিটগুলির জন্য প্রার্থী পয়েন্টগুলি এই সীমানায় অবস্থিত।

সীমানা চালানোর জন্য আপনার এই নীতিটি অনুসরণ করা উচিত:

http://en.wikedia.org/wiki/File:Marchsquares.png (meh আমি ছবিগুলি এখনও পোস্ট করতে পারি না)

উইকিপিডিয়া বর্ণনা (যদিও এটি আরও জটিলতার কারণ এটি অন্যান্য প্রয়োগগুলিকে মাথায় রেখে ব্যবহার করা হয়েছে):

http://en.wikipedia.org/wiki/Marching_squares


10

প্লেয়ারের অবস্থান থেকে বন্যা পূর্ণ করুন ; প্রতিটি অঞ্চল "প্লাবিত" তখন একটি বৈধ খেলার ক্ষেত্র এবং অন্য সমস্ত দেয়াল।

সম্পাদনা: অতিরিক্ত প্রয়োজনীয় "" সরাসরি লাইনে পৌঁছনীয় "হিসাবে, মনে রাখবেন যে একটি পৃথক স্থানে আপনাকে এটিকে আরও কিছুটা সংজ্ঞায়িত করতে হবে। উদাহরণস্বরূপ, উপরের সমস্ত পাথ এই জাতীয় পরিবেশে একটি বৈধ "স্ট্রেইট লাইন" হতে পারে এবং আমি এগুলিকে কোনও কোনও সময়ে বা অন্য কোনও খেলায় ব্যবহার করতে দেখেছি:

"সরল রেখা" রূপগুলি

বিশেষত, এগুলির বেশিরভাগটি পরিবহণমূলক নয় - যার অর্থ কেবলমাত্র আপনি "স্ট্রেট লাইনে" এ থেকে বিতে পৌঁছাতে পারেন তার অর্থ এই নয় যে আপনি বি থেকেও এ পৌঁছাতে পারবেন; উভয়ই বিপরীত অগত্যা সত্য।

তদতিরিক্ত, যদি একটি বা উভয় "পয়েন্ট" পয়েন্টগুলি অবরুদ্ধ করে থাকে তবে আপনি কীভাবে তির্যক আন্দোলন পরিচালনা করবেন তা নিয়ে প্রশ্ন রয়েছে।


এটি কি এইচএলএসএলে পুরোপুরি প্রয়োগ করা যেতে পারে?
ম্যাথিয়াস লাইককেগার্ড লরেঞ্জেন

@ ম্যাথিয়াস লাইককেগার্ড লরেনজেন: হ্যাঁ, সন্দেহ হয় অ্যালগরিদমের প্রতিটি পদক্ষেপ পিক্সেল শেডার হিসাবে এবং উদাহরণস্বরূপ দুটি টেক্সচার টার্গেটের মধ্যে রেন্ডারিং করে ... তবে কেন ? খুব কমপক্ষে পথ সন্ধানের জন্য আপনার সম্ভবত সিপিইউতে অ্যালগরিদম থেকে তথ্য প্রয়োজন হবে।
মার্টিন সোজকা

1
@ ম্যাথিয়াস লাইককেগার্ড লরেনজেন: আপনি যা চেয়েছিলেন তা থেকে কিছুটা আলাদা। এক্ষেত্রে: আপনার পৃথক পৃথক স্থান পার্টিশন স্কিমার সাহায্যে আপনি কীভাবে একটি "সরলরেখা" সংজ্ঞায়িত করবেন?
মার্টিন সোজকা

2
এমনকি আপনি যদি প্যাথফাইন্ডিং ব্যবহার করতে না চান, সিপিইউকে বন্যা ফিলির কাজটি করা সম্ভব বলে মনে করেন, কেবল একবার আপনাকে বন্যারফিল কল করতে হবে এবং তারপরে আপনার কাছে 3 রঙের সংজ্ঞা দেয়াল, ফ্রি স্পেস এবং স্পেনযোগ্য স্পেস রয়েছে। 4096x4096 টেক্সচারের জন্য সিপিইউতে বন্যার কাজ পূর্ণ করতে এক সেকেন্ডেরও কম সময় লাগবে।
Ali1S232

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

1

কিভাবে spawns ঘটতে দেওয়া সম্পর্কে? আমি এতে কোনও বিশেষ সমস্যা দেখছি না।


এবং যদি তারা কোনও দেয়ালের পিছনে স্পান করে? কীভাবে আপনি তাদের প্লেয়ারে পৌঁছে দেবেন?
ম্যাথিয়াস লাইককেগার্ড লরেঞ্জেন

1
গেমটিতে সমস্ত শত্রুদের মেরে ফেলার মতো পরিস্থিতি থাকলে এবং এটি 50 শত্রুকে উত্সাহ দেয় তবে সমস্যাটি হতে পারে তবে কয়েকটি প্রাচীরের আড়ালে তৈরি হয়েছিল। প্লেয়ার শত্রুদের হত্যা করতে সক্ষম হবে না এবং দৃশ্যটি শেষ হবে না।
মিথ্যা রায়ান

1
অন্যান্য ইউনিট এখনও প্লেয়ার স্প্যান হওয়ার পরে কীভাবে চলাচল করে তার উপর নির্ভর করে প্লেয়ারের কাছে পৌঁছাতে সক্ষম হতে পারে না, উভয় ক্ষেত্রে আপনাকে কিছু ইউনিট ছড়িয়ে দিতে হবে।
এআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআমি

যুদ্ধের কুয়াশা
কৃপণ স্প্যানগুলিকে


1

যদি প্লেয়ারের কাছে কেবল বৈধ সরল রেখার সাথে পয়েন্টগুলি চিহ্নিত করা গুরুত্বপূর্ণ তবে আপনি নীচের মতো একটি অ্যালগরিদম ব্যবহার করতে পারেন (এটি একটি সি ++ কোড), এটি সাধারণ বন্যার চেয়ে বেশি গ্রহণ করে। কিছু ছোট বাগ থাকতে পারে (যদি কেউ সেগুলি সংশোধন করে তবে আমি খুশী হব) যেহেতু আমি কোডটি নিজে পরীক্ষা করিনি তবে আপনি ধারণাটি পাবেন get

void straightlineFill(Point startPoint, Texture target)
{
    queue<Point> pointQueue;
    for (int dx = -1;dx <=1;dx ++)
            for(int dy = -1;dy <=1;dy++)
                if(dx != 0 && dy != 0)
                    pointQueue.push(point(startPoint.x + dx, startPoint.y + dy));
    while (!pointQueue.empty())
    {
        point front = pointQueue.front();
        pointQueue.pop();
        if (target.pixelAt(front) == COLOR_SPAWNABLE||
            target.pixelAt(front) == COLOR_WALL||
            target.pixelAt(front) == COLOR_NOT_SPAWNABLE)
                continue;
        taraget.setPixelAt(front, colorFilled); 
        for (int dx = -1;dx <=1;dx ++)
            for(int dy = -1;dy <=1;dy++)
                if(dx != 0 && dy != 0)
                    pointQueue.push(point(front.x + dx, front.y + dy));
        // up until now was the normal floodfill code
        // and here is the part that will do the real straight line checking

        // lineDX & lineDY will keep how much the line we are checking is skewed
        int lineDX = front.x - startPoint.x;
        int lineDY = front.y - startPoint.y;

        // step will show us how much we have to travel to reach each point of line
        point step;
        if (abs(lineDX) < abs(lineDY))
        {
            if (lineDX < 0)
                step = point(-1,0);
            if (lineDX == 0)
                if (lineDY < 0)
                    step = point(0,-1);
                else
                    step = point(0,1);
            if (lineDX > 0)
                step = point(1,0);
        }

        if (abs(lineDX) < abs(lineDY))
        {
            if (lineDY < 0)
                step = point(0,-1);
            if (lineDY == 0)
                if (lineDX < 0)
                    step = point(-1,0);
                else
                    step = point(1,0);
            if (lineDY > 0)
                step = point(0,1);
        }

        // moved will keep how much we have traveled so far, it's just some value that will speed up calculations and doesn't have any mathematical value
        point moved = 0;

        // spawnable will keep if the current pixel is a valid spawnpaint

        bool spawnable = true;

        // now we will travel on the straight line from player position to the edges of the map and check if whole line is valid spawn points or not.

        while (target.isInside(front))
        {
            front = front + step;
            moved = moved + point(step.x * lineDX, step.y * lineDY);
            if (step.x != 0 && moved.x < moved.y)
            {
                moved.x = moved.x - lineDY * sign(lineDY);
                front.y = front.y + sign(lineDY);
            }
            if (step.y != 0 && moved.y < moved.x)
            {
                moved.y = moved.y - lineDX * sign(lineDX);
                front.x = front.x + sign(lineDX);
            }

            if (target.getPixelAt(front) == COLOR_WALL)
                spawnable = false;

            if (spawnable)
            {
                target.setPixelAt(front,COLOR_SPAWNABLE);
                for (int dx = -1;dx <=1;dx ++)
                    for(int dy = -1;dy <=1;dy++)
                        if(dx != 0 && dy != 0)
                            pointQueue.push(point(front.x + dx, front.y + dy));             
            }
            else
            {
                target.setPixelAt(front,COLOR_NOT_SPAWNABLE);
            }
        }
    }
}

1

উত্তম অঞ্চলগুলি উপস্থাপন করে এমন রঙগুলি দিয়ে আপনি মানচিত্রটি পূরণ করতে পারেন ..., যদি একই অঞ্চলে থাকে তবে আপনি নিজের ইউনিটটিকে স্পোন করতে পারেন। অথবা আপনি অ্যাক্সেসযোগ্য অঞ্চলগুলির জন্য আরও সহজ অনুসন্ধান করতে পারেন।

এটি স্থিতিশীল ডেটা যাতে আপনি এটি প্রাক্কলক করতে পারেন।

আপনাকে চিত্র সন্ধানের পয়েন্টগুলি পূরণ করতে হবে যেখানে কাফেলা থেকে উত্তল রূপান্তরিত হয়েছে, দৃশ্যত এটি সন্ধান করা সহজ বলে মনে হচ্ছে আপনার দুটি পরিস্থিতি রয়েছে:

  1. অনুভূমিক: যেখানে কমলা থেকে নীল পরিবর্তন হয়।
  2. উল্লম্ব: যেখানে লাল পরিবর্তিত হয় সবুজ এবং কমলা।

এখানে চিত্র বর্ণনা লিখুন


এটি কাজ করে না। নীচের ডানদিকে দেখুন, বিশেষত লাল অঞ্চলে অঙ্কুর। এটি সম্পূর্ণরূপে উত্তল তাই অন্য রঙ ব্যবহারের পরিবর্তনের কোনও পরিবর্তন নেই তবে স্পষ্টতই ডান প্রান্তের নীচের প্রান্তের লাল দিকের নীচে থেকে নীচের দিক থেকে কোনও সরল রেখা উপস্থিত নেই।
লোরেন পেচটেল

@ লরেন পেচটেল এটি হাতে তৈরি, আপনি ঠিক বলেছেন, সেখানে একটি ত্রুটি রয়েছে, এটি আমার দোষ, তবে আপনি বুঝতে পারবেন যে কমলা থেকে নীল পরিবর্তনের একই পরিস্থিতি।
ব্লু

@ লরেন পেচটেল, মনে করিয়ে দিন যে প্ররোচিত ব্যক্তিগুলি হলুদ রঙের মতো অঞ্চলে ঝাঁকুনি দেওয়া থেকে বিরত থাকে। এই পদ্ধতিটি নিশ্চিত করে যে আপনি যদি একই জায়গায় কোনও শত্রুকে প্লেয়ার সমেত ছেড়ে দেন তবে এটি পৌঁছনীয়। অবশ্যই, এটি বাস্তবায়ন করা কঠিন, তবে ধারণাটি বৈধ।
ব্লু

আপনার রিভিশন সাহায্য করবে না। উত্তল বক্ররেখার দুটি পয়েন্টের মধ্যে তাদের মধ্যে কোনও সময়কালের জন্য কোনও আইনি সরল রেখা থাকবে না। আরও বিভাগ সাহায্য করবে না।
লরেন পেচটেল

অঞ্চল বা পয়েন্টগুলির সেটকে উল্লেখ করে উত্তলটির সংজ্ঞাটি দেখুন ... en.wikedia.org/wiki/Convex
ব্লু

1

এখানে এমন কিছু যা আমি আসলে আমার নিজের গেমটিতে ব্যবহার করেছি (2 ডি সিম্পলেক্স শব্দের উত্পন্ন বিশ্ব, প্রায় ঠিক আপনার মতো) - রে। প্লেয়ার থেকে শুরু করুন, একটি ওরিয়েন্টেশন নির্ধারণ করুন (আপনি চাইলে এলোমেলো) এবং আপনি কোনও কিছু (পর্দার কিনারা বা গ্রহাণুর কিনারায়) আঘাত না করা পর্যন্ত এই লাইনটি বরাবর যান। আপনি যদি পর্দার প্রান্তে আঘাত করেন (এবং একটি গ্রহাণু / হোয়াইট ব্লাব নয়), তবে আপনি জানেন যে পর্দার প্রান্ত থেকে প্লেয়ারের জন্য একটি সরল, খোলা লাইন রয়েছে। তারপরে আপনি যে বিন্দুতে আঘাত করেছেন সে সময়ে একটি দানবকে স্প্যান করুন। যদি আপনি কোনও গ্রহাণু মারেন তবে পরীক্ষাটি আবার করুন।


0

আপনি ব্যবহার করতে পারেন এমন আরও একটি (নন-জিপিইউ) সমাধান হ'ল পথ-সন্ধান। মানচিত্র আঁকার আগে মানচিত্রের প্রতিটি প্রান্তে প্রতিটি সম্ভাব্য স্প্যান-পয়েন্ট থেকে পথ সন্ধান করুন এবং কেন্দ্রে কোনও পথ আছে কিনা তা দেখুন। একটি * পাথ সন্ধান করা ব্যয় / পারফরম্যান্সে বেশ ঠিক আছে, তবে সমস্যাটি যদি গেম শুরু হওয়ার আগে আপনি এটি করতে পারেন।

যে কোনও স্পন পয়েন্টের কোনও পথ নেই তাকে একটি বাদ দেওয়ার তালিকায় রাখা যেতে পারে; বা তদ্বিপরীত (পথ সহ যে কোনও বিন্দু অন্তর্ভুক্তির তালিকায় রাখা যেতে পারে)।

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