возьми лучше помедленнее класику
оставь этот геморой авторам.
возьми лучше помедленнее класику
оставь этот геморой авторам.
С уважением,
Jerri / Red Triangle.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Destr,
давай тогда с тобой подумаем вместе
вот простой и удобный алгоритм рисования линии
Код:beginning di ld hl,#1020 ; yx dest ld de,#3060 ; yx sour call line00 ei ret ;в HL - yx конца ;в DE - yx начала line00 ld a,h ;вычисляем DY sub d ld bc,#141c ;создаем базовые изменения координат jr nc,line1 ;основная пара de inc b ;поэтому меняем DE><HL если рисуем сверху вниз ;ВСЕГДА рисуем сверху вниз neg line1 ld h,a ;H=DY ld a,l ;вычисляем DX sub e ; jr nc,line2 inc c ;если рисуем справа налево то меняем направление neg line2 cp h ;DX=DY? ld l,a jr c,line3 ;если меньше то считаем основной координатой DY ld l,h ld h,a ld a,b ld b,c ld c,a line3 ld a,b ;обозначаем как менять координаты ld (line5),a ld a,c ld (line6),a ld b,h ld a,h inc l inc b line4 call plot ;здесь печать точки - в de координаты yx line5 nop sub l jr nc,line7 line6 nop add a,h line7 djnz line4 ret plot push hl,de,af ld l,d ld h,koors/256 ld a,(hl) inc h ld d,(hl) inc h ld l,e or (hl) ld e,a inc h ld a,(de) xor (hl) ld (de),a pop af,de,hl ret
на основе этого алгоритма надо подумать как рисовать в пределах знакоместа линию
у нас есть 4 варианта развития линии
х+ у+
х- у+
х+ у-
х- у-
С уважением,
Jerri / Red Triangle.
Ну и сколько тактов на точку получается?
Учти, что нужно будет рисовать 64 линии (угол обзора 90 градусов потому-что, исходя из того что у нас на спеке окружность удобней иметь в 256 градусов, то 64 луча и обеспечивают четверть, т.е. 90 градусов если по-нормальному считать).
Длина каждого луча - 32. Т.е. это как-бы "дальность" взгляда.
Получаем 64*32*кол-во тактов на точку.
Таким образом самое шустрое - это именно алгоритм из спектрумэксперта (ну тот что по ссылке), быстрей я например вообразить не могу, вот замедлить - эт пожалуйста, только это категорически не нужно, хотя придётся, ведь не рисовать линии будем а делать BIT n,(HL), проверка на предмет упирания луча в стенку. Если луч упёрся - выход (что-то вроде JP NZ), а если нет - рисуем (сканируем) дальше. Длину считать/контролить - тоже накладно, так что тупо дублируем прогу 32 раза, такие дела...
Последний раз редактировалось Destr; 26.06.2016 в 12:34.
Рейкастинг - это то-же самое рисование линии.
Но вместо установки точки - скан её на предмет того что зажжена.
Зачем 64 - я уже расписал ведь, как ещё понятней не знаю.
Прочти классику (статья Ширу)
Или в двух словах - вот тут.
Никаких велосипедов, у Алонкодера была другая задача - скан мира состоящего из блоков.
У меня мир состоит из точек (в формате спек экрана, только не три а четыре сегмента).
Это позволит делать стенки как угодно а не только 90 градусов (как в классическом вольфе).
- - - Добавлено - - -
Так собственно вернёмся к вопросу: как такой код генерить можно?
Пробовал MODULE, пробовал локальные метки (всё закручено в REPT) - чёта не получается...
Destr, а зачем тебе линия в произвольном направлении?
рисуй вертикальную. просто вертикальную
С уважением,
Jerri / Red Triangle.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)