Comments 55
Друзья! Уж не знаю, насколько хабраторная статья получилась. Может@dlinyjподскажет, как человек, который ввел это понятие? :)
Исходники будут чуть-чуть попозже. Мой ноут с репозиторием гита перестал видеть хдд и мне удалось все починить как раз к моменту публикации статьи. Линки на загрузки демок рабочие.
Пока что в игре есть парочку нюаносв:
В игре нет нормального таймера. Физический движок не поддерживает переменные дельты для апдейтов, только фиксированные. В полноценных играх реализация таймера разная, но обычно ограничивают кол-во <b>обновлений логики</b>, если оно выше того, чем может выдать железо и "досимулируют" дополнительные кадры логики, если оно ниже желаемого FPS. Чуть позже допилю.
У игры косячные тени - связано это с методикой реализации. Стенсильные тени я сразу же отмел - трансформировать геометрию для них "ручками" будет довольно накладно. На DX9 можно запилить полноценные шедоумапы - я это делал в случае с шутером, но поддерживается только на относительно свежих видеокартах. Поэтому пока что, на время, я реализовал планарные тени - старая техника, которая заключается в трансформировании геометрии специальной матрицей, которая "сплющит" модель в одну из сторон относительно источника света. Такие тени косячные, чуть позже запилю проективные (как в Flatout 2).
Я не ввёл это понятие, я его позаимствовал. Это с тех далёких времён, когда начали говорить что "хабр не тот", потом "тот" трансформировалось в "торт" и таким образом хорошая статья на хабре стала:
Хабра торт
Твоя статья вполне себе хабраторт.
Блин. Мне прискорбно это говорить, но похоже сырцы окончательно утеряны :(
Я перепроверил винты и не нашел бэкапа. Но исходники более ранней версии фреймворка и полуготовой игры на нем (шутан) у меня сохранились. Писалась игра еще до того, как я начал вести техноблог и сделал себе норм сеть для бэкапов!
Торт. Очень даже торт.
Ждем стим версию.
Назовем LADA RACING CLUB 2?
HABR RACING CLUB 1.0
Заменяю никнеймы пользователей гдру на никнеймы Хабра.
Скоро у нас будут кататься Сергей dlinyj, Анатолий Alizar и Бумбурум!
Если машинка Ализара будет жёлтой, то позитивные отзывы гарантированы!
Вот за такие локальные мемы не шарю(
Мне восьмёрку :)
А у меня без шуток девятка первой машиной была ))
А будет Бумер с ТРД?
Скажите, я понимаю, я не канон, но мне хотелось бы увидеть свой первый ~~танк~~ автомобиль Газ 24 Волга. Есть варианты? Там с управлением очень просто - его не было. Она практически не рулила. Любой поворот был на три точки.
А мну можно электро Оку?
Это логически выводимый мем:
Ализари́н (1,2-дигидроксиантрахинон) — органическое соединение, производное антрахинона с химической формулой C14H8O4.… С древности применялся как протравный краситель по ткани.
alizar был пионером потока желтушных публикаций на Хабрахабре.
Знамя из его слабеющих рук подхватила «Информационная служба Хабра» со 100500 сотрудников, а он это вывозил в одну калитку.
Человечище!
Немного оффтоп, визуальный стиль напомнил.
Был такой проект в виде файла bueraki.blend там подобные гонки были целиком сделаны на игровом движке, можно было играть прямо в редакторе. Случайно не ваша разработка?
Вот, что я называю: работа - в удовольствие
Можно было бы еще оставить элементы из шутера и был бы русский кармагеддон ))
Неистово плюсую. Люблю сам окунуться в старый добрый DirectX (SharpDX или MonoGame) и руками пощупать всё то, что скрывают от нас Unity3D, UnrealEngine и Godot.
Да, это очень весело)
Когда-то давно, более 8 лет назад, я написал XProger'у еще будучи 13-летним школяром и донималего вопросами о разработке тридэ, с нуля. Очень нравились его демки для eXgine. Будучи школяром, я с ним особо не поладил тогда, но в любом случае благодарен ему за наставление на путь и первые подсказки :)
Сорри за оффтоп, но в такой теме чуть больше шансов найти ответ на давно мучающий вопрос.
Был у меня в своё время пиратский диск Дальнобойщиков, и в довесок к ним прилагалась ещё одна игра - внешне очень похожая на эту демку. Тоже отечественный автопром, но не только ВАЗ. Причём машины были переименованы: "Баржа", "Зубило", "Козёл". Треки - скорее загород, чем город: построек было совсем мало. Год - примерно 1998-2002, скорее ближе к началу этого дипазона.
Может, кто-то помнит такое?
Для лады спидометр что надо!
А что ж вы всякое разное аки у индуса копипастой вставляете? Вместо
...
for item in vector {
this.uiUpgrade.AddItem(item.caption, item.handler, item.color)
}
...
у вас всякое
...
this.uiUpgrade.AddItem("Блок цилиндров", (Action) (() => this.currMenu = this.uiUpgrades[0]), this.uiColor);
this.uiUpgrade.AddItem("Топливная система", (Action) (() => this.currMenu = this.uiUpgrades[1]), this.uiColor);
this.uiUpgrade.AddItem("Валы", (Action) (() => this.currMenu = this.uiUpgrades[2]), this.uiColor);
...
и
...
animator.AddSequence(new MeshSequence(), {blabla})
animator.AddSequence(new MeshSequence(), {blabla})
animator.AddSequence(new MeshSequence(), {blabla})
animator.AddSequence(new MeshSequence(), {blabla})
...
В случае с апгрейдами - это временная реализация родительских категорий для запчастей. Там даже видно, что обращение идет по захардкоженным индексам, а не индексам из соответствующего енума.
С анимациями - для читабельности. В самих файлах нет описания кадров анимаций, поэтому они декларировались прямо в коде сущностей. Если что, это ограничение кваковского формата - как я уже говорил, я частенько юзаю модели из модов для этой игры, поэтому особо формат не помодифицируешь.
Нужно понимать, что это демка. Здесь ничего не рефакторилось и некоторые места писались так, чтобы получить готовый результат. Но откровенного говнокода там (почти) нет :)
Круто, это же почти готовый автомобильный тренажёр! В автошколах порой даже встречаются "профессиональные" поделки с графикой хуже, чем у автора :)
Короче, надо взять кресло от "жигулей", рулевую колонку, да можно заодно и всю приборку, педали, рычаг КПП, ручник, собрать это всё на стальном каркасе, и обязательно "под капотом" установить старый ПК на 1-ядерном целероне под Windows XP... а датчики воткнуть в игровой порт на материнке.
Уххх, кармагедоном потянуло со скринов :)
Спасибо что сделали 32-разрядную сборку, которая запускается на XP.
Если вы пишете в лог, то файл engine.log изначально должен отсутствовать чтобы создать его при запуске.
Хорошо бы чтобы игра выводила сообщение об ошибке в виде MessageBox, а не только в консоль.
Игра завершает работу если не смогла открыть файлы engine.log, Data\scripts\assembly.pdb, Data\scripts\assembly.dll на запись, если запускать без прав администратора. Все файлы, которые ваше приложение будет создавать/писать надо создавать в домашнем каталоге пользователя, в папке Application Data. Создавать их в той же папке, что и игра - привет из 98-года.
Игра кушает 30% проца, что многовато для такой скромной игры. 45 Мб памяти - нормально.
После того как проехали трассу не понятно что нажимать чтобы начать заново.
После закрывания окна:
Unhandled Exception: SharpDX.SharpDXException: HRESULT: [0x80004005], Module: [G
eneral], ApiCode: [E_FAIL/Unspecified error], Message: Неопознанная ошибка
at SharpDX.Result.CheckError()
at SharpDX.Direct3D9.Device.Present(IntPtr sourceRectRef, IntPtr destRectRef,
IntPtr hDestWindowOverride, IntPtr dirtyRegionRef)
at SharpDX.Direct3D9.Device.Present()
at Engine3D.Graphics.EndScene()
at Engine3D.Game.Run()
at MonoRace.Program.Main(String[] args)
Файл engine.log оказался пустой. Вы хотя бы делайте flush после каждой записи или после падения, чтобы в логе что-то оставалось, иначе какой смысл вести лог если в случае падения приложения в него ничего не запишется.
Не хватает еще какой-то надписи что игра загружается и хотя бы простецкого ProgressBar чтобы не показывать пустое окно первые несколько секунд.
Шутер нормально запускается, но падает через несколько секунд после старта.
Unhandled Exception: System.Reflection.TargetInvocationException: Exception has
been thrown by the target of an invocation. ---> SharpDX.SharpDXException: HRESU
LT: [0x8878001E], Module: [Unknown], ApiCode: [Unknown/Unknown], Message: Unknow
n
at SharpDX.Result.CheckError()
at SharpDX.DirectSound.DirectSoundBase.CreateSoundBuffer(SoundBufferDescripti
on cDSBufferDescRef, IntPtr& dSBufferOut, ComObject unkOuterRef)
at SharpDX.DirectSound.SecondarySoundBuffer..ctor(DirectSound dSound, SoundBu
fferDescription bufferDescription)
at Engine3D.AudioStream.Upload(Int32 sampleRate, Int32 align, Int32 channels,
Byte[] data, Int32 size) in C:\Users\Богдан\source\repos\RPGIGDC\Engine3D\Audio
\Audio.cs:line 95
at Engine3D.AudioStream.LoadWav(Stream strm) in C:\Users\Богдан\source\repos
RPGIGDC\Engine3D\Audio\Audio.cs:line 129
at RPGIGDC.Crawler.Precache() in C:\Users\Богдан\source\repos\RPGIGDC\RPGIGDC
\Monsters\Crawler.cs:line 27
at RPGIGDC.Crawler..ctor(World world) in C:\Users\Богдан\source\repos\RPGIGDC
\RPGIGDC\Monsters\Crawler.cs:line 34
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle._InvokeConstructor(IRuntimeMethodInfo method, O
bject[] args, SignatureStruct& signature, RuntimeType declaringType)
at System.RuntimeMethodHandle.InvokeConstructor(IRuntimeMethodInfo method, Ob
ject[] args, SignatureStruct signature, RuntimeType declaringType)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, B
inder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
at RPGIGDC.Spawner.Update() in C:\Users\Богдан\source\repos\RPGIGDC\RPGIGDC\S
pawner.cs:line 75
at RPGIGDC.World.Update() in C:\Users\Богдан\source\repos\RPGIGDC\RPGIGDC\Wor
ld\World.cs:line 191
at RPGIGDC.GameMain.OnUpdate() in C:\Users\Богдан\source\repos\RPGIGDC\RPGIGD
C\GameMain.cs:line 70
at Engine3D.Game.Run() in C:\Users\Богдан\source\repos\RPGIGDC\Engine3D\Game.
cs:line 158
at RPGIGDC.Program.Main(String[] args) in C:\Users\Богдан\source\repos\RPGIGD
C\RPGIGDC\Program.cs:line 23
Кажется, вы просто забыли добавить папку System в архив с игрой и нужные игре ресурсы просто отсутствуют.
"тык на GitHub" не кликабельный.
А статья хорошая. :)
Пытался запустить, вылетает почти сразу.
Лол! Ну такой скиллухе я аплодирую стоя))! Браво, маэстро!
Сам написал, сам погонял: как я написал 3D-гонки «на жигулях» за неделю, полностью с нуля?