সংঘর্ষের আয়তক্ষেত্রের প্রতিক্রিয়া


10

একাধিক আয়তক্ষেত্রের সাথে সংঘর্ষে চলনযোগ্য আয়তক্ষেত্র পেতে আমার অসুবিধা হচ্ছে।

আমি এসএফএমএল ব্যবহার করছি এবং এটিতে একটি কার্যকর ফাংশন রয়েছে intersectsযা 2 টি আয়তক্ষেত্র নেয় এবং ছেদগুলি ফিরে দেয়। আমার একটি আয়তক্ষেত্র পূর্ণ ভেক্টর রয়েছে যা আমি চাই যে আমার চলমান আয়তক্ষেত্রের সাথে সংঘর্ষ ঘটুক। আমি নিম্নলিখিত কোডটি ব্যবহার করে এর মাধ্যমে লুপ করছি (পি মুভমেন্টাল আয়তক্ষেত্র)।

IsCollidingWithএকটি বিল ফেরত দেয় তবে ছেদগুলি intersectsকাজ করার জন্য এসএফএমএলও ব্যবহার করে।

while(unsigned i = 0; i!= testRects.size(); i++){
   if(p.IsCollidingWith(testRects[i]){
        p.Collide(testRects[i]);
   }
}

এবং আসল Collide()কোড:

void gameObj::collide( gameObj collidingObject ){

 printf("%f %f\n", this->colliderResult.width, this->colliderResult.height);

if (this->colliderResult.width < this->colliderResult.height) {
    // collided on X
    if (this->getCollider().left < collidingObject.getCollider().left ) {
        this->move( -this->colliderResult.width , 0);
    }else {
        this->move( this->colliderResult.width, 0 );
    }

}

if(this->colliderResult.width > this->colliderResult.height){
    if (this->getCollider().top < collidingObject.getCollider().top ) {
        this->move( 0, -this->colliderResult.height);
    }else {     
        this->move( 0, this->colliderResult.height );
    }

}

এবং IsCollidingWith()কোডটি হ'ল:

bool gameObj::isCollidingWith( gameObj testObject ){
if (this->getCollider().intersects( testObject.getCollider(), this->colliderResult )) {
    return true;
}else {
    return false;
}

Rectদৃশ্যে যখন 1 জন থাকে তখন এটি কাজ করে। তবে Rectএকবারে আরও দুটি সংঘর্ষের কাজ করার সময় যখন এটি একের বেশি হয় তখন এটি সমস্যার কারণ হয়ে দাঁড়ায়।

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

পরিশেষে, নীচের চিত্রটি আমার সমস্যাটি সুন্দরভাবে বর্ণনা করেছে বলে মনে হচ্ছে:

একাধিক অন্যান্য আয়তক্ষেত্রের সাথে আয়তক্ষেত্রের সংঘর্ষ


ভিডিও লিঙ্কটি নষ্ট হয়ে গেছে।
জিয়াওচুয়ান ইউ

হয় colliderবস্তু দ্বারা ফিরে this->getCollider()দ্বারা আপডেট this->move()??
জিয়াওচুয়ান ইউ

আপনি আরও কিছু তথ্য যোগ করতে পারেন দয়া করে? ঠিক সমস্যা কি? ইউটিউব ভিডিওটি অনুমানযোগ্য আচরণ দেখায় এবং দৃশ্যে আর একটি মাত্র আয়তক্ষেত্র রয়েছে।
ওয়্যাকিদেব

উত্তর:


3

আপনার ইমেজ উত্তল আকারগুলি - বিশেষত আয়তক্ষেত্রগুলি - ফ্লোরের মতো সমতল পৃষ্ঠ অনুকরণ করার চেষ্টা করার সাথে অনেক সমস্যার একটি চিত্রিত করে। অ্যালগরিদম চরিত্রগুলি মেঝে তৈরির আকারের অভ্যন্তরের প্রান্তগুলিতে আটকে যায়।

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

এর চেয়ে সহজতর - এবং আরও পারফরম্যান্ট - যা হতে পারে তা হ'ল পরিবর্তে আপনার বিশ্বের প্রান্তগুলির একটি তালিকা তৈরি করা। এটি হল আপনার বাক্সগুলি মেঝে তৈরি করার জন্য, একটি পতাকা সেট করুন যা নির্দেশ করে যে কেবল তাদের শীর্ষ প্রান্তটি আসলে সংঘর্ষযোগ্য এবং তারপরে অন্যান্য প্রান্তগুলির সাথে সংঘর্ষগুলি উপেক্ষা করুন। আপনি এটির জন্য এসএফএমএল-এর সংঘর্ষের রুটিন ব্যবহার করতে সক্ষম হবেন না, তবে সত্যই বাক্সের সংঘর্ষ সম্ভবত কোডের সবচেয়ে সহজতম বিট যা আপনি কোনও খেলায় লিখবেন। আপনার বিশ্ব যদি গ্রিডের সাথে সংযুক্ত থাকে তবে এই কৌশলটি ভালভাবে কাজ করে। আমি সেই কৌশলটির জন্য দুর্দান্ত মেটানেট টিউটোরিয়াল (http://www.metanetsoftware.com/technique.html/) পরীক্ষা করে দেখব।

আপনার মতো সাধারণ 2 ডি প্ল্যাটফর্মার গেমটি তৈরির চেষ্টা করে আপনি আরও অনেক সমস্যার মধ্যে চলে যাচ্ছেন। এখন পর্যন্ত, এর জন্য আমি ল্যাটেলটি দেখেছি সেরা উত্স হ'ল নিম্নলিখিতটি, যা আপনার পড়া উচিত এবং তারপরে আবার পড়ুন:

http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/


1

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


+1, আমি এখানে এটি সম্পর্কে এখানে লিখেছিলাম: গেমদেব.স্ট্যাকেক্সেঞ্জার.কমেসেশনস
মার্কাস ভন ব্রডি

0

আমার মনে হয় না যে 2 টি সংঘর্ষ গণনা করা একটি সমস্যা, কেবল একটি পারফরম্যান্স ইস্যু। সংঘর্ষটি সঠিকভাবে পরিচালনা করার জন্য এটি দুবার পরীক্ষা করতে হতে পারে। আপনার ডায়াগ্রামটি ব্যবহার করে ভাবুন যদি A কে প্রথমে বি এর বিরুদ্ধে পরীক্ষা করা হয়, তবে এটি অন্য বাক্সগুলির বিরুদ্ধেও পরীক্ষা করা দরকার এবং অন্যটির সাথে ভালভাবে সংঘর্ষ হতে পারে।

আশা করি যে সহায়ক?


0

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

bool collided = true;
while(collided) {
   collided = false
   while(unsigned i = 0; i!= testRects.size(); i++){
      if(p.IsCollidingWith(testRects[i]){
         collided = true
         p.Collide(testRects[i]);
      }
   }
}

মনে রাখবেন যে এমন পরিস্থিতি রয়েছে যেখানে এটি একটি অসীম লুপকে নিয়ে যাবে (এমন পরিস্থিতি সম্পর্কে ভাবুন যেখানে বাক্সটি একটি সংঘর্ষের বাইরে ফেলে অন্য সংগ্রহের ফলে বেরিয়ে আসে এবং বাক্সটিকে সংঘর্ষের বাইরে নিয়ে যাওয়া এটিকে আগের মতো একই সংঘর্ষে নিয়ে যায়)

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