Ответ 1
Загрузите движок FarseerPhysics, посмотрите, как он работает http://www.codeplex.com/FarseerPhysics Я думаю, что это лучшая вещь, доступная для XNA/Silverlight!
Это был долгий праздничный уик-энд, поэтому я снова получил ошибку кодирования и начал играть вокруг:
Марио http://gfilter.net/junk/tileengine.jpg
Я написал базовый движок для плитки, но, никогда ранее этого не делал, я действительно борется с управлением обнаружением столкновения спрайтов и реализацией реалистичной физики для гравитации.
Для любых других авторов хобби для игры, можете ли вы указать мне на некоторые пошаговые инструкции по наилучшему способу приблизиться к этому?
Update:
Я думал, что поделился бы успехом:
http://www.youtube.com/watch?v=-RKNQ2UiiLY < - Игра в действии
Он по-прежнему на самом деле глючит, но обнаружение конфликтов в основном работает, я начал работать над некоторыми другими функциями (например, набросать блоки (заметить ошибку) и взаимодействовать с врагами).
Марио все еще ходит так, как будто он на Луне, я использую эти константы, любые советы по настройке их для большего реализма?
const float AirDrag = 1.00f;
const float GroundFriction = .97f;
const float Gravity = 0.8f;
Загрузите движок 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, на которых я играл, не имеют, имеют реалистичную гравитацию. Просто делайте то, что делает игру забавой!
jnrdev может оказать некоторую помощь. Он охватывает столкновение/реакцию плитки и склоны. Это не лучший код, который я когда-либо видел, но он выполняет свою работу.
В разделе http://www.metanetsoftware.com/technique/tutorialA.html и http://www.metanetsoftware.com/technique/tutorialB.html. Я думаю, что на них ссылались другие в других местах. Они охватывают обнаружение столкновений и реакцию, raycasting, различные методы оптимизации и т.д. И имеют хорошее объяснение теории, лежащей в основе всего этого для тех (как я), которые менее математически склонны. Это не так много, как динамика твердого тела, но я не думаю, что вам понадобится это для типа игры, которую вы пишете (хотя, конечно, было бы здорово, если бы вы добавили этот материал..)
Это может быть обход, но попробуйте стартерный комплект Platformer от XNA 3.0, который содержит такие вещи, как физика и базовое обнаружение столкновений. Вам нужно будет изменить материал, чтобы заставить его работать вне XNA, но это не ракетостроение.
Я не знаю, что вы используете для модели физики, но физики, которые используют гидравлическое сопротивление, были недавно рассмотрены в другой вопрос SO. Я не буду повторять все, что я дал в своем ответе, я просто ссылку на него.
Подводя итог, OP для вопроса хотел ускорить объект от отдыха до максимальной скорости. Я провел несколько выводов для моделирования скорости в зависимости от времени для двух разных типов сопротивления. Ваша ситуация может быть несколько иной, поэтому используемые интегралы могут иметь разные формы или должны быть решены с разными начальными условиями, но, надеюсь, мой ответ укажет вам на некоторые информационные направления.
Ваша ошибка при столкновении нескольких блоков, вы можете исправить это, только набросив блок, который наиболее выровнен с помощью playerprite, или имеет наименьшее смещение. Не ограничивайте его только одним направлением. Блоки действительно могут быть удалены из любого направления в Марио. (Выше, сделав фунт в одних и тех же играх или упражнение для сверления) (Стороны с помощью оболочки)
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();
Когда-либо слышал о GameMaker?