প্ল্যাটফর্মার গেমটিতে আমি কীভাবে সহজেই সুইংিং বাস্তবায়ন করতে পারি?


9

আমি এমন একটি গেমটি বিকাশ করছি যাতে খেলোয়াড় দুলতে দড়ি ব্যবহার করতে পারে (স্পাইডারম্যান বা বায়োনিক কমান্ডো যা করেছিল ঠিক তেমন ) এবং এই আচরণটি বাস্তবায়নে আমার সমস্যা হচ্ছে। কীভাবে কেউ আমাকে এটি করতে সাহায্য করতে পারে, তার অর্থ আমি পদার্থবিজ্ঞানের সূত্র এবং ইত্যাদি now এখন পর্যন্ত আমি 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 ডি দড়ি দড়ি সনাক্তকরণ
ডপপেলগ্র্রিনিয়ার

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

দড়ির জন্য সহজ দুল সম্পর্কে কী? আমি বিশ্বাস করি না যে বায়োনিক কমান্ডোর মতো পুরানো গেমের দুল ছাড়া অন্য কিছু ছিল।
ব্যবহারকারী 712092

@ ব্যবহারকারী যে দুলক ধারণা ঠিক কাজ করা উচিত। তবে আমার ক্ষেত্রে প্লেয়ারের দ্রুত গতি বা আমার খারাপ প্রয়োগের কারণে এটি ভাল ফলাফল দেয় নি।
Ali1S232

@ গেজেট আপনি ঠিক না হওয়া পর্যন্ত কিছু ডিবাগ অঙ্কন করার চেষ্টা করছেন? এই দুলটি লাইনটি সংঘর্ষের জন্য বক্স 2 ডি-তে পর্যাপ্ত পাতলা বাক্স হিসাবে করা যেতে পারে (এবং সম্ভবত এটি পদার্থবিজ্ঞান থেকে বাদ পড়ে এবং হাত দিয়ে সরানো?)।
ব্যবহারকারী 712092

উত্তর:


6

আপনি যদি একটি অনমনীয়-দুল চান, সুতরাং ঘূর্ণন-পয়েন্টের দূরত্বটি স্থির থাকে, কেবল ঘূর্ণন বিন্দুকে কেন্দ্র করে একটি বৃত্তের বিন্দু হিসাবে অক্ষরটিকে বিবেচনা করুন। তাকে এক-মাত্রিক (বৃত্ত বরাবর) কৌণিক-বেগ দিন। প্রতিটি ফ্রেমের কৌণিক-ত্বরণ হওয়া উচিত accelerationDueToGravity * cos(angleOfPlayerOnCircle)(ডানদিকে 0-ডিগ্রি পয়েন্টিং সহ)।

আপনি যদি দড়িটি আরও দীর্ঘ / সংক্ষিপ্ত করতে চান তবে আপনি উপরের স্কিমটি ব্যবহার করতে পারেন এবং প্রতিটি ফ্রেমের ব্যাসার্ধকে আলাদা করতে পারেন।


আপনার উত্তরটি আমার দ্বিতীয় চেষ্টা ছিল তবে এটি আরও বেশি গতিতে সরে যায় যে এটি আমার প্রশ্নটি সম্পাদন করবে এবং আমার কোড যুক্ত করবে সম্ভবত সমস্যাটি আপনি কোথায় তা স্পষ্ট করতে পারেন।
Ali1S232

3

অনেক চেষ্টার পরে আমি বক্স 2 ডি নিয়ে গেলাম।

এই সিমুলেশনটির জন্য উত্পন্নভাবে দুটি অ্যাপ্রোস রয়েছে বা কমপক্ষে আমি 2 পেয়েছি:

  1. একটি হ'ল কয়েকটি বৃত্তের আকার ব্যবহার করা এবং দূরবর্তী জয়েন্টগুলি ব্যবহার করে এগুলি সংযুক্ত করা।
  2. এবং অন্যটিটি হ'ল চেইনের জন্য আয়তক্ষেত্রগুলি তৈরি করা এবং তারপরে রিভলিউট জোড়গুলি ব্যবহার করে এগুলি সংযুক্ত করা

প্রতিটি সেনারিওতে আপনার একটি অ্যাঙ্কার থাকতে হবে (যা আমার ক্ষেত্রে একটি স্ট্যাটিক বাক্স ছিল)। যদি আপনি দড়ি অংশের ওজন কম করেন (তবে আপনি বৃত্তের আকার বা আয়তক্ষেত্র আকারগুলি ব্যবহার করেন) উদাহরণস্বরূপ আরও বাস্তববাদী পদার্থবিজ্ঞানের জন্য আমি তাদের ঘনত্বকে 0.1 এ সেট করেছি এবং দড়ির শেষে সংযুক্ত বাক্সের জন্য আমি ঘনত্ব 10 ব্যবহার করেছি।

আপনার দড়ি বিভাগটি একে অপরের সাথে কীভাবে প্রতিক্রিয়া প্রকাশ করে সে সম্পর্কে আপনাকে চিন্তিত হওয়া দরকার। আমি কেবল চাইছিলাম যে আমার দড়িটি দৃশ্যে অবাধে সরানো হোক তাই আমি সমস্ত দড়ি ফিক্সচারকে সেন্সর হিসাবে চিহ্নিত করেছি। আপনার বিভিন্ন পদ্ধতির প্রয়োজন হতে পারে।

পরের বিষয়টির জন্য আপনাকে চিন্তিত হওয়াটি হ'ল আপনি বিশ্ব আপডেটে যে সংখ্যাটি পুনরাবৃত্তি করছেন তা হ'ল: দড়ি কম অংশের জন্য (সম্ভবত 8 টি) উচ্চ পুনরাবৃত্তির মান ব্যবহার করার প্রয়োজন নেই সম্ভবত ১০০ বাক্স যা নিজেই প্রস্তাব করেছে যথেষ্ট তবে আপনি যদি বিভাগটির সংখ্যা বৃদ্ধি করেন উদাহরণস্বরূপ আমি 30 টি বিভাগে চেষ্টা করেছি, কম সংখ্যক পুনরাবৃত্তির সাথে আপনার দড়িটি এটির দৈর্ঘ্যটি আরও বেশি হওয়া উচিত বলে মনে হয়, সুতরাং সেই পরিস্থিতিগুলি সমাধান করার জন্য আপনার সম্ভবত 40/40 পুনরাবৃত্তি প্রয়োজন।

কিছু পরীক্ষার পরে মনে হচ্ছে বক্স 2 ডি 0.1m থেকে 10 মি অবজেক্ট আকারের দৃশ্যের জন্য ডিজাইন করা হয়েছে এবং বড় দৃশ্যের জন্য প্রস্তাবিত সর্বাধিক আকারটি প্রায় 50mx50 মিটার সমীকরণীয়। সুতরাং মৌলিক আপনাকে এই পরামিতিগুলি মেলে আপনার অবজেক্টটি স্কেল করতে হবে। আমার ক্ষেত্রে আমি প্রথমে পিক্সেল পজিশনগুলি সরাসরি বক্স 2 ডি তে পাস করার চেষ্টা করেছি তবে মনে হয়েছিল বিশ্বের দ্রুত গতিতে বাধা দেওয়ার মতো কিছু গতি সীমাবদ্ধতা রয়েছে, সুতরাং সেরা ফলাফলের জন্য আমার দৃশ্যটি প্রায় 64 বার স্কেল করতে হয়েছিল। যদিও আমি নিজে পরীক্ষা করে নিইনি বক্স 2 ডি-তে কিছু সীমাবদ্ধতা রয়েছে যা আপনাকে বৃহত্তর দৃশ্যাবলী ব্যবহার থেকে বিরত করে। উদাহরণস্বরূপ b2Setting.hফাইলে একটি নির্ধারিত মান রয়েছে #define b2_maxTranslation 2.0fআপনি বক্স 2 ডি সেটিংস পরিবর্তন করতে পারেন তবে এটি প্রস্তাবিত নয় বলে মনে হয়।


আমাকে ডাউনটাতে আয় করতে কেন বক্স 2 ডি এর সাথে ভুল হচ্ছে ??
Ali1S232

এটি প্রশ্নের উত্তর দেয় না। অন্তত লেখার এ কিভাবে আপনি এটা Box2D ব্যবহার কাজ করেছেন।
বাম্মজ্যাক

@ অ্যালবামজ্যাক: ঠিক আছে আমি আমার উত্তরে এটি যুক্ত করব
Ali1S232

যদি আপনি এটিকে আপনার উত্তর হিসাবে গ্রহণ করেন তবে আপনার প্রশ্ন যদি ত্রুটিযুক্ত হয়। খণ্ডিত দড়ি পদার্থবিজ্ঞান আপনি যে বর্ণনা করেছেন তার চেয়ে অনেক আলাদা।
অ্যাটাকিংহোব

@ অ্যাটাকিংহোব: সেই সময়টি অনুসন্ধানটি সঠিক ছিল তবে যখন আমি আমার কোডটি বক্স 2 ডি তে রূপান্তরিত করেছি তখন আমি খুব চেষ্টা না করেই বুঝতে পেরেছিলাম আমি সেগমেন্টেড দড়ি পদার্থবিজ্ঞান বাস্তবায়ন করতে পারি। এবং এটি খুব আলাদা নয়, আমার প্রশ্নটিকে কেবল একটি খণ্ড দড়ির একাংশ হিসাবে ভাবেন। এবং প্রায় আমার সমস্ত সমাধান হ'ল বক্স 2 ডি ছাড়াই বৃত্ত শৈলীর দড়িটি প্রয়োগ করার উপায়।
Ali1S232

2

নদীর গভীরতানির্ণয় রেখাটি (কেন্দ্র) থেকে দড়িটি কতটা দূরে রয়েছে তার উপর নির্ভর করে আপনি কী সুইং চলাচলের গতি কমিয়ে আনার বিষয়টি বিবেচনা করেছেন?


সমস্ত দড়ির 3 টি অ্যাপ্রোচ দৈর্ঘ্যের জন্য আমি দুলানোর গতি গণনা করতে ব্যবহার করেছি এমন একটি পরামিতি। তবে আমি গ্যারান্টি দিতে পারি না যে আমি এটি সঠিকভাবে ব্যবহার করেছি। আমি কিছু শারীরিক গণনা করেছি এবং তাদের সমাধান হওয়া সংস্করণটি গেমটিতে প্রয়োগ করেছি।
Ali1S232

কেন্দ্র থেকে আরও দূরে, দড়ির পরবর্তী আন্দোলনের আগে দেরি বেশি। আপনি বিলম্বের ABSolve মানকে 0.28 এর মতো কিছু দিয়েও গুণতে পারেন (আপনাকে এটি ব্যবহার করতে হবে)।
র‌্যান্ডল্ফ রিচার্ডসন

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

1

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

দড়ি সংযুক্ত করা হয় যখন। একটি maxLengthমান সংরক্ষণ করুন ।

প্রতিটি আপডেট, এর distanceমধ্যে এবং এর মধ্যে পরীক্ষা playerকরুনattachPoint

সাধারণত যদি আপডেটের distanceচেয়ে কম হয় তবে maxLengthদড়ি থেকে কোনও প্রভাব নেই।

দূরত্ব তার চেয়ে অনেক বেশী হয় তাহলে maxLength, এটি normalথেকে attachPointপ্লেয়ার। distanceএবং এর মধ্যে পার্থক্য পান 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;

সুতরাং আমি আপনার উত্তরটিতে সম্পাদিত কোডটি (সে সম্পর্কে দুঃখিত তবে এটি যুক্ত করার চেয়ে ভাল কোনও জায়গা আমি খুঁজে পাইনি) আপনি যেই পরামর্শ দিচ্ছেন?
Ali1S232

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

কিছু চেষ্টা করার পরে আমি অনুমান করি যে আমি এই ইস্যুটির জন্য বক্স 2 ডি চেষ্টা করে যাব এবং আপনাকে সেই কোডটি পরিবর্তন করতে হবে যাতে আপনার dx = player.x - attachpoint.xএবং dy = player.y - attachpoint.y
Ali1S232

1

আপনি যদি http://www.cocos2d-iphone.org/archives/1112 দেখুন তবে দড়িটির শেষের সাথে একটি দৃ a় শরীরের সাথে একটি দড়ি প্রয়োগ করা হচ্ছে। এটি পদার্থবিজ্ঞানের ইঞ্জিনের জন্য বক্স 2 ডি ব্যবহার করে। আপনি যদি সোর্স কোডটি দেখে থাকেন তবে আমি নিশ্চিত যে আপনি এটি আপনার পছন্দ মতো কোনও ভাষায় প্রয়োগ করতে পারবেন।

এছাড়াও, দড়ি প্রশ্নের উপরের লিঙ্কটি আমার এবং উপরের এই ডেমোটি (সরবরাহিত লিঙ্ক) সত্যই সহায়তা করেছে।

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