Я использую C # / XNA, и мне несколько раз говорили не смешивать код обновления с кодом отрисовки - и я уверен, что нет! Но может ли кто-нибудь описать, что такое «логический код»?
Как видно здесь: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx
[...] убедитесь, что вы поместили всю свою игровую логику в метод Update (не в Draw!), и все будет работать с хорошей постоянной скоростью.
Я спрашиваю об этом, так как скорость моей игры колеблется относительно FPS. Медленный FPS равняется медленным объектам и наоборот. И да, я включаю ожидаемый position += speed * (float)gt.ElapsedGameTime.TotalSeconds;
код.
Вероятно, это большой вопрос новичка, но я просто хочу быть абсолютно ясным в определении этого.
terminology
Застенчивый парень
источник
источник
position = speed * ...TotalSeconds
. Обратите внимание, это=
не так+=
. Если бы это было+=
так, как вы печатали, то ваша позиция почти мгновенно исчезла бы с экрана.gt.ElapsedGameTime.TotalSeconds
сколько секунд прошло с момента запуска программы (игры). Если вы умножаете свою скорость на это, то после 5 секунд игры ваша скорость будет в 5 раз выше (кроме особого случая, когда скорость установлена на 0). Не уверен, что еще ты мог бы сделать это неправдой, но я заинтригован.iii
которую я вручную увеличиваю каждое обновление, потому что я не хочу ее в считанные секунды, я хочу шаги или кадры. Я вижу, что ваш путь - это правильный способ софт-кодирования.Ответы:
Меняет ли это состояние вашего игрового мира? Это логический код.
Отображает ли он состояние игрового мира? Это код рендеринга.
источник
Ваше разделение верно, если:
источник
Draw()
могут рисовать разные картинки с течением времени. Например, кадры анимированных спрайтов могут продолжать меняться. Кроме того, объекты могут продолжать визуально двигаться вперед, если код рендеринга использует общий трюк и увеличиваетvelocity * time since last update / period of update
видимое положение объектов (в то время как их реальное положение остается неизменным).iff
то есть если-и-только-если?Update
то что еще не синхронизировано? Входы проигрывателя пропущены, сетевые события не обрабатываются и т. Д.? Игра должна быть запущена из одних часов, с фиксированными «галочками» для игровой логики или физики, полученными из этих часов, и производное графическое состояние, также управляемое теми же часами.Draw()
таким образом, чтобы он всегда рисовал одну и ту же картинку при вызове несколько раз подряд. Нужно сделать это, если это возможно. Но бывают случаи, когда вы не знаете, с какой частотойDraw()
будут звонить. Например, если вам нужна полная поддержка (фактическая 120 FPS) для новых мониторов с частотой 120 Гц, и вы включаете vsync.What if I want to pause graphics?
Затем вы передаете 0 вместо фактического времени дельты вDraw()
.0
. Вы можете иметь иерархические часы, так что, например, пользовательский интерфейс все еще работает и анимирует, а интерполяция символов тоже очень и очень легко останавливается.Дело здесь в разделении вещей модели, которые не являются моделью.
Логика игры - это модель, о которой говорится в
Это разные, связанные шаблоны архитектуры программного обеспечения. Но во всех случаях Модель - это то же самое, это реальная логика и реальное состояние.
Именно при создании программного обеспечения для бизнеса его иногда называют бизнес-логикой и кодируют некоторые бизнес-политики. Например, если вы что-то кодируете для банка, чтобы рассчитать счета по кредитным картам, то функциональность, позволяющая кому-то не платить проценты, если он погасит свой долг менее чем за 30 дней, является частью бизнес-логики, она живет в модель. Например, он не живет на одном из отображающих слоев. Код для печати счета, например, не редактирует текст, основываясь на своих действиях. Этот пример, возможно, подчеркивает, почему вы можете организовать свой код таким образом.
Подобное относится и к игровой логике.
Представьте, что в какой-то момент ваша игра была перенесена на другую консоль. Это может помочь представить что-то действительно отличное от вашей текущей цели. Например, если вы нацелены на что-то с помощью геймпада / контроллера, представьте, что ваша игра перенесена на планшет с сенсорным экраном. Логика игры - это часть кода, которая не меняется при портировании.
Если ваша игра была чем-то вроде военной стратегии, представьте, что она превращается в самую сложную настольную игру в мире. Логика игры - это фрагменты кода, которые напрямую соответствуют строкам в книге правил. (Не все строки в книге правил, не о движущихся фигурах, а о некоторых.)
Логика игры - это то, что никогда не меняется, независимо от формы.
источник