У мене проблема з вирішенням зіткнення AABB.
Я розв'язую перетин AABB, вирішивши спочатку вісь X, потім вісь Y. Це робиться для запобігання цієї помилки: http://i.stack.imgur.com/NLg4j.png
Поточний метод працює чудово, коли об’єкт переміщується в програвач, і програвач повинен бути натиснений горизонтально. Як ви бачите на .gif, горизонтальні шипи натискають програвач правильно.
Коли вертикальні шипи переміщуються в програвач, осі X все ще вирішуються спочатку. Це робить "використання шипів як підйомника" неможливим.
Коли гравець рухається у вертикальні шипи (уражений силою тяжіння, падає на них), його натискають на вісь Y, оскільки для початку не було перекриття на осі X.
Щось я спробував, це метод, описаний у першій відповіді за цим посиланням: 2D виявлення зіткнень прямокутних об'єктів
Однак шипи та рухомі об'єкти рухаються, змінюючи їх положення, а не швидкість, і я не обчислюю їх наступну передбачувану позицію, поки не буде викликаний метод Update (). Потрібно сказати, що і це рішення не спрацювало. :(
Мені потрібно вирішити зіткнення AABB таким чином, щоб обидва описані вище випадки працювали за призначенням.
Це мій поточний вихідний код зіткнення: http://pastebin.com/MiCi3nA1
Я був би дуже вдячний, якби хтось міг розібратися в цьому, оскільки ця помилка була присутня в двигуні ще з самого початку, і я намагаюся знайти хороше рішення, не маючи успіху. Це серйозно змушує мене проводити ночі, переглядаючи код зіткнення і заважаючи мені потрапити на "веселу частину" та кодувати логіку гри :(
Я спробував реалізувати ту саму систему зіткнення, що і в демонстраційній платформі XNA AppHub (шляхом скріплення копіювання більшості матеріалів). Однак помилка "стрибки" трапляється в моїй грі, в той час як вона не відбувається в демо-версії AppHub. [стрибок помилка: http://i.stack.imgur.com/NLg4j.png ]
Щоб перейти, я перевіряю, чи гравець "onGround", а потім додайте -5 до Velocity.Y.
Оскільки швидкість X у гравця вище, ніж Velocity.Y (див. Четверту панель на діаграмі), onGround встановлено на істинне, коли цього не повинно бути, і, таким чином, дозволяє гравцеві стрибати в повітрі.
Я вважаю, що цього не відбувається в демонстраційній програмі AppHub, оскільки швидкість гравця.X ніколи не буде вище Velocity.Y, але я можу помилятися.
Я вирішив це раніше, вирішивши спочатку по осі X, потім по осі Y. Але це накручує зіткнення зі шипами, як я вже говорив вище.