Процесс создания простой 3д бродилки без дополнительных библиотек на основе технологии Ray Casting Скачать проект можно по ссылке: www.dropbox.co... Проект с генерацией лабиринта (нажать пробел): github.com/dms...
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
Очень круто!!! Я тоже написал такой шутер, но пошел дальше: я еще и текстурировать стены смог!!! А в будущем планирую сделать мультиплеер и генерацию каких-нибудь структур.
Если перед вами сплошная стена, это нормально - просто координаты игрока равны (0; 0) по x и по y соответственно. Поменяйте их, как в видео, на (3; 3). Также, если имеется проблема с дёрганой прорисовкой в консоли, это проблема с разрешением в консоли. Пишите: Console.SetWindowSize(ScreenWidth, ScreenHeight + 1); Console.SetBufferSize(ScreenWidth, ScreenHeight + 1); Поиграйтесь с разрешением в консоли, если мой вариант не помогает. Надеюсь кому-то поможет.
Круто, однако идти вдоль луча по 0.1 далеко не оптимально. На прямоугольной сетке raycast можно свести к построению линии алгоритмом Брезенхэма, где пикселями выступают блоки. В результате определение пересечения будет на порядок быстрее, а если использовать fixed point, то прям ну очень быстро. Собств-но как оно и было сделано в Wolfenstein 3D.
Очень крутой видос, но хочется сделать замечание по поводу этого момента 25:25 Во-первых стринг и стрингбилдер оба ссылочные А причина по которой в этом сценарии стрингбилдер работает быстрее это потому что стринг неизменяемый, и когда мы его изменяем, то на самом деле для него каждый раз создаётся новый объект (что достаточно долго), а вот стрингбилдер уже изменять можно и никаких новых созданий объектов не происходит
Вы правы, они оба ссылочные. Тем не менее, как вы упомянули, стринг несет в себе много характеристик велью типов, являясь неизменяемым объектом, а также когда мы передаём его в методы, в них попадает копия этого объекта, так же как происходит с интом, например. Так что если называть стринг ссылочным типом, теряется суть его поведения. Архитектура этого типа ссылочная по историческим причинам, еще с с++. В то же время StringBuilder это классический reference тип, который единожды инициализируется и в последствии работа ведется с одним экземпляром
@@DmitryStopkevich да, так и есть, но с одним я тут не согласен. Насколько я знаю стринг при передаче его в качестве параметра не копируется. Копируется только ссылка на него
@@vladislavkochegin3628 Вот простой эксперимент: void Main() { string s = "Foo"; Test(s); Console.WriteLine(s); //Выведется Foo. Если бы в Test пришла ссылка на s, то при изменении его внутри этого метода, он бы изменился и в maine :) } void Test(string s) { s = "Bar"; }
@@DmitryStopkevich вы не так понимаете что тут происходит :) Тут в метод Test передаётся копия ссылки. Собственно она и изменяется в пределах этого метода, а как только метод отрабатывает, то копия, которой присвоен новый стринг удаляется, а ссылка в main остаётся неизменной)
повторил код до первой запуска, гдето восмой минута. у меня сплошной стена. несколько раз проверил. вроде точно скопировал. но нет сплошная стена. а так контент круто!
А можно вопрос, я что-то не понимаю или тут нельзя стрелять? Хотя мне без разницы, я долго искал как можно сделать Ray Casting в C# в консоли, и по этому видос ПРОСТО ТОП! Ставлю лайк)
А можно в collision ещё условие отступа от стены типа margin постоянного сделать? Если расстояние, например меньше полуметра, то дальше нельзя.Или это на 6,33 обьяснил?
Ума не дам, вроде код в точности как в видео, но угол обзора на карте отображается не корректно, а если точнее то после изменения угла звездочки не пропадают. Разобрался: нужно инициализировать карту каждый раз после считывания клавиши с клавиатуры. В видео этот момент как-то быстро проскакивает не сразу заметил.
А из-за чего может быть трясение? Идет постоянное смещение вверх и вниз по одной строчке # стены (да и потом с \u**** тоже). Как будто считывает 2 разных расстояния через каждую итерацию. Более менее гладко становится только при глубине 20, но все равно достаточно сильно раздражает. А так тема очень интересная) По ней писал курсовую (из-за чего впрочем и решил видос глянуть), но на питоне) И если не трудно, можно полный код
Столкнулся с проблемой, у меня система Mac OS и в визуал Студио не дает изменить параметры ширины и высоты консоли, вот ошибка Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
В консоли можно менять цвет шрифта, например: Console.ForegroundColor = ConsoleColor.Blue; Посмотреть все доступные цвета можно через enum: ConsoleColor[] consoleColors = (ConsoleColor[])ConsoleColor.GetValues(typeof(ConsoleColor));
А можно ссылку на подробное объяснение про угол, под которым будет идти луч, вывод формулы увидел, но не понял, есть что-то подробнее пожалуйста скиньте
Это тригонометрия. Мы знаем координаты игрока на карте и знаем угол под которым он смотрит. Делим экран, например, на 100 вертикальных полос. Для каждой вертикальной полоски экрана мы должны узнать расстояние до стены. Берем, например, первую вертикальную полосу слева. Для того чтоб узнать угол луча в этой полосе, мы должны отнять от угла под которым смотрит игрок половину его угла обзора. Для второй полоски это уже будет половина угла обзора минус 1 угол обзора/100, для третей половина угла обзора минус 2 угла обзора/100 и т.д. А дальше нужно увеличивать растояние для каждого такого луча и проверять куда он попал, для этого синус умножаем на расстояние чтоб узнать Х и косинус умножаем чтоб узнать У. educon.by/index.php/materials/math/trigonometria
блин, вроде все делаю так же как у тебя, но у меня прям трясет картинку, как - будто намного медленнее чем у тебя все выводит в консоль. это можно как то решить? ускорить
Все отлично работает, но появилась проблема :( В режиме отладки все работает идеально! Однако при запуске exe файла консоль ведет себя странно, словно периодически не допечатывает некоторые строки. В итоге картинка дергается(
Char c = ' ' ; While (true) { If (Console.KeyAvailable) { C = Console.ReadKey().KeyChar; } Array.Fill(array: Screen, c) } Fill подчеркивается красным и говорит что array не содержит определения для Fill. Что делать помогите пожалуйста
У тебя стоит старая версия .net, в ней ещё нет такой функции для массивов. Ты можешь сам написать for(int i = 0; i < Screen.Length; i++) { Screen[i] = c; }
Не компилируется (27, 21): '"Console" не содержит определение для "SetWindowSize". (28, 21): '"Console" не содержит определение для "SetBufferSize". (29, 21): '"Console" не содержит определение для "CursorVisible". (125, 31): Аргумент 1: не удается преобразовать из "char[]" в "string".
Вопрос к автору, а настоящие шутеры пишуться примерно также? (ну не учитывая использование библиотек) Я просто работаю с Asp.Net, и всегда было интересно как эти игры пишуться;)
@@DmitryStopkevich мне не интересно научиться это делать, просто хочу понять как эти движки разрабатывались. Там ведь тоже эти векторы, 3д-математика и тд
Круто, но почему то дрожиn сильно изображение, менял высоту окна и глубину - не помогает. Не подскажете в чем может быть дело? Причем дрожание есть как в моей версии, которую я писал по видео, так и когда скачиваю вашу - то же самое, при fps 150... спасибо.
@@DmitryStopkevich Пишу на VS Code. Столкнулся с проблемой, у меня система Mac OS и в визуал Студио не дает изменить параметры ширины и высоты консоли, вот ошибка Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
теперь все получилось (я просто координаты поменял), но получаеться так что вродебы все работает но мигает исли на чтото нажать то останавливаеться почему так?
Этот метод есть только в .net 5.0 или .net core начиная с версии 2. Ты скорее всего работаешь на .net 4.5, в этом случае напиши отдельный метод для заполнения массива используя цикл for