प्लेटफ़ॉर्म गेम में मैं आसानी से स्विंगिंग को कैसे लागू कर सकता हूं?


9

मैं एक गेम विकसित कर रहा हूं जिसमें खिलाड़ी रस्सियों को स्विंग करने के लिए उपयोग कर सकता है (जैसे स्पाइडरमैन या बायोनिक कमांडो ने किया था) और मुझे इस व्यवहार को लागू करने में समस्या हो रही है। क्या कोई मुझे यह करने में मदद कर सकता है, मेरा मतलब है कि भौतिकी के सूत्र और आदि। अब तक मैं 3 विचारों के साथ आया हूं। एक वसंत का उपयोग कर रहा है, लेकिन इसमें बहुत समय लगता है और कभी-कभी यह उछल जाता है। अन्य दो अगले कदम की गणना करने की कोशिश कर रहे हैं (एक संभावित ऊर्जा की गणना के माध्यम से और एक टोक़ की गणना के माध्यम से) और जब भी अभिनेता स्विंग करने की कोशिश कर रहा होता है, तो दोनों लगभग दुर्घटनाग्रस्त हो जाते हैं।

यहाँ कोड की गणना के लिए मैंने लिखा है:

float dx = Runner->getPosition().x - ancher.x; 
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;

प्रासंगिक (एक रस्सी बनाने पर): 2 डी रस्सी टकराव का पता लगाने
doppelgreener

@JonathanHobbs उस सवाल का जवाब है कि कैसे मैं अपनी रस्सी को एक अपवाद के साथ लागू करने की कोशिश कर रहा हूं, क्योंकि टकराव अवांछित है मेरे मामले में मैं प्रत्येक रस्सी के हिस्से को सेंसर के रूप में सेट करता हूं ताकि वे एक-दूसरे में फंसने के बिना स्वतंत्र रूप से आगे बढ़ सकें।
अली

रस्सी के लिए सरल पेंडुलम के बारे में क्या + कुछ एनिमेशन जो रोपिश को प्रेरित करते हैं? मुझे विश्वास नहीं है कि बायोनिक कमांडो जैसे पुराने खेलों में पेंडुलम के अलावा कुछ और था।
user712092

@user कि पेंडुलम विचार ठीक काम करना चाहिए। लेकिन मेरे मामले में या तो खिलाड़ी के तेज़ आंदोलन या मेरे खराब कार्यान्वयन के कारण, इसने अच्छे परिणाम नहीं दिए।
अली

@ गजट कुछ डिबग ड्रॉइंग करने की कोशिश करें जब तक कि आप इसे सही न कर लें? यह पेंडुलम लाइन टकरावों को प्राप्त करने के लिए बॉक्स 2 डी में पर्याप्त रूप से पतले बॉक्स के रूप में किया जा सकता है (और शायद इसे भौतिकी से बाहर निकालकर हाथ से चला जाए?)।
user712092

जवाबों:


6

यदि आप एक कठोर-स्विंग चाहते हैं, तो रोटेशन-पॉइंट की दूरी स्थिर है, बस रोटेशन बिंदु पर केंद्रित सर्कल पर एक बिंदु के रूप में चरित्र का इलाज करें। उसे एक-आयामी (चक्र के साथ) कोणीय-वेग दें। प्रत्येक फ्रेम कोणीय-त्वरण होना चाहिए accelerationDueToGravity * cos(angleOfPlayerOnCircle)(0-डिग्री की ओर इशारा करते हुए)।

यदि आप चाहते हैं कि रस्सी अधिक लम्बी / छोटी हो, तो आप उपरोक्त योजना का उपयोग कर सकते हैं और बस प्रत्येक फ्रेम में त्रिज्या भिन्न कर सकते हैं।


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

3

कई प्रयासों के बाद मैं बॉक्स 2 डी के साथ गया।

इस अनुकार के लिए सामान्य रूप से दो अनुमोदन हैं या कम से कम मुझे 2 मिले:

  1. एक कुछ चक्र आकृतियों का उपयोग करना है और उन्हें दूर के जोड़ों का उपयोग करके जोड़ना है।
  2. और दूसरा स्वयं श्रृंखला के लिए आयताकार है और फिर उन्हें उल्टे जोड़ों का उपयोग करके संलग्न करें

प्रत्येक सेनारियो में आपको एक एंकर मिला है (जो मेरे मामले में एक स्थिर बॉक्स था)। यदि आप रस्सी भागों का वजन कम करते हैं तो बेहतर है (या तो आप सर्कल आकृतियों या आयताकार आकृतियों का उपयोग करें), उदाहरण के लिए अधिक यथार्थवादी भौतिकी के लिए मैंने उनके घनत्व को 0.1 पर सेट किया है और रस्सी के अंत में जुड़े बॉक्स के लिए मैंने घनत्व 10 का उपयोग किया है।

एक और बात आपको इस बारे में चिंता करने की ज़रूरत है कि आपका रस्सी खंड एक दूसरे पर कैसे प्रतिक्रिया करता है। मैं बस अपनी रस्सी को दृश्य में स्वतंत्र रूप से स्थानांतरित करना चाहता था इसलिए मैंने सभी रस्सी जुड़नार को सेंसर के रूप में चिह्नित किया। आपको अलग-अलग अनुमोदन की आवश्यकता हो सकती है।

अगली बात आपको चिंता करने की है कि आप दुनिया के अपडेट के लिए कितनी पुनरावृत्ति कर रहे हैं: रस्सी के निम्न खंड (शायद 8 सबसे अधिक) के लिए एक उच्च पुनरावृत्ति मूल्य का उपयोग करने की आवश्यकता नहीं है शायद 10/10 जो बॉक्स 2 डी का सुझाव दिया हो पर्याप्त है लेकिन यदि आप उदाहरण के लिए खंड की संख्या बढ़ाते हैं, तो मैंने 30 खंडों की कोशिश की है, कम संख्या में पुनरावृत्तियों के साथ आपकी रस्सी की लंबाई बढ़ रही है, यह अधिक होना चाहिए, इसलिए आपको उन परिस्थितियों को हल करने के लिए 40/40 पुनरावृत्तियों की आवश्यकता होगी।

कुछ परीक्षण के बाद ऐसा लगता है कि बॉक्स 2d को 0.1m से 10m के ऑब्जेक्ट साइज़ वाले दृश्यों के लिए डिज़ाइन किया गया है और बड़े दृश्यों के लिए सुझाए गए अधिकतम आकार के बारे में 50mx50m है। इसलिए आधारभूत इन मापदंडों से मेल खाने के लिए आपको अपनी वस्तु को नीचे रखना होगा। मेरे मामले में मैंने पहली बार पिक्सेल पदों को सीधे बॉक्स 2 डी में पास करने की कोशिश की, लेकिन ऐसा लग रहा था कि दुनिया को रोकने के लिए कुछ गति सीमाएं थीं जैसे कि यह तेज होना चाहिए, इसलिए मुझे सबसे अच्छा परिणाम प्राप्त करने के लिए अपने दृश्य को 64 बार स्केल करना पड़ा। हालाँकि मैंने खुद का परीक्षण नहीं किया लेकिन बॉक्स 2 डी में कुछ सीमाएँ हैं जो आपको बड़े दृश्यों का उपयोग करने से रोकती हैं। उदाहरण के लिए b2Setting.hफ़ाइल में एक परिभाषित मूल्य है जिसे #define b2_maxTranslation 2.0fआप बॉक्स 2 डी सेटिंग्स बदल सकते हैं लेकिन यह अनुशंसित नहीं है।


मुझे नीचा दिखाने के लिए box2d के साथ गलत क्यों है ??
अली

इस सवाल का जवाब नहीं है। कम से कम लिखिए कि आपने बॉक्स 2 डी का उपयोग करके कैसे काम किया।
बंमज़ैक

@bummzack: ठीक है, मैं अपने जवाब में जोड़ दूंगा
Ali1S232

यदि आप इसे अपने उत्तर के रूप में स्वीकार करते हैं, तो आपका प्रश्न यदि त्रुटिपूर्ण है। खंडित रस्सी भौतिकी आपके द्वारा वर्णित की तुलना में बहुत अलग है।
अटैकिंगहोबो

@attackingHobo: quesiton उस समय सही था, लेकिन जब मैंने अपने कोड को box2d में बदल दिया, तो मुझे लगा कि बहुत प्रयास किए बिना मैं खंडित रस्सी भौतिकी को लागू कर सकता हूं। और यह बहुत अलग नहीं है, मेरे प्रश्न को खंडित रस्सी के केवल एक खंड के रूप में सोचें। और लगभग मेरे सभी समाधान box2d के बिना सर्कल स्टाइल रस्सी को लागू करने के तरीके थे।
अली

2

क्या आपने प्लंब लाइन (केंद्र) से कितनी दूर रस्सी पर आधारित स्विंग आंदोलन की गति को धीमा माना है?


रस्सी के सभी 3 स्वीकृत लंबाई के लिए मापदंडों में से एक है जो मैंने स्विंगिंग गति की गणना करने के लिए उपयोग किया है। लेकिन मैं इस बात की गारंटी नहीं दे सकता कि मैंने इसका सही इस्तेमाल किया है। मैंने अभी कुछ भौतिक गणनाएँ की हैं और खेल के लिए उनके हल किए गए संस्करण को लागू किया है।
अली

केंद्र से और अधिक दूर, रस्सी के झूलने के अगले आंदोलन से पहले की देरी। आप देरी के ABSolute मान को 0.28 से कुछ गुणा कर सकते हैं (आपको इसके साथ प्रयोग करना होगा)।
रैंडोल्फ रिचर्डसन

जब आप अगले चरण की गणना कर रहे हैं, तो मुझे वह नहीं मिल सकता है, जब मैं अगले चरण की गणना कर रहा हूं, मेरे पास डेल्टा के लिए कुछ निरंतर मूल्य हैं, और मेरे पास सभी मापदंडों का उपयोग करें (जैसे कि प्रीवियस गति, प्रबल स्थिति, रस्सी की लंबाई, आदि) की गणना करना। नया वेग, और फिर इस वेग को नई स्थिति उत्पन्न करने के लिए अंतिम स्थिति में डेल्टा_टाइम से गुणा करें। यदि आपका मतलब कुछ और है तो कृपया अपने उत्तर में पूर्ण विवरण प्रदान करें।
अली

1

जब खिलाड़ी रस्सी की लंबाई से अधिक होता है, तो खिलाड़ी को तुरंत उस दूरी के बराबर बल के साथ पीछे धकेल दिया जाएगा जहां से वह गुजरा है। यह बिना भावुक हुए काम करना चाहिए, और खिलाड़ी को सहज महसूस करना चाहिए। हालांकि आपको अपने खेल के लिए सर्वोत्तम परिणाम प्राप्त करने के लिए अपनी भौतिकी को ट्विस्ट करना पड़ सकता है।

जब रस्सी जुड़ी होती है। एक maxLengthमान सहेजें ।

प्रत्येक अद्यतन, और के distanceबीच की जाँच playerकरेंattachPoint

यदि यह सामान्य रूप distanceसे maxLengthअपडेट से कम है , तो रस्सी से कोई प्रभाव नहीं पड़ता है।

यदि दूरी से अधिक है maxLength, तो खिलाड़ी normalसे ढूंढें attachPointdistanceऔर के बीच अंतर प्राप्त करें maxLength। में जोड़ें playerVelocity, normalअंतर से गुणा करें।

छद्म कोड:

dx = (attachPoint.x - player.x)
dy = (attachPoint.y - player.y)

distance = sqrt(dx*dx+dy*dy);

if (distance > maxDistance)
{
    float dx1 = dx / distance * maxDistance;
    float dy1 = dy / distance * maxDistance;
    v.x += (dx1 - dx) / dt;
    v.y += (dy1 - dy) / dt;
}

playerVel += v * dt;

ऐसा कोड है जिसे मैंने आपके उत्तर में संपादित किया है (इसके बारे में खेद है लेकिन मुझे इसे जोड़ने के लिए कोई स्थान बेहतर नहीं मिला) जिस पर आप सुझाव दे रहे हैं?
अली

मैंने संपादन को मंजूरी दे दी है, और हाँ मुझे लगता है कि यह होना चाहिए। हालाँकि मैंने पहले रस्सी भौतिकी का उपयोग किया था और एक ही काम करने के लिए बहुत अधिक जटिल तरीका इस्तेमाल किया था, क्योंकि मुझे पूरी तरह से यकीन नहीं है कि यह कोड ठीक से काम करेगा, लेकिन मुझे लगता है कि इसे करना चाहिए, और यहां तक ​​कि अगर यह नहीं करता है, तो यह आपको 95 मिलता है उधर का%।
अटैकिंगहोबो

कुछ कोशिशों के बाद मुझे लगता है कि मैं इस मुद्दे के लिए box2d की कोशिश करूँगा और वैसे आपको उस कोड को बदलना होगा ताकि आपके पास dx = player.x - attachpoint.xऔर हो dy = player.y - attachpoint.y
अली

1

यदि आप http://www.cocos2d-iphone.org/archives/1112 को देखते हैं तो रस्सी के एक कठोर शरीर के साथ रस्सी के अंत तक जुड़ा हुआ है। यह भौतिकी इंजन के लिए Box2D का उपयोग करता है। यदि आप स्रोत कोड को देखते हैं, तो मुझे यकीन है कि आप इसे अपनी पसंद की किसी भी भाषा में लागू कर सकते हैं।

साथ ही, रोप प्रश्न का उपरोक्त लिंक मेरा है और ऊपर दिए गए यह डेमो (लिंक प्रदान) वास्तव में मदद करता है।

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