![]() |
Ответ: Vivo
http://rghost.ru/36821364
Это последняя версия, на сколько я помню:) Копи-паста предыдущего поста(из-за новой страницы его могли не заметить): Пока моделлер работает, заняться мне нечем, поэтому решил-ка я позаниматься этим проектам. По-сколько кроме быдлокода я ничего в исходниках не нашёл, решил писать всё заново, отказавшись от экранов. Они были удобны, но многие говорили что это убивает геймлей. В общем, помогите с выбором: 1). Делать 9 чанков размером с экран, чтобы они окружали текущий экран. 2). Делать уйму маленьких чанков. 3). Послать всех и оставить экраны P.S. в первых двух случаях игрок находится всегда в центре экрана. И ещё, вдруг у кого завалялась инфа по данной теме, поделитесь, буду признателен( тоже к двум первым случаям относится). |
Ответ: Vivo
В общем, что-то наподобие чанков:
Код:
P.S. R1 и R2 - ширина и высота экрана. |
Ответ: Vivo
Все, основные баги убраны. Осталось только одно: как увеличить скорость данного кода?
|
Ответ: Vivo
Можно например убрать Delay 2000.
|
Ответ: Vivo
Код:
Function Update_World() |
Ответ: Vivo
For i=chunk_x-1 To chunk_x+1
For i1=chunk_y-1 To chunk_y+1 fl=OpenFile("map\"+i+","+i1+".txt") For i2=0 To 15 For i3=0 To 15 ;;;If 512*i-camera_x+i2*32<camera_x+R1 And 512*i1-camera_y+i3*32<camera_y+R2 And 512*i-camera_x+i2*32>camera_x And 512*i1-camera_y+i3*32>camera_y DrawImage tile(ReadInt(fl)),512*i-camera_x+i2*32,512*i1-camera_y+i3*32 EndIf Next Next CloseFile(fl) Next Next Четверной цикл, это раз. грузишь из файла в главном цикле - это жестокое два. :) За оперативку не беспокойся, грузи сразу все чанки своего уровня. А вот проход по чанкам делай в зависимости от того - влазит ли чанк в область экрана или нет. Те что не влазят просто пропускаются. |
Ответ: Vivo
Код:
Function CreateChunk(i,i1) |
Ответ: Vivo
Вообще плохо. Во-первых, ненадо при каждом вызове функций трогать файл. Его просто открываешь при запуске программы, а при выходе закрываешь и всё, больше его не трогаешь. Хотя на самом деле нужно весь файл при запуске слить в оперативку, и потом, при выходе записать туда все изменения.
Также файл - это не список. Тебе не обязательно перебирать все элементы чтобы изменить только один. А мгновенный доступ делается какраз через SeekFile(), просто ты с ним не разобрался. Но опять-же, если работать с данными в оперативке то весь этот лишний гемор будет не нужен. |
Ответ: Vivo
На счет файла. Он всегда разный, не откроешь ты его один раз при запуске. Это файл с в котором находится инфа о чанке.
Слить в оперативку тоже не получится, ибо не удобно. В массиве элемент не может быть отрицательным( a(-5) - невозможно ), а х и у чанка могут быть отрицательными. В общем пойду курить SeekFile видимо. |
Ответ: Vivo
Вот я играл в твою демку. Расскажи немного вообще про построение мира. Чанк єто один єкран? И сколько вообще у тебя должно быть чанков? И главное, у тебя по файлу на чанк?
|
Ответ: Vivo
фейспалм.жпг
Если у тебя несколько файлов, то открой при запуске сразу все. При выходе соответсвенно все и закрой. В массиве ествественно не может быть отрицательных элементов, но тебе никто не мешает сделать костыль самому, если уж так хочется. Например у тебя 50 чанков. Функция вызова: function getchunk(nr) return chunkarr[nr+25] end function вводим от -25 до 25, на выходе получаем нужный чанк. И никаких проблем. |
Ответ: Vivo
Nite
Их бесконечность, понимаешь? Бесконечность. Нету рамок никаких. В той демке, что я давал все отличается от нынешнего. Могу описать как сейчас дела обстоят, или демку кинуть, для лучшего понимания. В общем, один чанк это один текстовый файл, название которого равно его координатам. Он состоит из 256 блоков. Их id и хранится в файле. Чанков может быть неограниченое количество( вернее ограниченное свободным местом на диске), так что в рамку их не впишешь. |
Ответ: Vivo
В компьютерном мире нету бесконечности.
|
Ответ: Vivo
Хорошо, очень-очень большой мир. Не -25,25, не -250,250, не -25000,25000. Массив не потянет.
|
Ответ: Vivo
Немного математики для наглядности размеров мира. Пока что, координаты чанков - integer, значит крайние число - 2,147,483,647. Один чанк - 512 пикселей. Скорость игрока - 2 пикселя за тик, максимальное фпс - 60, значит скорость игрока - 120 пикселей в секунду. (2,147,483,647*512)/120 - время за которое игрок пройдёт до конечного чанка. А это - 290 лет, если я не ошибся. Так что поверьте, это сравнимо с бесконечностью.
|
Ответ: Vivo
Припустим у тебя есть переменная PlayerRange -кеп сообщает что это обзор. Значит у тебя при PlayerRange=2 будет ситуация такова:
Перс стоит на чанке. Это 0+1 чанк на котором мы стоим Видит он перед собой еще 2 чанка Это 0+1+PlayerRange Видит он еще и за собой 2 чанка. Это 0+1+PlayerRange+PlayerRange Соответственно общий размер локи будет PlayerRange*2+1 Делаешь массив Dim Chunks(PlayerRange*2,PlayerRange*2) - тут не делаешь +1 ибо нумерация массива начинается с нуля. Типо при PlayerRange*2+1 у тебя будет не 5 рядков и строк а 6 рядков и строк. А тут последняя нафик не нужна. Теперь ахтунк! Учишь это Связанные списки в Blitz3D И учишся делать так, что б в массиве Chunks(PlayerRange*2,PlayerRange*2) Каждая ячейка отвечала ТОЛЬКО АДРЕСУ на массив типов с инфой уже про каждый кубик. Потом при передвижении игрока с одного чанка на второй программируешь сдвиг рядков(или столбцов) массива содержащего АДРЕСА на другие массивы с инфой про кубики. А освободившийся рядок(или столбец) заполняешь новой инфой с файлов и не мгновенно, а по кусочку за 1 проход цикла. (звучит это весьма просто, но на собственном опыте говорю - гемора выше крыши. Я с этим до конца не разобравшись забил болт и отложил эту цель на момент релиза игры.) Вполне вероятно что ты меня плохо понимаешь, мой тебе совет, откажись от неограниченного мира, сделай хоть ограниченный но качественно. А потом думай над тем как делать его "бесконечным". Даже Нотч первые демки майнкрафта показывал с ограниченной локой(где то читал). |
Ответ: Vivo
|
Ответ: Vivo
Все эти проблемы к данной теме не относятся. Это вам не майнкрафт, который 3д, и в котором есть дальность обзора, например. Тут 2д (а может и 3д, это неважно) игра, с зафиксированным видом сверху. Так-что в любой момент времени максимум может понадобится отображать 3 чанка. О какой бесконечности речь? Короче, всё это реализуемо с помощью массивов и всю эту мизерную карту можно и нужно засунуть в 1 файл. Учите матчасть ТС.
|
Ответ: Vivo
Так я и отображаю только 3 чанка.
Кстати, у меня есть версия игры с массивами, карту можно пробежать за 44 часа, по моим расчётам. Вообще без чанков и всего такого. Можете соизволить объяснить в чём файлы так ужасны? Чего все на них так набросились? Nite Видимо мы вообще говорим о разных вещах, я не понимаю о какой мизерной карте идёт речь. Можешь подробно объяснить, как с твоей точки зрения всё это выглядит? |
Ответ: Vivo
|
Ответ: Vivo
|
Ответ: Vivo
Hulk-DS, Да, конечно. Основы программирования и тригонометрии, а так-же работа с векторами. Всё что я пытаюсь втолковать топикстартеру - это самые простые и очевидные вещи. Я не уверен что их можно будет так-же легко применить к такой модели мира в 3д, со свободным обзором.
Nikich, Тебе нужно, чтобы у игрока была земля под ногами, ну и например заранее ещё 8 чанков во все стороны от игрока (если предположить что 1 чанк у тебя по размерам как 1 экран). Итого у тебя в начале получается 9 чанков. А ты говоришь про какието 2 миллиарда:dontknow:. Потом, если игрок куда-то побежаль, начинаешь постепенно добавлять чанки, генерируя их в зависимости от ландшафта окружающих чанков. Вот собственно и вся логика. Если игрок бежит в одну сторону уже 2-3 часа, например, начинаешь с другого конца (тоест с позиции откуда игрок стартовал) удалять чанки, а потом, если когото приспичит ещё и назад прогулятся, то опять-же генерируешь новые чанки. А то, что игровую карту нужно хранить в одном файле, а не в кучке маленьких - это вообще само собой разумеется. Это и по быстродействию и по удобству и всем прочим параметрам намного удобнее и круче. |
Ответ: Vivo
В одном файле ты всё не удержишь. Представь, когда игрок будет на чанке с координатами -25,25, то ты предлагаешь пробежаться по всему файлу дабы найти этот чанк?
Конечно, сразу полезу мысли, о том, что ведь можно это дело SeekFile'ом красиво обыграть, но так тоже не выйдет, так как нельзя определить в каком месте находится этот чанк( вдруг он был сгенерирован в самом начале игры, или когда уже было открыто 1000 чанков ). Так что на файлы разбивать точно придётся. Хорошо, представь что у тебя есть эти 9 чанков. Как я понял, хранить ты их хочешь в каком-то отдельном файле. Так а смысл тогда использовать массив? Что я работаю напрямую с файлами, что по твоему способу я буду работать с файлами чтобы заполнить этот массив, а потом уже из массива брать информация о блоках. Где выгода? |
Ответ: Vivo
Цитата:
Кроме того у Нотча не лежит в папке пару тищь файлов когда пробежишься по карте. |
Ответ: Vivo
Да только SeekFileом и нужно. Тебе-же доступны координаты игрока. Темболее у тебя ведь даже не будет резких скачков, т.е. максимум может понадобиться сдвиг на один чанк в какую-то сторону. В одном файле нужно хранить чанки так-же как они расположены реально, т.е. будет требоваться полное переписывание файла с картой при добавлений нового чанка. Вот тут и вылазить причина преимущества массивов. Ты один раз загружаешь карту с медленного ЖД и один раз её туда-же и сохраняешь. При запуске и при выходе. А всё остальное время работаешь с быстрой оперативкой.
Вообще постоянный перебор чего-либо это обычно самые слабые и тормозящие места в логике. По возможности нужно этого избегать. Что такое архив? Это 1(!) файл, который содержит в себе много(!!!) более мелких файлов. Уличная магия? Не, просто алгоритмы. |
Ответ: Vivo
Вложений: 1
Ну, я сделал по-своему, просьба отписаться сколько у кого фпс, на каком железе.
А в том способе что ты сейчас написал, тоже есть изъян. Тебе ведь придеться расширить массив, если игрок решил далеко зайти. А для этого нужно выгрозить весь этот массив, расширить его и опять заполнить. Сколько же это гемора. З.Ы. я верил в магию:( |
Ответ: Vivo
В обычные моменты около 30
Когда приходят глюки от 8 и до 18 сильно скачет Целерон 1 ядро 1.8 |
Ответ: Vivo
стабильно 39-40 FPS, i5 со встроенным видео.
|
Ответ: Vivo
25-30 fps, ёжик т101мт (конфиг в подписи). Вечером проверю на стационаре
|
Ответ: Vivo
Вложений: 1
А не могли бы в еще отписаться о скорости ваших жестких дисков, ведь как я понял, при прямом использовании файлов(они открываются, оттуда считывается информация, они закрываются, и все это в риалтайме) важна именно она.
В аттаче версия, без чанков, без файлов, просто двумерный массив. Просто и сердито. Карта 10000х10000(381 мб рамки). Генерируется приблизительно 5 секунд. Также, пожалуйста, отпишитесь о фпс и укажите характеристики своего компьютера( тут уже скорость винчестера не влият:) ). Хотя признаюсь, был шокирован столь низким фпс в предыдущей версии. Видимо всё же с массивами надо колдовать... |
Ответ: Vivo
Цитата:
ФПС стабильный, около 55, без падений. |
Ответ: Vivo
Почти:)
А в предыдущей версии(кликабельно)? Nite, блин, как у тебя всё просто. "А если он решит и назад прогуляться генерируешь новые чанки". Отлично! Игрок решил прогуляться за грибами, возвращается, а на месте его дома уже чистая земелька. Так ведь тоже не катит. Не выйдет тут массивами. По крайней мере так просто не выйдет. И кстати, у Нотча всё разбито на файлы. Пруф "Игровой мир (или Карта) представляет собой иерархическую систему директорий и файлов, хранящую информацию о каждом блоке, предмете и существе в мире и об их состоянии." |
Ответ: Vivo
Какова цель игры? Может игроку и нет смысла на 10 тыщ клеток ходить, а достаточно сделать более насыщенное игровое действо на поле меньшего размера.
|
Ответ: Vivo
В предыдущей версии фпс около 27, иногда падения до 5 - 10
При переходах между квадтатами постоянно подтормаживает. |
Ответ: Vivo
О целях дискуссии уже были.
Эту игру можно смело называть клоном майнкрафта, с более выраженным упором на выживание. Целей нету. Хотя нет, неверно. Цель такая же как в майнкрафте. Бесконечная (МоКа, большая :) ) карта, скорее всего просто как испытание. Я сомневаюсь что и в майнкрафте всем так нужна бесконечная( большая ) карта. Просто ЧСВ, да игра солиднее выглядит. Согласитесь, фраза:" Ну карта не бесконечная, не смог ", звучит слабовато. А то что площадь мира в моей игре больше площади Земли в 36 164 раз звучит очень даже круто. |
Ответ: Vivo
Вложений: 1
Фух, мозг что-то вообще варить перестал, как я за эти массивы взялся. Пожалуйста, можете помочь? Видимо мой способ не является самым лучшим, так как столько геморроя я ещё не испытывал. Сейчас я объясню свою задумку максимально подробно.
Возьмём массив Sector(6,6,15,15), первые два элемента которого отвечают за х и у чанка, относительно игрока(!). Для начала их заполним, взяв всю инфу из файлов. А вот как они должны рисоваться: Код:
for i=0 to 6 Таблица, поясняющая суть: Больший квадрат - сектор, меньшие - чанки, центральный - тот в коором находится игрок. Как вы могли заметить, находить он в 3,3 - вот откуда берётся это i-3. ((3-i)+chunk_x)*512 - почему же 512? Потому что 512 - это количество пикселей, которое занимает один чанк(он состоит из 16 блоков, 32х32 каждый). i2*32 - координата блока, умноженная на 2 из-за его ширины. С осью у тоже самое. Фух, с пробежкой мы разобрались. Теперь нам надо сделать так, чтобы если игрок переходит на следующий чанк, массив подгружал в себя новые чанки, и записывал в файл крайние чанки. Тут то и заключается проблема. Я вообще не знаю, как бы это красиво обыграть. Знаю как некрасиво - взять наш Sector, сделать четверной перебор, чтобы сдвинуть все чанки, потом ещё перебор на загрузки новых чанков, а потом ещё перебор на выгрузку старых. Остановился я на определении, в какую сторону нужно производить сдвиг. Вот моя функция для перемещения игрока: Код:
З.Ы. особо интересует объяснения Nite'a. Как я понял, у него есть идея по реализации, но что-то я в ней не особо варю:) |
Ответ: Vivo
Аттачи не прикрепились
|
Ответ: Vivo
Пофикил.
|
Ответ: Vivo
Я написал псевдо-код с комментариями, посмотри, может тебе пригодится такое.
|
Ответ: Vivo
Вложений: 1
А теперь сколько фпс? Делал всё же по своему, но с массивами. Заметен не плавный переход в те области, где чанков ещё нету.
|
Ответ: Vivo
фпс: 19-29, в основном 19-20, комп 4 ядра, но видео встроенная AMD 760G.
Я смотрю у тебя главный герой в картинке идёт в одну сторону, а в игре во все, то есть программно поворачивается, это тоже тормоза прибавляет. Как сказано в справке блитца для RotateImage: This command is not fast enough to render rotations in real time! Но ты уже в сторону блитцмакса идёшь, так что поворот перестанет быть проблемой. |
Ответ: Vivo
Я риалтаймом и не вращаю. Делаю массив, и в него вбиваю уже повернутые картинки, а потом рисую уже эти картинки, в зависимости от направления игрока.
З.Ы. Это точно из-за видеокарты, я забыл сделать так, чтобы рисовались только те блоки что видны:) |
Ответ: Vivo
Стабильно 45 FPS - core i5 со встроенным видео.
|
Ответ: Vivo
59 fps, i5 2500k 3.3, 4 ядра
Загрузка видна только 1 раз, когда пересекаю самую первую зону. Возможно в этот момент генерируется многа файлов сразу, поэтому так. А при остальных пересечениях не генерируются, пока не дойду до определенной зоны. |
Ответ: Vivo
Вложений: 1
Благодаря Максу теперь стало возможным сделать градиентный свет!
|
Ответ: Vivo
Реквестирую конфигу чтоб можно былом сменить разрешение и устанавливать оконный режим.
Comic Sans MS - плохой шрифт. |
Ответ: Vivo
Оконный режим сделаю как в Майнкрафте, разрешение пока не знаю. Может тоже на F какой-нибудь. Менюшку делать так долго... И чем Comic Sans плох?
Кстати, можно тему перенести в проекты на Максе? |
Ответ: Vivo
Thanks!
а можно подробнее о пиксмапах? |
Ответ: Vivo
Цитата:
Вся твоя программа использует для работы оперативную память ПК, а визуализация графики происходит с использованием видео памяти. Для того чтоб допустим вывести изображение на экран нужно его сначала считать с жёсткого диска потом преобразовать в нужный для видео карты формат, "закачать изображение" на видео карту и дать напутствие видео карте чтоб она вывела на экран наше изображение. Дак вот в BlitzMax есть класс Image. Он содержит в себе Pixmap и ссылку на хранимое в видеокарте изображение. Pixmap это преобразованный специальным образом для видео карты универсальный набор пикселей. Который позволяет "на лету" менять разрешение экрана и даже сменять в реальном времени GAPI с DirectX на OpenGL например. Он хранится у тебя локально в оперативе компа. И когда стартует 3d девайз или перезапускается (смена разрешения) пиксмапа закачивается в видео память в виде 2D текстуры. Работа с пиксмапой ничего не требует. Вся работа с ней скрыта за тенью LoadImage LoadAnimImage. И ты просто можешь менять разрешение "на лету" не перезагружая заново все ресурсы как бы это надо было бы делать в Blitz3D. |
Ответ: Vivo
Можете подсказать, как обычно делается физика в платформерах? Меня волнует именно прыжки. Я решил перенести Виво на вид сбоку, и наткнулся на проблему с прыжками. Дело в том, что есть погрешность в пару пикселей . Подумав что это нормально, ведь нельзя добиться идеала, я зашёл в Террарию. И там я увидел что погрешностей там нет. Ну вообще нету. Вот мне и интересно, может я что-то не так делаю. Так что, если не сложно, напишите как кто делал прыжки в платформерах.
|
Ответ: Vivo
Погрешность чего?
|
Ответ: Vivo
Есть расстояние между игроком и блоком под ним. Иногда он немного выше, иногда - в сам блок влазит. Дело косметическое, понимаю, но мелочь довольно не приятная. И вообще, как делаются правильно прыжки? Вот мой черновой вариант:
Код:
dx=KeyDown(KEY_D)-KeyDown(KEY_A) |
Ответ: Vivo
При завершении прыжка корректируй позицию игрока так, чтобы между блоком и игроком не было зазора. Просто проверяй на сколько подвинуть и двигай, т.к. координаты и размеры известны, то это легко получится.
|
Ответ: Vivo
Что-то всё равно не очень гладко выходит. Есть у кого исходники платформеров на максе ил блитц3д? Буду благодарен. Или пожалуйста, просто киньте сюда код отвечающий за передвижение и прыжки.
|
Ответ: Vivo
Вот этот проект посмотри: http://forum.boolean.name/showthread.php?t=5751
|
Ответ: Vivo
Спасибо. Кстати, можно ли как-то сделать Include "abc.txt"? Мне очень понравилась система в Stranded 2. Там вообще можно новую игру в .txt написать.
|
Ответ: Vivo
Цитата:
То, что Include это не директива - странно, но этому есть применение. Include может возвращать результат, Include можно вызывать по условию и тд. По сути весь твой код внутри Include оборачивается как бы в функцию (на самом деле GOTO) и его можно вызывать сколь угодно раз, однако не советую так делать. Для этого есть функции/методы. А при компиляции все твои Include компилируются в exe вместе с главным файлом вне зависимости от того как ты эти include используешь. То, что ты хочешь сделать именуется скриптовым языком. В Stranded используется LUA. В BlitzMax уже есть модуль работы с LUA и даже несколько сторонних модулей упрощающих работу с ним. Немного на русском http://blitzetc.blitzmax.ru/index.php/BlitzMax_и_LUA Wiki по встроенному в BlitzMax модулю LUA http://en.wikibooks.org/wiki/BlitzMa...Other/Lua_Core AXE LUA модуль http://en.wikibooks.org/wiki/BlitzMax/Modules/Axe/Lua http://lua-users.org/wiki/BlitzMax Мануал по синтаксису LUA (можно особо не зачитываться так как луа простейший) http://www.lua.org/manual/5.1/ |
Ответ: Vivo
Блин, что-то вконец ничего не получается. С осью y разобрался, а вот с x вообще лажа:( Помогите найти ошибку, пожалуйста. Проблема в том, что игрок всё равно может проникнуть через блок. Хотя я думаю что у меня подход неверный, коллизии в тайловой игре как-то не очень. З.Ы. код jimon'a посмотреть не смог, файл удалили. |
Ответ: Vivo
а почему бы не взять физический движок ?
|
Ответ: Vivo
Потому что мне нужно только перемещение от физики.
|
Ответ: Vivo
Цитата:
Я сделал сам 3 картинки, игрока 16х32 и 2 тайла размером 16х16, но по Х-координате нет препятствий в твоей карте, есть сплошной пол и небо. даже не ясно движется игрок в сторону или нет. |
Ответ: Vivo
Блоки можно ставить и разрушать на левую и правую кнопку мыши.
|
Ответ: Vivo
Вложений: 1
Вот он. Проблема та же - что-то не так с перемещением по "x". Добавил генерацию мира рэндомную, чтобы можно было не строить препятствия.
|
Часовой пояс GMT +4, время: 23:45. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot