2012-01-11 2 views
0

Я пытаюсь создать простой физический движок твердого тела 2D.Как обновить сетку? и как рассчитать количество времени?

Я смог создать изображение прямоугольника, используя четыре линии и способный манипулировать изображением в соответствии с его углом и положением; Я могу перемещать и поворачивать его (хотя я сделал поворот, я не использую вращающуюся функцию, так как пока не могу понять теорию углового момента).

Изображение будет падать и отскакивает назад основанный на простой формуле:

v(velocity) += a(acceleration) 
x += v(velocity) 

Но я должен нажать на кнопку каждый раз, когда я хочу выполнить движение.

Я хочу, чтобы он выполнялся автоматически и автоматически обновлялся, я пытался использовать цикл, но по какой-то причине программа, кажется, останавливается за время, когда она находится в секции цикла. И поскольку я использую бесконечный цикл, который будет запускаться снова и снова, моя программа просто зависает.

Не только это проблема, но и мой хороший друг, который имеет лучшие знания в области физики, сказал мне, что я должен быть в состоянии вычислить количество времени, если я хочу, чтобы этот двигатель работал правильно.

+0

Вы думали об использовании Threads and or Timer и установке интервала ..? – MethodMan

+0

Разве XNA не вариант? XNA не только предоставляет методы автоматического обновления сценария, но также специально разработан для игр, что звучит так же, как и то, что вы пытаетесь выполнить (обратите внимание, что я не говорю, что вы строите игру). – PedroC88

+0

вы могли бы опубликовать, как вы уже пытались реализовать это, в то время как threads & XNA - очень хорошие решения, это может быть просто простая ошибка, которая мешает вашему циклу завершить – Johnv2020

ответ

1

Мне нравится комментарий DJ KRAZE - используйте System.Windows.Threading.DispatcherTimer и установите интервал, чтобы часто вы хотите, чтобы изображение было перерисовано. На событии таймера Tick сделайте перерисовку.

Если вы хотите знать, почему простая петля не работает, вы должны знать немного о Windows message loop. Для краткого и несколько неточного обзора все, что работает в вашем приложении, похоже, происходит в одном потоке. В Windows используется сообщение WM_PAINT, которое проходит через цикл сообщений, чтобы сделать панель управления самой. Он обрабатывает только сообщения.

Где у вас есть бесконечный цикл, который происходит при обработке какого-либо сообщения. Таким образом, это предотвращает обработку цикла сообщений любыми сообщениями, в том числе сообщениями для элементов управления для рисования. Таким образом, вы не видите ничего обновляемого в своем бесконечном цикле.

+0

Речь идет о WPF, поэтому я предпочел бы использовать 'System.Windows .Threading.DispatcherTimer', 'System.Threading.Timer' или' System.Timers.Timer'. – Nuffin

+0

К сожалению, мне показалось, что я видел теги в окнах, но ясно, что я ослеп. – dsolimano

+0

Это может быть из-за моего отсутствия глубоких знаний, я не настаиваю на объяснении, поскольку я знаю, что для меня маловероятно понять различия между таймером и DispatcherTimer, но я удивлен, что существует так много разных типов таймеров и так запутано – Bug

0

Возможно, вы могли бы изучить XNA, это платформа Microsoft, которая облегчает разработку игр, вы должны обратиться к App Hub за информацией о том, как начать работу.

Что касается вашего конкретного вопроса по освещению экрана, вы можете ознакомиться с методами Update и Draw. Here - это учебное пособие, которое, хотя и не может решить ваш конкретный вопрос, должно дать вам знать о том, как обновить экран.

Смежные вопросы