मैं कैसे अच्छा आदमी हमलों केवल बुरे लोगों और इसके विपरीत हिट कर सकता हूँ?


11

मेरे खेल में कई अलग-अलग प्रकार के अच्छे लोग हैं और कई अलग-अलग प्रकार के बुरे लोग हैं। वे सभी एक दूसरे पर प्रोजेक्टाइल फायरिंग करेंगे लेकिन मैं नहीं चाहता कि संरेखण के लिए कोई आकस्मिक संपार्श्विक क्षति हो। इसलिए बुरे लोगों को अन्य बुरे लोगों को मारने / नुकसान नहीं पहुंचाना चाहिए और अच्छे लोगों को अन्य अच्छे लोगों को मारने / नुकसान करने में सक्षम नहीं होना चाहिए।

जिस तरह से मैं इसे हल करने के बारे में सोच रहा हूं वह इसे बनाकर है ताकि Unitउदाहरण (यह जावास्क्रिप्ट, btw) है, एक alignmentसंपत्ति है जो goodया तो हो सकती है bad। और मैं केवल टकराव होने दूंगा अगर

class Attack

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

यह छद्म कोड है, ज़ाहिर है।

लेकिन मैं यह सवाल पूछ रहा हूं क्योंकि मुझे यह समझ है कि मेरी Unitकक्षा में अभी तक एक और संपत्ति जोड़ने के अलावा इसे डिजाइन करने का एक और अधिक सुंदर तरीका हो सकता है ।


5
फ़िल्टरिंग यहाँ विशिष्ट दृष्टिकोण है। अनिवार्य रूप से वही है जो आपने वर्णित किया है। वहां भी परतें हैं। दो परतें, खराब परत और अच्छी परत। बुरे लोग प्रोजेक्टाइल को अच्छी परत और वायस वर्सा में निकाल दिया जाता है।
MichaelHouse

@ Byte56 क्या आप इस "परत" अवधारणा पर विस्तार से बता सकते हैं? या कम से कम इसके बारे में कुछ लिंक करें? मैंने पहले कभी नहीं सुना है।
डेनियल कपलान

अनिवार्य रूप से वे अलग "दुनिया" हैं। एक लेयर की सभी वस्तुएं एक-दूसरे के साथ परस्पर क्रिया करती हैं, लेकिन किसी अन्य परत के साथ इंटरैक्ट नहीं करती हैं। यह टैग (जैसे फ़िल्टरिंग) के साथ, या प्रत्येक परत के लिए पूरी तरह से अलग डेटासेट द्वारा किया जा सकता है।
MichaelHouse

3
एक शब्द में, यह समूहीकरण है। समूह अच्छी गोलियों और केवल बुरे लोगों के खिलाफ टक्कर के लिए जाँच करें। फ्लिक्सल की एक अवधारणा है।
ashes999

3
एक नाइटपिकी डिजाइन नोट: क्या आप चाहते हैं कि 'दोस्ताना-आग' शॉट हिट हो लेकिन कोई नुकसान न हो, या क्या आप चाहते हैं कि वे सहयोगियों को पूरी तरह से अनदेखा करें, संभवतः उनके बजाय दुश्मनों पर प्रहार करने के लिए?
स्टीवन स्टैडनिक

जवाबों:


6

टक्कर फ़िल्टरिंग

एक अधिक मजबूत स्थिति जो कई परतों में तराजू को छानने का उपयोग करने के लिए है, जो कि समूहन के समान नहीं है।

यह प्रत्येक वस्तु को 2 बिटमास्क देकर सबसे अच्छा काम करता है ।

Category
Mask

और केवल टकराव को ट्रिगर करें यदि नीचे सच है।

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

इसके 0xFFFF को मास्क को डिफ़ॉल्ट करने के लिए सबसे आसान है, जिसके परिणामस्वरूप यह सब कुछ से टकराता है। और श्रेणी को 0x0001 पर डिफ़ॉल्ट करें। वस्तुओं के साथ अन्य नकाब में श्रेणियों के साथ टकराव होगा।

यह सोचने का एक और तरीका है कि प्रत्येक वस्तु का एक प्रकार है और सभी प्रकारों की एक सूची है जिसके साथ वह टकरा सकता है। केवल दो वस्तुओं जब एक दूसरे के प्रकार के साथ दोनों टकराती वहाँ एक टक्कर है। आपके पास समान व्यवहार हो सकता है जिसमें मुखौटा के बजाय शत्रुओं की सूची होती है, लेकिन तीव्रता के क्रम में एक मुखौटा।

परिदृश्य आप वर्णन करते हैं

मुझे इस स्थिति में दुश्मनी का फायदा उठाना पसंद है।

तो बोलो हमारे पास है।

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

क्या आप इसे बिट अंकगणित के निम्न स्तर पर विस्तार से समझाने के बजाय इसे वैचारिक रूप से समझाएंगे?
डेनियल कपलान

@tieTYT 5 मिनट में फिर से जाँच करें
ClassicThunder

2

मुझे अपने वर्तमान प्रोजेक्ट (जावा में) में भी यही समस्या थी। एक जोड़े की कोशिश के बाद चार सूची बनाकर इसे हल किया जाता है। यह समाधान जावा और एक 2D गेम के लिए बनाया गया है, लेकिन यह भी, इसी तरह से, जावास्क्रिप्ट में काम करना चाहिए

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())
   ...
}

छद्म कोड, वर्ग गोलियों के लिए समान

यह सबसे अच्छा या सबसे तेज़ समाधान नहीं हो सकता है लेकिन यह पल में आपकी मदद करेगा। मुझे खेद है कि मैं आपको जावास्क्रिप्ट में समाधान नहीं दे सकता, लेकिन मुझे आशा है कि मैं आपकी मदद कर सकता हूं

वैसे मेरी अंग्रेजी सबसे अच्छी नहीं है, लेकिन मुझे आशा है कि आप मेरे स्पष्टीकरण का अनुसरण कर सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.