चेस खेल में खिलाड़ी के लिए सीधी रेखा में शत्रु आंदोलन


10

मैं एक ऐसा खेल बना रहा हूँ जहाँ दुश्मन बेतरतीब ढंग से एक नक्शे पर घूमते हैं और फिर हर फ्रेम में एक यादृच्छिक गति से खिलाड़ी की ओर बढ़ते हैं। नक्शे में कोई बाधा नहीं है, इसलिए दुश्मनों को हमेशा एक सीधी रेखा में चलना चाहिए। मैंने मूवमेंट फंक्शन को कुछ बार लिखा लेकिन कोई फर्क नहीं पड़ता कि दुश्मन हमेशा 0, 45, 90, 135, 180, 225, 270, 315 एंगल मारते हैं लेकिन कभी सीधी रेखा नहीं। यहाँ कोड का एक उदाहरण है:

    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.wikipedia.org/wiki/Bresenham%27s_line_al एल्गोरिदम) की तरह एल्गोरिथ्म का उपयोग करना चाहिए, लेकिन लागू करने के मेरे प्रयासों में एक ही मुद्दा है। मैं दुश्मनों को एक सीधी रेखा में कैसे घुमाऊं?

जवाबों:


17

ब्रेशेनहैम की रेखा एल्गोरिथ्म फ़्लोटिंग पॉइंट ऑपरेशंस का उपयोग किए बिना फास्ट ड्राइंग लाइनों के लिए विकसित की गई थी (पूर्णांक ऑपरेशन तेज हैं)। यह बहुत दिलचस्प ऐतिहासिक है, लेकिन एक खेल के लिए बहुत अच्छा समाधान नहीं है (विशेष रूप से क्योंकि आप गति को निर्दिष्ट नहीं कर सकते हैं)।

2 डी आंदोलन करते समय हमेशा वैक्टर का उपयोग करें। यह आपके लिए सभी सामान करेगा। कभी-कभी बीजगणित सिर्फ अद्भुत होता है।

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

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

निश्चित रूप से आपकी लक्ष्य भाषा के लिए कुछ वेक्टर 2 डी वर्ग होंगे।


यह पूरी तरह से काम किया। सामान्यीकृत वह फ़ंक्शन था जिसकी मुझे आवश्यकता थी। धन्यवाद।
user4761

9

क्या आप हर फ्रेम की गणना कर रहे हैं? आपका कोड या तो x_speed या y_speed को एक यादृच्छिक संख्या और दूसरे को शून्य (या डिफ़ॉल्ट) पर सेट करता है। मान लीजिए कि दुश्मन 0, 0 पर है और खिलाड़ी 20 पर है। 10. ऐसा लग रहा है कि यह x_speed को प्रत्येक रैंडम नंबर पर सेट करेगा और दुश्मन को तब तक दाईं ओर ले जाएगा, जब तक वह 10, 0. पर न हो जाए, तब दुश्मन हिल जाएगा या तो प्रत्येक फ्रेम x या y तो ऐसा लगेगा कि वह 45 डिग्री के कोण पर 10, 10 तक चलता है।

नोटाबिन की वेक्टर व्याख्या सही है लेकिन यहां बताया गया है कि यह कैसे काम करता है। Vec2d में एक x और y घटक होगा। ऊपर दिए गए उदाहरण में, खिलाड़ीपोस - दुश्मनपोस आपको (20, 10) का वेक्टर देगा। normalize () वेक्टर को बदलता है ताकि लंबाई 1. वर्तमान में लंबाई sqrt (20 * 20 + 10 * 10) है। जो कि लगभग 22.36068 है। X और Y दोनों को इस संख्या से विभाजित करता है, आपको दिशा के लिए (0.89443, 0.44721) देता है, जो कि एक वेक्टर है जो दुश्मन से खिलाड़ी की ओर इशारा करता है। इसकी लंबाई 1. अपनी यादृच्छिक गति से गुणा करें जो आप चाहते हैं।

हालाँकि मैं प्रत्येक फ्रेम में एक नई यादृच्छिक गति की गणना नहीं करूंगा। आप शायद केवल एक बार यादृच्छिक गति सेट करना चाहते हैं, या एक प्रारंभिक गति और एक लक्ष्य गति है जो आपको प्रत्येक फ्रेम के करीब मिलती है। यह आपके दुश्मन के लिए शुरू में 100 मील प्रति घंटे की गति का मतलब नहीं है, तो एक फ्रेम के लिए 50 मील प्रति घंटे और अगले के लिए 200 मील प्रति घंटे।

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;

अच्छा स्पष्टीकरण और परिवर्धन जेसन, धन्यवाद। मुझे आपका त्वरण कार्य पसंद है
नोटबिन

उस दायरे में यादृच्छिक () एक टाइपो था। आपके द्वारा लिखे गए नोटबैन के साथ आपके स्पष्टीकरण और कोड ने मुझे खेल को काम करने में मदद की। धन्यवाद।
user4761
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.