আমি কীভাবে আমার প্ল্যাটফর্মারের চরিত্রটি প্রাচীরের টাইলগুলিতে কাটানো থেকে রোধ করব?


9

বর্তমানে, টেরিনের জন্য টাইলস সহ আমার একটি প্ল্যাটফর্মার রয়েছে (গুহাটির গল্প থেকে নেওয়া গ্রাফিক্স)। গেমটি XNA ব্যবহার করে স্ক্র্যাচ থেকে লেখা হয়েছে, সুতরাং আমি কোনও বিদ্যমান ইঞ্জিন বা পদার্থবিজ্ঞানের ইঞ্জিন ব্যবহার করছি না।

এই উত্তরে বর্ণিত টাইলের সংঘর্ষগুলি ঠিক ঠিক বর্ণনা করা হয়েছে (আয়তক্ষেত্র এবং চেনাশোনাগুলির জন্য সাধারণ SAT সহ) এবং সবকিছু ঠিকঠাক কাজ করে।

প্লেয়ারটি যখন পড়ে / লাফিয়ে ঝাঁপিয়ে পড়ে দেয়ালে চলে যায় cept সেক্ষেত্রে তারা একটি টাইল ধরবে এবং ভাবতে শুরু করবে যে তারা কোনও তল বা ছাদে আঘাত করেছে যা আসলে সেখানে নেই।

চরিত্র ধরার চিত্র

এই স্ক্রিনশটে, প্লেয়ারটি ডানদিকে চলেছে এবং নীচে নেমে যাচ্ছে। সুতরাং চলাফেরার পরে, সংঘর্ষগুলি চেক করা হয় - এবং প্রথমত, এটি দেখা যায় যে প্লেয়ার চরিত্রটি মেঝে থেকে 3 3rd টাইলের সাথে সংঘর্ষ করছে এবং উপরের দিকে ধাক্কা দিচ্ছে। দ্বিতীয়ত, তিনি তার পাশের টাইলের সাথে সংঘর্ষে পড়েছেন এবং পাশের দিকে ধাক্কা মেরেছিলেন - শেষ ফলটি প্লেয়ারের চরিত্র বলে মনে হয় তিনি মাটিতে আছেন এবং পড়ছেন না, এবং যতক্ষণ না টাইলের মধ্যে সে চালাচ্ছে ততক্ষণ টাইলের উপর 'ক্যাচ' রাখবে ।

আমি এর পরিবর্তে উপর থেকে নীচে টাইলগুলি সংজ্ঞায়িত করে এটি সমাধান করতে পারলাম, যা তাকে সহজেই পড়ে যায়, তবে তারপরে বিপরীত ঘটনা ঘটে এবং সে প্রাচীরের বিরুদ্ধে উপরের দিকে ঝাঁপ দেওয়ার সময় সেখানে না থাকে এমন একটি সিলিংটি মারবে।

এর সমাধানের ক্ষেত্রে আমার কীভাবে যোগাযোগ করা উচিত, যাতে প্লেয়ারের চরিত্রটি ঠিক যেমন প্রাচীরের পাশ দিয়ে পড়ে যায় তেমন?


এই প্রশ্নের অনুরূপ? gamedev.stackexchange.com/questions/14486/...
MichaelHouse

@ বাইট 56 প্রশ্নটি একই নয় তবে এর উত্তরটি সাহায্য করতে পারে।
ডপপেলগ্র্রেনার

একটি দ্রষ্টব্য: উত্তরগুলির সাথে পরীক্ষার জন্য আমার গত কয়েক সপ্তাহের মধ্যে খুব কম সময় ছিল। আমি @ বাইট 5 লিঙ্কযুক্ত প্রশ্নের উত্তর হিসাবে বিশ্ব সংঘর্ষের রেজোলিউশন কার্যকর করেছি, যার উচ্চ গতিতে পৃথক বাগ রয়েছে এবং এখনও এই প্রশ্নের উত্তরগুলি চেষ্টা করতে সক্ষম হয়নি। আমি যখন চেষ্টা করতে পারি তখন তাদের চেষ্টা করব এবং হয় যখনই পারি উত্তরটি গ্রহণ করতে পারি বা আমি নিজেই সমাধান করি তবে আমার নিজের পোস্ট করুন।
ডপপেলগ্রিনিয়ার

উত্তর:


8

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

টাইল মানচিত্রের সরল পাসের সময় প্রতিটি প্রান্তের পতাকা হিসাবে বহির্মুখী প্রান্তগুলি সংরক্ষণ করে আপনি কোন প্রান্তগুলি বৈধ তা নির্ধারণ করতে পারেন। সংঘর্ষ শনাক্ত করার সময় সংলগ্ন টাইলগুলি পরীক্ষা করে আপনি রানটাইমে এটি করতে পারেন।

এই একই প্রযুক্তির আরও উন্নত সংস্করণ রয়েছে যা অ-বর্গক্ষেত্র টাইলগুলিকে সমর্থন করা সহজ এবং দ্রুত করে তোলে।

আমি আপনাকে নীচের নিবন্ধগুলি পড়ার পরামর্শ দিচ্ছি। তারা আধুনিক প্ল্যাটফর্মারগুলিতে (গুহার গল্পের মতো) বেসিক ফিজিক্স এবং সংঘর্ষ সনাক্তকরণের জন্য শালীন সহজ ভূমিকা're আপনি যদি আরও পুরাতন-স্কুল মারিও অনুভূতির জন্য যাচ্ছেন তবে চিন্তার আরও কয়েকটি কৌশল আছে তবে তাদের বেশিরভাগের মধ্যে সংঘর্ষের পরিবর্তে জাম্পিং এবং অ্যানিমেশনগুলি পরিচালনা করা জড়িত।

http://www.metanetsoftware.com/technique/tutorialA.html http://www.metanetsoftware.com/technique/tutorialB.html


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

হ্যাঁ, কেবল একটি আয়তক্ষেত্রের সংঘর্ষ করুন। কেবল সরলীকৃত কারণ লাইনটি সর্বদা অক্ষ-সংযুক্ত থাকে। আপনি কেবল আপনার বাক্স-বাক্স চেকটি পচন করতে পারেন।
শান মিডলডিচ

5

এই আদেশ আমি জিনিস করতে হবে ....

1) অক্ষরের বর্তমান এক্স, ওয়াই সংরক্ষণ করুন

2) এক্স দিকটি সরান

3) টাইলের ডেটা পেয়ে অক্ষরের সমস্ত কোণটি পরীক্ষা করুন এবং নিম্নলিখিতটি করে এটি শক্ত কিনা তা পরীক্ষা করুন: (এক্স এবং ওয়াই অক্ষরের অবস্থান)

  • উপরের বাম জন্য: তল (এক্স / টাইলউইথ), মেঝে (ওয়াই / টাইলহাইট);
  • উপরের ডানদিকে: তল ((এক্স + চরিত্রের প্রস্থ) / টাইলউইথ), তল (ওয়াই / টাইলহাইট);
  • নীচে বাম জন্য: তল (এক্স + / টাইলউইথ), মেঝে ((ওয়াই + চরিত্রহাইট) / টাইলহাইট);
  • নীচের ডানদিকে: তল ((এক্স + চরিত্রের প্রস্থ) / টাইলউইথ), মেঝে ((ওয়াই + চরিত্রহাইট) / টাইলহাইট)

... মানচিত্রের ডেটা থেকে সঠিক টাইল ডেটা পেতে

৪) যদি কোনও টাইলস শক্ত হয় তবে আপনার সংরক্ষণ করা এক্স পুনরুদ্ধার করে X কে সর্বোত্তম অবস্থানে নিয়ে যেতে হবে ...

  • আপনি যদি বাম দিকে সরে থাকেন তবে: এক্স = ফ্লোর (এক্স / টাইলউইথ) * টাইলউইথ;
  • যদি আপনি ডানদিকে চলে যান: এক্স = ((ফ্লোর ((এক্স + চরিত্রের প্রস্থ) / টাইলউইথ)) + 1) * টাইলউইথ) - চরিত্রের প্রস্থ;

5) Y ব্যবহার করে 2-4 পুনরাবৃত্তি করুন

আপনার চরিত্রটি যদি টাইলের চেয়ে দীর্ঘ হয় তবে আপনাকে আরও টাইল পরীক্ষা করতে হবে। এটি করার জন্য আপনাকে লুপ করতে হবে এবং টাইল অর্জনের জন্য চরিত্রের অবস্থানের সাথে টাইলহাইট যুক্ত করতে হবে

int characterBlockHeight = 3;

// check all tiles and intermediate tiles down the character body
for (int y = 0; y < characterBlockHeight - 1; y++) {
    tile = getTile(floor(characterX / tileWidth), floor((characterY + (y * tileHeight)) / tileHeight));
    ... check tile OK....
}

// finally check bottom
tile = getTile(floor(characterX / tileWidth), floor((characterY + characterHeight) / tileHeight);
... check tile OK....

যদি অক্ষরটি 1 টির চেয়ে বেশি বিস্তৃত হয় তবে একই কাজটি করুন তবে চরিত্রের অক্ষর, অক্ষর হাইট, টাইলহাইট ইত্যাদির সাথে অক্ষর, অক্ষরওয়াইড, ইত্যাদি প্রতিস্থাপন করুন


2

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


1

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

আপনার উদাহরণে, এক্স-অক্ষের সংঘর্ষের ক্ষেত্রটি y- অক্ষের চেয়ে বেশি হবে, তাই এটি প্রথমে পরিচালনা করা হবে। তারপরে y- অক্ষের সংঘর্ষটি পরিচালনা করার চেষ্টা করার আগে এটি পরীক্ষা করে দেখতে পেল যে এক্স-অক্ষে সরে যাওয়ার পরে এটি আর সংঘর্ষে নেই। :)


1

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


1

খুব একই সমস্যা এই টিউটোরিয়াল মধ্যে আবৃত ছিল: গেম বিকাশ পরিচিতি । ভিডিওটির প্রাসঙ্গিক অংশটি ডায়াগ্রাম এবং কোড স্নিপেটের সাথে ব্যাখ্যা করে 1:44 এ রয়েছে ।

14-tilemap.py লক্ষ্য করুন ক্লিপিংয়ের সমস্যাটি দেখায় তবে এটি স্থির করা আছে 15- blocker-sides.py এ

আপনার কোডটি করার সময় কেন শেষ টিউটোরিয়াল উদাহরণটি ক্লিপ হয় না তা আমি ঠিক ব্যাখ্যা করতে পারি না তবে আমি মনে করি এটির সাথে কিছু করার আছে:

  • টাইলের ধরণের ভিত্তিতে শর্তযুক্ত সংঘর্ষের প্রতিক্রিয়া (কোন প্রান্তগুলি আসলে সক্রিয় রয়েছে))
  • খেলোয়াড় সর্বদা 'পড়ে'। যদিও খেলোয়াড় টাইলের উপরে বিশ্রাম নিচ্ছে বলে মনে হচ্ছে, প্লেয়ারটি বারবার টাইলের মধ্য দিয়ে পড়ছে, তারপরে আবার শীর্ষে ঠেলে দেওয়া হচ্ছে। (কোডটিতে থাকা self.restingসদস্যটি কেবল প্লেয়ারটি লাফিয়ে উঠতে পারে কিনা তা পরীক্ষা করতে ব্যবহৃত হয় this তবুও আমি প্লেয়ারটিকে কোনও দেয়াল থেকে 'ডাবল' লাফ দিতে পারি না The তাত্ত্বিকভাবে এটি সম্ভবত সম্ভব হতে পারে))

0

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

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


0

আমি কেবল 3 ডি তে 3 স্যাট করেছি তাই সম্ভবত আমি এটি সঠিকভাবে পাচ্ছি না। আমি যদি আপনার সমস্যা বুঝতে পারি তবে এটি কোনও পরিচিতি অক্ষের সাথে যোগাযোগ পাওয়ার কারণে হতে পারে যা সম্ভব না হওয়া উচিত, ফলস্বরূপ প্লেয়ারের মতো মেঝে থাকার মতো আচরণ করা। এর পরিবর্তে আপনার ক্যারাকটারের জন্য একটি বৃত্তের আকার ব্যবহার করা যেতে পারে তবে প্রাচীরটি আঘাত করার সময় আপনি কেবলমাত্র অক্ষ অক্ষের সাথে যোগাযোগের অক্ষ পাবেন es

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