Экспериментировал вчера с растягиванием текстур.
То, что вышло - это левые два блока кирпичной текстуры, растянутые в 2 и 8 раз по высоте.
Получилось не очень презентабельно, да и довольно бесполезно, но зато быстро, так как я растягивал сразу строки, а не отдельные пиксели.
Экранная память Commodore в режиме hi-rez устроена таким образом, что каждые 8 последовательных байт отвечают за отрисовку одного знакоместа 8*8 пикселей, а следующие 8 байт – за отрисовку следующего знакоместа, поэтому расширять текстуру построчно оказалось довольно дешевым с точки зрения процессора занятием.
Но что, если я хочу расширить текстуру не только по высоте, но и по ширине? Тогда придется работать с каждым пикселем, что, думаю, будет довольно затратно, потому что придется обращаться уже не к байтам, а к каждому биту (или паре бит в случае четырехцветного режима).
Буду пробовать
То, что вышло - это левые два блока кирпичной текстуры, растянутые в 2 и 8 раз по высоте.
Получилось не очень презентабельно, да и довольно бесполезно, но зато быстро, так как я растягивал сразу строки, а не отдельные пиксели.
Экранная память Commodore в режиме hi-rez устроена таким образом, что каждые 8 последовательных байт отвечают за отрисовку одного знакоместа 8*8 пикселей, а следующие 8 байт – за отрисовку следующего знакоместа, поэтому расширять текстуру построчно оказалось довольно дешевым с точки зрения процессора занятием.
Но что, если я хочу расширить текстуру не только по высоте, но и по ширине? Тогда придется работать с каждым пикселем, что, думаю, будет довольно затратно, потому что придется обращаться уже не к байтам, а к каждому биту (или паре бит в случае четырехцветного режима).
Буду пробовать
🤯1
Допустим, есть текстура 16*16. И я хочу ее расширить до 34 в высоту, но каждый последующий столбец меньше на два пикселя (для перспективы). Делается это по столбцам.
Для каждого столбца надо пройтись по индексам новой высоты (от 0 до 33), умножить на 16 (старая высота) и поделить на 34 (новая высота).
Получается что-то вроде y = i*16/34
Умножение на 16 не проблема. Надо использовать 4 битовых сдвига влево (1 сдвиг - умножение на 2). А вот деление - довольно тяжелая операция, а с учетом, что делать это придется практически для каждого пикселя в зоне 128*128 - то, думаю, неподъемная.
Для каждого столбца надо пройтись по индексам новой высоты (от 0 до 33), умножить на 16 (старая высота) и поделить на 34 (новая высота).
Получается что-то вроде y = i*16/34
Умножение на 16 не проблема. Надо использовать 4 битовых сдвига влево (1 сдвиг - умножение на 2). А вот деление - довольно тяжелая операция, а с учетом, что делать это придется практически для каждого пикселя в зоне 128*128 - то, думаю, неподъемная.
Поэтому можно заняться сравнениями.
Если i*16 < 34, то берем 0 индекс исходной текстуры.
Если i*16 < 34*2, то берем 1 индекс, и так далее.
Я посчитал, и понял, что мне для этого надо умножить все возможные высоты текстур (четные числа от 32 до 128) на числа от 1 до 16. Все это можно поместить в таблицу, которая займет где-то полтора килобайта. Но можно и меньше, если умножения на 2,4,8,16 производить налету с помощью тех же битовых сдвигов.
В одном случае нагружается процессор, в другом заполняется память, а оптимальное решение я так и не нашел=(
Если i*16 < 34, то берем 0 индекс исходной текстуры.
Если i*16 < 34*2, то берем 1 индекс, и так далее.
Я посчитал, и понял, что мне для этого надо умножить все возможные высоты текстур (четные числа от 32 до 128) на числа от 1 до 16. Все это можно поместить в таблицу, которая займет где-то полтора килобайта. Но можно и меньше, если умножения на 2,4,8,16 производить налету с помощью тех же битовых сдвигов.
В одном случае нагружается процессор, в другом заполняется память, а оптимальное решение я так и не нашел=(
Обожаю разработку под Commodore.
Два дня пытался понять, в чем проблема. Я пытался написать функцию, которая растягивает столбец текстуры до нужной высоты. И вроде бы все хорошо, но видите эту прерывистую линию внизу столбца?
Оказалось, что в одном месте я использовал не ту команду.
Мне надо было 4 раза сдвинуть биты в одном байте вправо. Для этого есть две команды: ROR и LSR.
Два дня пытался понять, в чем проблема. Я пытался написать функцию, которая растягивает столбец текстуры до нужной высоты. И вроде бы все хорошо, но видите эту прерывистую линию внизу столбца?
Оказалось, что в одном месте я использовал не ту команду.
Мне надо было 4 раза сдвинуть биты в одном байте вправо. Для этого есть две команды: ROR и LSR.
Но они отличаются.
ROR в седьмой бит помещает значение из Carry.
Carry - это флаг переноса в старший разряд. Допустим, если прибавить 1 к 255, то 1 отправится в Carry. Так, например, работает сложение чисел, если результат больше 255.
А LSR в седьмой бит помещает 0.
И я использовал конечно же ROR, и в определенные моменты у меня число, которое должно выглядеть как 00001111 (15), превращалось в 00011111 (31) и ломало мне всю функцию. Когда я поменял ROR на LSR, то все стало нормально
ROR в седьмой бит помещает значение из Carry.
Carry - это флаг переноса в старший разряд. Допустим, если прибавить 1 к 255, то 1 отправится в Carry. Так, например, работает сложение чисел, если результат больше 255.
А LSR в седьмой бит помещает 0.
И я использовал конечно же ROR, и в определенные моменты у меня число, которое должно выглядеть как 00001111 (15), превращалось в 00011111 (31) и ломало мне всю функцию. Когда я поменял ROR на LSR, то все стало нормально
👍1
Но настоящая новость в том, что я наконец-то спустя миллион лет прошел Prince of Persia: Warrior Within.
Первый раз я поиграл в нее на PSP лет в 12 наверное. И она показалась мне такой сложной, но в то же время такой крутой (чего только Godsmack стоят, когда убегаешь от Дахаки). И для двенадцатилетнего меня все это "кровь-кишки-распидорасило" смотрелось ну очень впечатляюще.
И вот наконец, спустя столько лет, я наконец-то её осилил.
Даже статью захотелось написать про историю серии
Первый раз я поиграл в нее на PSP лет в 12 наверное. И она показалась мне такой сложной, но в то же время такой крутой (чего только Godsmack стоят, когда убегаешь от Дахаки). И для двенадцатилетнего меня все это "кровь-кишки-распидорасило" смотрелось ну очень впечатляюще.
И вот наконец, спустя столько лет, я наконец-то её осилил.
Даже статью захотелось написать про историю серии
👍4🔥1
Наконец-то дело сдвинулось с мертвой точки.
Написал основную функцию для увеличения столбцов текстуры и еще одну функцию, которая уменьшает следующие столбы для перспективы.
Конечно, это все еще оптимизировать и оптимизировать, потому что пока что работает оно довольно неторопливо, но по крайней мере, работает=)
Что до памяти, то тут все неплохо. Таблицы деления я ужал с 6Кб аж до двух (но за счет лишних операций, которые с ними надо производить), а сам код программы занимает пока что всего 373 байта.
Теперь надо написать две функции:
— первая увеличивает следующие столбцы (для стен в правой части экрана)
— вторая рисует текстуру прямо (для стен перед глазами)
Написал основную функцию для увеличения столбцов текстуры и еще одну функцию, которая уменьшает следующие столбы для перспективы.
Конечно, это все еще оптимизировать и оптимизировать, потому что пока что работает оно довольно неторопливо, но по крайней мере, работает=)
Что до памяти, то тут все неплохо. Таблицы деления я ужал с 6Кб аж до двух (но за счет лишних операций, которые с ними надо производить), а сам код программы занимает пока что всего 373 байта.
Теперь надо написать две функции:
— первая увеличивает следующие столбцы (для стен в правой части экрана)
— вторая рисует текстуру прямо (для стен перед глазами)
На первые два вопроса я еще пытался ответить серьёзно 😂
Forwarded from ЛУНОХОД [ Компьютерный ретро клуб, антикафе, музей]
Тут подъехал суровый тест. Помогите ответить на вопросы...😅🙈
🤡1
И наконец я добился того, что хотел. Теперь получается генерировать разные виды лабиринта на основе того, что видит игрок (правда, ходить пока нельзя, да и карты как таковой еще не существует).
Текстура тоже пока одна, но это дело времени. Пока что я доволен, что наконец-то стали отрисовываться очертания лабиринта.
Текстура тоже пока одна, но это дело времени. Пока что я доволен, что наконец-то стали отрисовываться очертания лабиринта.
❤🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Скорость конечно не вау, но для пошагового лабиринта сойдёт. Вот это средняя скорость, когда на экране не так много высоких столбцов.
Но я буду думать, как все это дело ускорить
Но я буду думать, как все это дело ускорить
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
А вот самый медленный вариант - на экране много высоких столбцов от 96 до 128 пикселей в высоту
👍2