2d физика платформера
Это были длинные выходные, поэтому я снова получил ошибку в коде и начал играть:
http://gfilter.net/junk/tileengine.jpg
Я написал базовый движок плиток, но никогда прежде не пытался сделать это, я действительно борюсь с обнаружением столкновений спрайтов и реализацией реалистичной физики для гравитации.
Для любого другого автора игрового хобби, не могли бы вы указать мне на некоторые пошаговые руководства о том, как лучше всего подойти к этому?
Обновить:
Я думал, что поделюсь отчетом о проделанной работе:
http://www.youtube.com/watch?v=-RKNQ2UiiLY <- Игра в действии
Он все еще действительно глючит, но обнаружение столкновений в основном работает, я начал работать над некоторыми другими функциями (такими как удары по блокам (обратите внимание на ошибку) и взаимодействие с врагами).
Марио все еще ходит, как будто он на Луне, я использую эти константы, есть какой-нибудь совет, как настроить их для большего реализма?
const float AirDrag = 1.00f;
const float GroundFriction = .97f;
const float Gravity = 0.8f;
9 ответов
Загрузите движок FarseerPhysics, посмотрите, как он работает http://www.codeplex.com/FarseerPhysics Я думаю, что это лучшая вещь для XNA/Silverlight!
Гравитация проста:
const gravity = ... ; // pixels per timestep (eg. video frame) squared
// while in freefall, each timestep:
y_velocity += gravity;
y_pos += y_velocity;
Имейте в виду, большинство игр для 2D-платформ, в которые я играл , не имеют реалистичной гравитации. Просто делай то, что делает игру веселой!
Есть пара действительно полезных двумерных учебников по платформеру: http://www.metanetsoftware.com/technique/tutorialA.html и http://www.metanetsoftware.com/technique/tutorialB.html. Я думаю, что на них ссылались другие в SO. Они охватывают обнаружение столкновений и реагирование, лучевое вещание, различные методы оптимизации и т. Д., И имеют хорошее объяснение теории, стоящей за всем этим для тех (как я), которые менее склонны к математике. Это не так далеко, как динамика твердого тела, но я не думаю, что она вам понадобится для игры, которую вы пишете (хотя, конечно, было бы здорово, если бы вы добавили такого рода вещи...).)
Jnrdev может оказать некоторую помощь. Это покрывает столкновение плитки / ответ и наклоны. Это не лучший код, который я когда-либо видел, но он выполняет свою работу.
Это может быть обходным путем, но попробуйте стартовый набор Platformer из XNA 3.0, который содержит такие вещи, как физика и базовое обнаружение столкновений. Вам нужно будет изменить материал, чтобы он работал вне XNA, но это не ракетостроение.
Если вы столкнулись с несколькими блоками, вы можете исправить это, только ударив блок, который больше всего выровнен с игроком или имеет наименьшее смещение. Будьте уверены, чтобы не ограничивать его только в одном направлении. Блоки на самом деле могут быть разбиты в любом направлении в Марио. (Выше, делая фунт в тех же играх, или вещь с вращением сверла) (Стороны используют оболочку)
Я не знаю, что вы используете для физической модели, но физические модели, которые используют жидкостное сопротивление, были недавно рассмотрены в другом вопросе SO. Я не буду повторять все, что я дал в своем ответе, я просто сделаю ссылку на него.
Подводя итог, можно сказать, что ФП по данному вопросу хотел ускорить объект от покоя до максимальной скорости. Я прошел несколько выводов для моделирования скорости как функции времени для двух разных типов сопротивления. Ваша ситуация может немного отличаться, поэтому используемые интегралы могут иметь разные формы или должны быть решены с различными начальными условиями, но, надеюсь, мой ответ укажет вам некоторые информативные направления.
UIGraphicsBeginImageContext(images.size);
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor *color = [UIColor whiteColor];
[color setFill];
CGContextTranslateCTM(context, 1, images.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextSetBlendMode(context, kCGBlendModeDestinationOver);
CGRect rect = CGRectMake(0.0, 0.0, images.size.width, images.size.height);
CGContextDrawImage(context, rect, images.CGImage);
CGContextClipToMask(context, rect, images.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context, kCGPathFill);
images = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();