আমি কীভাবে ভাল লোকের আক্রমণগুলি কেবল খারাপ ছেলেরা এবং তার বিপরীতে হিট করব?


11

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

আমি যেভাবে সমাধানের কথা ভাবছি তা এটি তৈরির মাধ্যমে যাতে এই Unitদৃষ্টান্তটি (এটি জাভাস্ক্রিপ্ট, বিটিডাব্লু) এর একটি alignmentসম্পত্তি থাকে যা হয় হয় goodবা হয়ও bad। এবং আমি কেবল তখনই সংঘর্ষ ঘটতে দেব

class Attack

    boolean didAttackCollideWithTarget(target)
        return attack.source.alignment != target.alignment and collisionDetected(attack.source, target)

এটি অবশ্যই সিউডো-কোড।

তবে আমি এই প্রশ্নটি জিজ্ঞাসা করছি কারণ আমার বোধ হয় আমার Unitক্লাসে আরও একটি সম্পত্তি যুক্ত করার পাশাপাশি এটি ডিজাইনের আরও অনেক মার্জিত উপায় হতে পারে ।


5
ফিল্টারিং এখানে আদর্শ পদ্ধতির। মূলত এটিই আপনি বর্ণনা করেছেন। স্তরগুলিও আছে। দুটি স্তর, খারাপ স্তর এবং ভাল স্তর। খারাপ ছেলেরা প্রজেক্টেলগুলি ভাল স্তর এবং তদ্বিপরীত দিকে ফেলা হয়।
মাইকেলহাউস

@ বাইট 56 আপনি কি এই "স্তর" ধারণাটি বিস্তারিতভাবে বর্ণনা করতে পারেন? বা কমপক্ষে এটি সম্পর্কে কিছু লিঙ্ক? আমি এর আগে কখনও শুনিনি।
ড্যানিয়েল কাপলান

মূলত তারা পৃথক "বিশ্বের"। একটি স্তরের সমস্ত বস্তু একে অপরের সাথে যোগাযোগ করে তবে অন্য কোনও স্তরের সাথে ইন্টারঅ্যাক্ট করে না। এটি ট্যাগগুলির মাধ্যমে (ফিল্টারিংয়ের মতো), বা প্রতিটি স্তরের জন্য সম্পূর্ণ আলাদা ডেটাসেটের সাহায্যে করা যেতে পারে।
মাইকেলহাউস

3
এক কথায়, এটি গ্রুপিং। ভাল বুলেটগুলি গ্রুপ করুন এবং খারাপ লোকের বিরুদ্ধে কেবল সংঘর্ষের জন্য পরীক্ষা করুন। ফ্লিক্সেল এর মত একটি ধারণা আছে।
ashes999

3
একটি নীটপিকি ডিজাইনের নোট: আপনি কী 'বন্ধুত্বপূর্ণ-ফায়ার' শটগুলি আঘাত করতে চান তবে কোনও ক্ষতি করতে চান না, বা আপনি চান শত্রুদের আক্রমণ করার জন্য সম্ভবত তাদের মিত্রদের অবহেলা করতে হবে?
স্টিভেন স্টাডনিকি

উত্তর:


6

সংঘর্ষ ফিল্টারিং

আরও শক্তিশালী পরিস্থিতি যা বহু স্তরগুলিতে স্কেল করে ফিল্টারিং ব্যবহার করা, যা গ্রুপিংয়ের মতো জিনিস নয়।

প্রতিটি বস্তুকে 2 বিটমাস্ক দিয়ে এটি সর্বোত্তম কাজ করে ।

Category
Mask

এবং নীচে সত্য হলে কেবল সংঘর্ষের সূত্রপাত করুন।

(filterA.maskBits & filterB.categoryBits) != 0 &&
(filterA.categoryBits & filterB.maskBits) != 0;

এটি মাস্ককে 0xFFFF এ ডিফল্ট করা সবচেয়ে সহজ যার ফলে এটি সমস্ত কিছুর সাথে সংঘর্ষে আসে। এবং বিভাগটি 0x0001 এ ডিফল্ট করুন। অন্যগুলির মুখোশের বিভাগগুলির সাথে বস্তুগুলির সংঘর্ষ ঘটবে।

এটিকে ভাবার আর একটি উপায় হ'ল প্রতিটি বস্তুর একটি ধরণের এবং এর সাথে সংঘটিত হতে পারে এমন সমস্ত ধরণের একটি তালিকা রয়েছে। কেবল যখন দুটি বস্তু একে অপরের প্রকারের সাথে সংঘর্ষ হয় তখনই সেখানে সংঘর্ষ হয়। আপনার মুখোশের পরিবর্তে এনামগুলির একটি তালিকা থাকতে পারে তবে দ্রুততার সাথে একটি মাস্কের পরিবর্তে আপনার একই আচরণ থাকতে পারে।

পরিস্থিতি আপনি বর্ণনা

আমি এই পরিস্থিতিতে enums সুবিধা গ্রহণ করতে চাই।

সুতরাং আমাদের আছে বলে।

enum Categories {
    GoodGuy =           0x0001,
    BadGuy =            0x0002,
    Bullet =            0x0004,
    GlassWall =         0x0008,
    Lazer =             0x0010,
    All =               0xFFFF
};

বুলেট একটি ভাল লোক দ্বারা গুলি করা

 Category = Bullet
 Mask = BadGuy | GlassWall

ভালো মানুষেরা

 Category = GoodGuy
 Mask = All

খারাপ লোক

 Category = BadGuy
 Mask = All

যখন কোনও ভাল লোকের বুলেট শট অন্য ভাল লোককে আঘাত করে তখন নীচে ফলাফল হয়।

(All & GoodGuy) != 0 && <-- Passes
(GoodGuy & (BadGuy | GlassWall)) != 0; <-- This would fail

তবে এটি খারাপ ছেলেগুলিকে আঘাত করবে।

(All & BadGuy) != 0 && <- Passes
(BadGuy & (BadGuy | GlassWall)) != 0; <-- Passes

আপনি কি বিট গাণিতিকের নিম্ন স্তরের বিশদটি ব্যাখ্যা করার পরিবর্তে এই ধারণাটি ব্যাখ্যা করার পরিবর্তে আপত্তি করবেন ?
ড্যানিয়েল কাপলান

@ এটিটিওয়াইটি নিশ্চিত 5 মিনিটের মধ্যে আবার চেক করুন
ক্লাসিক থান্ডার

2

আমার বর্তমান প্রকল্পে (জাভাতে) আমার একই সমস্যা ছিল। কয়েকটি দম্পতি চেষ্টা করার পরে চারটি তালিকা তৈরি করে এটি সমাধান করা হয়। এই সমাধানটি জাভা এবং 2 ডি গেমের জন্য তৈরি হয়েছে তবে জাভাস্ক্রিপ্টেও একইভাবে কাজ করা উচিত

public static main (String [] args)
{
    private List<Bullets> bullets_GoodGuys = new LinkedList <Bullet>(); //List of all bullets fired by good guys
    private List<Bullets> bullets_BadGuys  = new LinkedList <Bullet>(); //List of all bullets fired by bad guys
    private List<Guys> goodGuys  = new LinkedList <Guys>(); //List of all good guys
    private List<Guys> badGuys  = new LinkedList <Guys>();  //List of all good guys

    init();
    ...
    while(game_is_running)
    {
        ... 
        for(int i=0;i>=goodGuys.length;i++)
        {
            for(int j=0;j>=bullets_BadGuys.length;i++)
            {
                if(goodGuys.get(i).getBounding().interacts(bullets_BadGuys.get(i).getBounding()))
                {// If a good guy was hit by a bullet from a bad guy
                    goodGuys.get(i).getDamage();
                    bullets_BadGuys.remove((bullets_BadGuys.get(i));
         }   }   }
       for(...) //same for the bad guys
       {...}
}

সুডোকোড

class Guys
{
   private float xkoordinate;
   private float ykoordinate;
   private BufferedImage look;
   private Rectangle bounding = new Rectangle(xkoordinate,ykoordinate,look.getWith(),look.getHight())
   ...
}

সিউডো-কোড, বুলেট শ্রেণীর জন্য একই

এটি সেরা বা দ্রুত সমাধান নাও হতে পারে তবে মুহুর্তে এটি আপনাকে সহায়তা করবে। আমি দুঃখিত যে জাভাস্ক্রিপ্টে আমি আপনাকে কোনও সমাধান দিতে পারি না তবে আমি আশা করি আমি আপনাকে সহায়তা করতে পারব

যাইহোক আমার ইংরেজি সেরা নয় তবে আমি আশা করি আপনি আমার ব্যাখ্যাটি অনুসরণ করতে পারেন

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