C# 3D шутер в консоли / .NET Console 3d fps
Процесс создания простой 3д бродилки без дополнительных библиотек на основе технологии Ray Casting
Скачать проект можно по ссылке:
www.dropbox.com/s/052zwffcew3...
Проект с генерацией лабиринта (нажать пробел):
github.com/dmstop/Pseudo3DMaz...
Пікірлер: 177
Great job, everything works great. I would expect these programs run on C ++ or another low-level language, but trying it in C # is not a bad idea. As a big C # fan, your video helped me a lot, thanks :) Czechia
@DmitryStopkevich
3 жыл бұрын
I'm glad you like the video, despite the fact that it was not recorded in English
@darthvader8144
3 жыл бұрын
čuš
@DenisShaver
3 жыл бұрын
@@DmitryStopkevich " it was not recorded in English". Ну сейчас вроде неплохой перевод с распознаванием речи )
@user-nc2xw1zb3y
2 жыл бұрын
C++ low-level language?!
@abrajmek_zalilov
2 жыл бұрын
@@user-nc2xw1zb3y btw closer to hardware then C#, afaik
Топ контент
Огромное спасибо, всегда хотел разобраться с этим, и тут наткнулся на твое видео.
Спасибо за видео. Сделал свою версию в windows forms , и все прекрасно работает. Еще устранил эффект рыбьего глаза и добавил объекты разной высоты.
@DmitryStopkevich
3 жыл бұрын
Пожалуйста) Рыбий глаз устраняется добавлением fov в этой строчке: int ceiling = (int)(ScreenHeight / 2.0 - ScreenHeight * Fov / distanceToWall);
@jellygrelly
Жыл бұрын
@@DmitryStopkevich здравствуйте, а что делать, если показывает только точки на экране?
Шикарно,просто великолепно) Огромное тебе спасибо,быстро и по делу)) Удачи)
Если перед вами сплошная стена, это нормально - просто координаты игрока равны (0; 0) по x и по y соответственно. Поменяйте их, как в видео, на (3; 3). Также, если имеется проблема с дёрганой прорисовкой в консоли, это проблема с разрешением в консоли. Пишите: Console.SetWindowSize(ScreenWidth, ScreenHeight + 1); Console.SetBufferSize(ScreenWidth, ScreenHeight + 1); Поиграйтесь с разрешением в консоли, если мой вариант не помогает. Надеюсь кому-то поможет.
просто божественный видос
Спасибо большое! Очень интересно, и без лишней информации.
Пора железо менять! FPS жестко проседает! спасибо за контент!
Жаль, что не могу поставить сразу 10 лайков! Дружище, ты гений!
Очень круто!!! Я тоже написал такой шутер, но пошел дальше: я еще и текстурировать стены смог!!! А в будущем планирую сделать мультиплеер и генерацию каких-нибудь структур.
@Cun_I
Жыл бұрын
а можешь результат в ютубе или гитхабе показать?
Видео очень помогло, спасибо!
Очень круто
Оригинально, интересно, круто
Просто спасибо тебе!!!!!
@DmitryStopkevich
3 жыл бұрын
Пожалуйста)
Парень красавчик, запарился!
Hard type of content to find, especially in C# ,thank you for this. I'll try to reproduce here. Cheers from Brazil
Это очень круто!
3:38 чтобы так выделить нужно зажать ALT
@bunikido2298
3 жыл бұрын
Спасибо!
@user-lm9qr8hr1e
3 жыл бұрын
Бля где ти бил до Этого?????????????????????????
Странно, что какие-то бесполезные Романы , набирают по 100 к подписчиков, которые только записывают видео для мотивация.
Красава!
Почему так мало подписчиков у такого умного человека?
Прикольно!
Прекрасно
Забавная програмка :) Спасибо! посмотрю :)
крутяк 👍
Awesome
Beautiful
Лайк!
Это настолько круто, что у меня просто нет слов
Круто, однако идти вдоль луча по 0.1 далеко не оптимально. На прямоугольной сетке raycast можно свести к построению линии алгоритмом Брезенхэма, где пикселями выступают блоки. В результате определение пересечения будет на порядок быстрее, а если использовать fixed point, то прям ну очень быстро. Собств-но как оно и было сделано в Wolfenstein 3D.
Спасибо.
Это охринеть
Хороший ролик. Идея такой реализации на канале javidx9, он пишет на C++, и подробно объясняет всю физику и математику.
Проблема с фпсом из-за того, что ты компилировал в debug'е программу. Но вообще годно, молодец
крутой
музыка из дума дает правильный настрой с первых секунд
nice job
Графика топ
pantera - this love играет ;)
добавлю в библиотеку, повторю как-то:)
ого!!!
Я такое делал на OpenGL. Взял проект 3д лабиринта и сделал управление камерой с помощью клавиатуры. Самое сложное - взаимодействие со стенами.
я: не умею создавать документ тем временем этот хакер:
Хоть я полный ноль в этом, но я поставлю лайк чтобы продвинуть это видео :D
Очень крутой видос, но хочется сделать замечание по поводу этого момента 25:25 Во-первых стринг и стрингбилдер оба ссылочные А причина по которой в этом сценарии стрингбилдер работает быстрее это потому что стринг неизменяемый, и когда мы его изменяем, то на самом деле для него каждый раз создаётся новый объект (что достаточно долго), а вот стрингбилдер уже изменять можно и никаких новых созданий объектов не происходит
@DmitryStopkevich
3 жыл бұрын
Вы правы, они оба ссылочные. Тем не менее, как вы упомянули, стринг несет в себе много характеристик велью типов, являясь неизменяемым объектом, а также когда мы передаём его в методы, в них попадает копия этого объекта, так же как происходит с интом, например. Так что если называть стринг ссылочным типом, теряется суть его поведения. Архитектура этого типа ссылочная по историческим причинам, еще с с++. В то же время StringBuilder это классический reference тип, который единожды инициализируется и в последствии работа ведется с одним экземпляром
@vladislavkochegin3628
3 жыл бұрын
@@DmitryStopkevich да, так и есть, но с одним я тут не согласен. Насколько я знаю стринг при передаче его в качестве параметра не копируется. Копируется только ссылка на него
@DmitryStopkevich
3 жыл бұрын
@@vladislavkochegin3628 Вот простой эксперимент: void Main() { string s = "Foo"; Test(s); Console.WriteLine(s); //Выведется Foo. Если бы в Test пришла ссылка на s, то при изменении его внутри этого метода, он бы изменился и в maine :) } void Test(string s) { s = "Bar"; }
@DmitryStopkevich
3 жыл бұрын
@@vladislavkochegin3628 Единственный бонус от "ссылочности" у стринга это большее количество памяти чем у value type
@vladislavkochegin3628
3 жыл бұрын
@@DmitryStopkevich вы не так понимаете что тут происходит :) Тут в метод Test передаётся копия ссылки. Собственно она и изменяется в пределах этого метода, а как только метод отрабатывает, то копия, которой присвоен новый стринг удаляется, а ссылка в main остаётся неизменной)
Снимай видео о том как ты стал таким крутым программистом
А можно в collision ещё условие отступа от стены типа margin постоянного сделать? Если расстояние, например меньше полуметра, то дальше нельзя.Или это на 6,33 обьяснил?
Чел харош
@user-hq7wf9ge7d
2 жыл бұрын
Только у меня спустя 2 года ничего неполучилось хотя код точ в точ написал как на видео
@user-hq7wf9ge7d
2 жыл бұрын
теперь все получилось (я просто координаты поменял), но получаеться так что вродебы все работает но мигает исли на чтото нажать то останавливаеться почему так?
А можно вопрос, я что-то не понимаю или тут нельзя стрелять? Хотя мне без разницы, я долго искал как можно сделать Ray Casting в C# в консоли, и по этому видос ПРОСТО ТОП! Ставлю лайк)
@gamerscreen6044
Жыл бұрын
Так быстро лайк?) Спасибо)
@gamerscreen6044
Жыл бұрын
Кстати, можно как-то добавить оружие в эту игру?
@DmitryStopkevich
Жыл бұрын
@@gamerscreen6044Можно конечно. Но для начала хорошо бы добавить врагов в виде спрайтов)
А из-за чего может быть трясение? Идет постоянное смещение вверх и вниз по одной строчке # стены (да и потом с \u**** тоже). Как будто считывает 2 разных расстояния через каждую итерацию. Более менее гладко становится только при глубине 20, но все равно достаточно сильно раздражает. А так тема очень интересная) По ней писал курсовую (из-за чего впрочем и решил видос глянуть), но на питоне) И если не трудно, можно полный код
@pess5310
3 жыл бұрын
Могу предположить, что это из-за маленького размера окна консоли (была 50 высота - ставь больше)
@DmitryStopkevich
3 жыл бұрын
Вот проект : www.dropbox.com/s/zg4qaf62hoj2awv/Game3.zip?dl=0
Вот это шедевр, а говорят математика не нужна
@mediafile9995
2 жыл бұрын
Ну, есть же unity, там матеша не нужна. Хы)
@dragoperkovic1097
2 жыл бұрын
@@mediafile9995 гыыыы
Почему то когда автор рисовал объекты поространства вспомнился алтернативная графика commodore 64 в режиме petsi (это местный аналог asci)
круто продолжай в том же духе но можно заменить это чёрные стены на текстуру из интернета!💪👍👍
А ХУ ЕТЬ ТЫ ГЕНИЙ, ОДНОЗНАЧНО ЛАЙК
Почти как вектозавр, только в консоли
@fab4key173
3 жыл бұрын
первое видео вектозавра про шутер также был в консоли...
А сколько лет вы знакомы з программированием?
@DmitryStopkevich
3 жыл бұрын
Я с детства увлекался схемотехникой и программированием как хобби. Ну а рабочего опыта наверное лет 6 всего)
Давно занимаетесь разработкой на c#?
А что делать если консольный вывод не такой быстрый как в вашем видео?
а что делать если выводит только точки?
повторил код до первой запуска, гдето восмой минута. у меня сплошной стена. несколько раз проверил. вроде точно скопировал. но нет сплошная стена. а так контент круто!
@user-fe6fk3qr3e
10 ай бұрын
та же проблема
А я поклоняюсь сине-желтой змее и написал такой шутер на python :)
А можно ссылку на подробное объяснение про угол, под которым будет идти луч, вывод формулы увидел, но не понял, есть что-то подробнее пожалуйста скиньте
@DmitryStopkevich
3 жыл бұрын
Это тригонометрия. Мы знаем координаты игрока на карте и знаем угол под которым он смотрит. Делим экран, например, на 100 вертикальных полос. Для каждой вертикальной полоски экрана мы должны узнать расстояние до стены. Берем, например, первую вертикальную полосу слева. Для того чтоб узнать угол луча в этой полосе, мы должны отнять от угла под которым смотрит игрок половину его угла обзора. Для второй полоски это уже будет половина угла обзора минус 1 угол обзора/100, для третей половина угла обзора минус 2 угла обзора/100 и т.д. А дальше нужно увеличивать растояние для каждого такого луча и проверять куда он попал, для этого синус умножаем на расстояние чтоб узнать Х и косинус умножаем чтоб узнать У. educon.by/index.php/materials/math/trigonometria
Столкнулся с проблемой, у меня система Mac OS и в визуал Студио не дает изменить параметры ширины и высоты консоли, вот ошибка Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
Ума не дам, вроде код в точности как в видео, но угол обзора на карте отображается не корректно, а если точнее то после изменения угла звездочки не пропадают. Разобрался: нужно инициализировать карту каждый раз после считывания клавиши с клавиатуры. В видео этот момент как-то быстро проскакивает не сразу заметил.
Нихрена...
Какие расширения надо в VisualStudio установить чтобы код компилировался?
@DmitryStopkevich
3 ай бұрын
.net и c#
Вопрос к автору, а настоящие шутеры пишуться примерно также? (ну не учитывая использование библиотек) Я просто работаю с Asp.Net, и всегда было интересно как эти игры пишуться;)
@DmitryStopkevich
3 жыл бұрын
Нет конечно) Игры делаются на готовых движках в основном. Например если вы хотите использовать C#, то можете посмотреть материалы по Unity 3D.
@volodymyr_o
3 жыл бұрын
@@DmitryStopkevich мне не интересно научиться это делать, просто хочу понять как эти движки разрабатывались. Там ведь тоже эти векторы, 3д-математика и тд
@DmitryStopkevich
3 жыл бұрын
@@volodymyr_o Да, в основе движков конечно лежат простейшая математика и механизмы вроде проецирования 3д на плоскость
у меня почему-то не работает управление нажимаю w и ведёт в другую сторону, код проверил, написано так же как и в видео.
я не понимаю, почему у тебя buffer: и left: с top: подсвечиваются серым
Круто! А можно пожалуйста exe шник?
@DmitryStopkevich
3 жыл бұрын
В описании есть ссылка на проект
@Last1k
3 жыл бұрын
@@DmitryStopkevich Исходник?
блин, вроде все делаю так же как у тебя, но у меня прям трясет картинку, как - будто намного медленнее чем у тебя все выводит в консоль. это можно как то решить? ускорить
@DmitryStopkevich
Жыл бұрын
Не очень понимаю что значит трясет. Попробуй уменьшить разрешение в самих настройках консоли и в программе screen height и width
Мог бы добавить облака звёзды солнце луну смену дня
Все отлично работает, но появилась проблема :( В режиме отладки все работает идеально! Однако при запуске exe файла консоль ведет себя странно, словно периодически не допечатывает некоторые строки. В итоге картинка дергается(
@DmitryStopkevich
2 жыл бұрын
Надо поменять настройки консоли в соответствии с переменными)
Что за мощная музыка играет на фоне?)
@DmitryStopkevich
3 жыл бұрын
Ремиксы саундтрека из Doom (1, 2) из комьюнити zandronum :)
Найс, в названии говорится про шутер, а на деле просто бродилка
Круто, но почему то дрожиn сильно изображение, менял высоту окна и глубину - не помогает. Не подскажете в чем может быть дело? Причем дрожание есть как в моей версии, которую я писал по видео, так и когда скачиваю вашу - то же самое, при fps 150... спасибо.
@DmitryStopkevich
3 жыл бұрын
Попробуй выставить такие же параметры окна консоли как в видео и переменные ScreenWidth, ScreenHeight соответственно, а так же шрифт
@user-et2yq3ro9f
Жыл бұрын
Как решили эту проблему?
@user-et2yq3ro9f
Жыл бұрын
640 480, как вы решили эту проблему?
Мне сюда рано лезть...
как запустить проект если ти его скачал?
А что за музыка в начале?
@DmitryStopkevich
3 жыл бұрын
Sonic Clang - Doom E1M6
Что делать если пишет что System.Array не содержит Fill?
@DmitryStopkevich
3 жыл бұрын
Нужно выбрать .net framework 5.0 или выше. Или написать метод руками чтоб заполнить массив)
@hoyoreverse
3 жыл бұрын
for (int i=0; i arr[i] = value }
А врага и оружие можно сделать можно сделать?
@DmitryStopkevich
2 жыл бұрын
Конечно можно. Для врагов нужно использовать "спрайты", а оружие просто рисовать картинкой внизу экрана
@albruspigtailed5039
2 жыл бұрын
@@DmitryStopkevich спс
@albruspigtailed5039
2 жыл бұрын
@@DmitryStopkevich слушай, а как ты думаешь как трудно будет сделать игру по типу ГТА 1 похожим способом
@Nestermanych
2 жыл бұрын
@@DmitryStopkevich Пишу на VS Code. Столкнулся с проблемой, у меня система Mac OS и в визуал Студио не дает изменить параметры ширины и высоты консоли, вот ошибка Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
@DmitryStopkevich
2 жыл бұрын
@@Nestermanych На маке эти функции не работают, там консоль подругому устроена. Надо гуглить как изменять эти параметры
очень интересно но ни фига не понятно
Откуда ютуб знает что мне интересен с если я на ютубе об этом видео не смотрел
Char c = ' ' ; While (true) { If (Console.KeyAvailable) { C = Console.ReadKey().KeyChar; } Array.Fill(array: Screen, c) } Fill подчеркивается красным и говорит что array не содержит определения для Fill. Что делать помогите пожалуйста
@DmitryStopkevich
Жыл бұрын
У тебя стоит старая версия .net, в ней ещё нет такой функции для массивов. Ты можешь сам написать for(int i = 0; i { Screen[i] = c; }
@user-fq1sw3sf8d
Жыл бұрын
@@DmitryStopkevich это за место Array.Fill(array: Screen, c)? И будут ли такие же ошибки дальше?
@DmitryStopkevich
Жыл бұрын
@@user-fq1sw3sf8dда, вместо array.fill(). Не будет ошибок)
@user-fq1sw3sf8d
Жыл бұрын
@@DmitryStopkevich большое спасибо
А может цвет символов в консоли можно менять при уже запущенной консоли? может через саму Винду? Тогда можно цветную игру сделать =))
@DmitryStopkevich
3 жыл бұрын
Конечно можно) Еще и текстуры можно наложить на стены в виде цветных символов
@officialdakari
2 жыл бұрын
цвет символов - Console.ForegroundColor / Console.BackgroundColor
Я:играю в кс го Мои тиммейты:
If else if else if else if else if...
Уважаемы продолжения ждать?
@DmitryStopkevich
4 жыл бұрын
Какая тема интересует?
@anstancecouy5020
4 жыл бұрын
@@DmitryStopkevich Продолжение по играм в консоли
@venbogat
3 жыл бұрын
нет
@DmitryStopkevich
2 жыл бұрын
@@anstancecouy5020 kzread.info/dash/bejne/goyAx6ukj8i5Yag.html&ab_channel=DmitryStopkevich
а как сделать лучше графику?
@k390r5
3 жыл бұрын
А это уже графический движок надо написать
@kostyafrompiter
3 жыл бұрын
Либо взять unity
Не компилируется (27, 21): '"Console" не содержит определение для "SetWindowSize". (28, 21): '"Console" не содержит определение для "SetBufferSize". (29, 21): '"Console" не содержит определение для "CursorVisible". (125, 31): Аргумент 1: не удается преобразовать из "char[]" в "string".
Вопрос, у меня в Array.Fill(Screen, c); Ошибка CS0117 '"Array" не содержит определение для "Fill". Кто знает как исправить?
@DmitryStopkevich
3 жыл бұрын
Этот метод есть только в .net 5.0 или .net core начиная с версии 2. Ты скорее всего работаешь на .net 4.5, в этом случае напиши отдельный метод для заполнения массива используя цикл for
@yargus613
3 жыл бұрын
@@DmitryStopkevich Я работал в Консольное приложение (.net framework)
@rorka1252
3 жыл бұрын
@@yargus613 .net framework 5.0 выбери
@amiccieofficial554
3 жыл бұрын
@@rorka1252 ахах тупой вопрос (где выбрать?)
@rorka1252
3 жыл бұрын
@@amiccieofficial554 в студии
Желательно пр каждой строчики кода показывать что происходит а так максимально не понятно