Добрый день уважаемые спектрумисты,у меня к вам очередной вопрос .
Я в ART STUDIO нарисовал спрайт как мне сделать что бы он появился на экран и двигался в том направлении в котором я задам ?
Спрайт у меня под адресом #5F00
Вид для печати
Добрый день уважаемые спектрумисты,у меня к вам очередной вопрос .
Я в ART STUDIO нарисовал спрайт как мне сделать что бы он появился на экран и двигался в том направлении в котором я задам ?
Спрайт у меня под адресом #5F00
Для начала надо определиться, в каком формате хранится спрайт (линейный, познакоместный, "змейкой"; с маской или без; с атрибутами или без). Из этого будет построен алгоритм его вывода на экран.
Движение спрайта будет делаться примерно так: нарисовать спрайт, подождать, стереть спрайт, поменять координаты, нарисовать на новом месте, ...
Стирать спрайт тоже можно по разному: на месте спрайта нарисовать пустое место; или перед отрисовкой сохранять фон под ним, а при стирании - восстанавливать.
Вот такие тонкости
SAM style, не умничай обьясни как спрайт сначала сохранить
Как в art studio - я не помню / не знаю / а он умеет спрайты резать?
Лучше расскажу как в BGE 3:
- SS+L, загрузить картинку со спрайтом
- SS+Z, загрузить плагин spriter.add. Откроется окно плагина.
- Выбрать "Новый SPR", подтвердить
- Выбрать "Формат" и поставить галку "Атрибуты", если они нужны
- Выбрать "Вырезать" и на картинке отметить область спрайта (клик на левом верхнем углу, потом растянуть до правого нижнего и снова клик), выход из вырезания - break (CS+Space)
- В пункте "Просмотр" можно посмотреть на результат и запомнить размеры спрайта в знакоместах.
- "Сохранить SPR" сохраняет спрайт в формате BGE, его потом можно загрузить обратно, удалить, перерезать и пр.
- "Сохранить CODE" - это то, что нам нужно. Сохраняется только спрайт в линейном формате (сначала изображение по строкам сверху вниз, потом атрибуты если они были)
Теперь у нас есть спрайт, который можно вставить в свою программу.
Продолжение следует...
Порекомендую wireless bmp формат, понимается нормальными редакторами на ПЦ, а для спека нужно только откусить заголовок.
http://zx.pk.ru/showthread.php?t=17811. Оно умеет вырезать спрайты из экрана, сохранять вместе с кодом вывода на экран. Стирать не умеет. Зато с исходниками.
См. исходникичасти Кошка с гибочками. Там спрайт двигается и прыгает.
http://zx.pk.ru/showpost.php?p=353642&postcount=12
http://zx.pk.ru/showthread.php?t=13732
2. см. Исходники части рыбки из Райнбов мегадемо
http://zxaaa.untergrund.net/screen6/rbm6.png
Я бы рекомендовал вначале освоить скроллирование спрайта размером в 1 знакоместо.
Для скроллинга по горизонтали может быть использована команда побитового смещения влево/вправо
; HL - адрес ячейки экрана
LD C,8
LOOP:LD A,(HL)
RL A
LD B,A
AND %11111110
LD (HL),A
DEC HL
LD A,B
AND %00000001
LD (HL),A
INC H
DEC C
JR NZ,LOOP
Для ситуации сдвига вправо модифицируйте код самостоятельно.
Для смещения спрайта вверх или вниз достаточно просто скопировать значение ячеек памяти в строку ниже/выше:
; HL - адрес ячейки экрана
LD C,8
LD A,7
ADD A,H ; смещаем на 7 пикселей вниз
LD H,A
LD D,H ; скопировали из HL в DE
LD E,L
CALL DOWN_DE
LOOP:LD A,(HL)
LD (DE),A
LD D,H ; переместили HL в DE
LD E,L
CALL UP_HL ; переместили указатель на предыдущую пиксельную линию
DEC C
JR NZ,LOOP
DOWN_DE - это процедура смещения вниз на пиксельную линию адреса в DE
UP_HL - меняет адрес в HL на пиксельную линию выше.
А как лучше выводить спрайты?
Полностью очищать вирт. экран, затем отрисовывать в нём и выводить на экранную область или же выводить спрайт непосредствнно на экран, а при перемещении стирать за ним след ?
Могу признаться, что в "Приключении в метро" спрайты отображаются без привязки к координатам (если нужно - выполняется сдвиг), но там всё укладывается в прерывание. Процедура излишне универсальна (в качестве пародии на самого себя я тогда (в 1989) сделал летающий по экрану фак, и эта фигня потом дописывалась распространителями на диски на радиорынках). Технология XOR-наложения построена на совсем ином принципе. Я делал, но практического применения не было (не было готового программного продукта; была идея сделать игру про Руцкого, громящего со штурмовика Белый Дом Ельцина, даже дошло до готового движущегося фона и летящего над ним по XOR самолёта, но так и осталось).
ALKO, если объектов на экране мало и ты уверен что отрисуешь их быстро, то
1 сортируешь координаты объектов по высоте
2 сохраняешь список с размерами для удаления в следующей фазе
3 ждешь начало обновления экрана
4 удаляешь старые объекты (критичная по времени часть)
5 рисуешь новые от верхних к нижним (очень критичная по времени часть)
если не хватает скорости то
рисуешь в буферном экране
если объектов мало
1 рисуешь объекты сохраняя фон в суббуфере
2 выводишь экран
3 восстанавливаешь фон из суббуфера
если обьектов много, или нет памяти под суббуфер то
определяешь таблицу восстановлений
1 рисуешь объекты отмечая в таблице где они портят фон
2 выводишь буферный экран
3 восстанавливаешь на экране фон в соответствии с таблицей
Интересен процесс переноса спрайтов (без маски) познакоместно.
есть png картинки с размерами кратными 8-ми пикселям по X и Y.
При помощи Bmp2Scr вывожу на screen$, там последовательно каждое знакоместо заношу в память, даже те , где все восемь байтов по нулям.....
А как сделать по знакоместам, которые нужны, исключая пустые знакоместа? и что б ещё координаты этих знакомест сохранялись?
Да, нули вырезалка не обходит, они тоже в спрайт попадают. Кстати, идея с нулями не самая эффективная. Она дает выигрыш только если у тебя пустых знакомест в 4 с лишним раза больше, чем заполненных внутри рамки спрайта (это только по объему хранимых данных). Рискну предположить, что алгоритм, который для каждого знакоместа спрайта считает экранные и атрибутные адреса, тоже не самый маленький и быстрый.
Не соглашусь, алгоритмы разные бывают. В приведённой книге соотношение пустых к заполненным знакоместам 1 к 1 уже даёт выигрыш по скорости + меньше нервов при работе с масками или простым copy_put, когда масками вообще не хочется заморачиваться. Хоть спрайты и будут квадратичными, но таки более естественными чем кусок области 6*6 знакомест, например.
---------- Post added at 22:00 ---------- Previous post was at 21:59 ----------
Зато он без проблем обходит выход за грани экрана, чего нет в прямых алгоритмах копирования.
Пользуй мою программу 3D-View, она вырезает нулевые знакоместа. Загружай в нее исходный bmp-файл, нажимай кнопку "Исходная грань", в файле source.txt закодируется твой спрайт.
Лежит тут: http://zx.pk.ru/showpost.php?p=379799&postcount=4
Could we Translate this to English for a wider audience?
This might be a very useful program!... Is there any chance that you could make a translated version of this program for English speakers?... The WorldofSpectrum.Org community might appreciate a program like this!!!
--------------------------------------
Можем ли мы перевести это на английский язык для более широкой аудитории?
Это может быть очень полезная программа! ... Есть ли шанс, что вы можете сделать перевод версии этой программы для английского языка? ... WorldofSpectrum.Org сообщество может оценить подобную программу!
i hope that it will be done as soon as possible
Sprite Graber совсем английский - бери и понимай всея народ.
Andrew771, хмммм..... чё-то оно как-то не так работает.
Сконвертил 3д вьювером затем поместил данные в процедуру zoom под метку SPRITE, а оно всякий бадыль рисует на атрибутах и залазит аж на бейсик, из-за чего зависает.
Хотя на примере одного знакоместа работает нормально.
Пробовал менять координаты (регистры DE), но изменяется лишь вывод на определённые атрибуты и опять-таки зависает.
---------- Post added at 11:13 ---------- Previous post was at 11:12 ----------
......
Цитата:
DEFB 27
DEFB 8,15, 0,0,0,3,3,31,63,63
DEFB 8,16, 0,0,0,0,128,192,224,224
DEFB 9,14, 0,0,6,7,63,63,63,63
DEFB 9,15, 127,127,255,255,255,255,255,255
DEFB 9,16, 240,240,224,239,255,255,255,255
DEFB 9,17, 0,0,0,0,0,192,192,192
DEFB 10,14, 63,31,31,31,31,31,31,31
DEFB 10,15, 255,255,255,255,255,255,255,255
DEFB 10,16, 255,255,255,255,255,255,255,247
DEFB 10,17, 192,192,192,128,128,128,192,192
DEFB 11,14, 31,15,1,0,0,0,0,0
DEFB 11,15, 255,255,255,255,255,255,255,255
DEFB 11,16, 247,231,227,195,195,199,207,207
DEFB 11,17, 224,224,224,224,224,224,192,192
DEFB 12,14, 1,1,1,3,7,7,15,15
DEFB 12,15, 255,255,255,255,255,255,255,255
DEFB 12,16, 239,239,231,240,240,240,248,248
DEFB 12,17, 192,192,64,0,0,0,0,0
DEFB 13,14, 31,63,127,127,255,254,254,254
DEFB 13,15, 243,225,193,128,0,0,0,0
DEFB 13,16, 248,252,252,254,254,254,254,254
DEFB 14,14, 127,63,63,63,63,63,63,31
DEFB 14,16, 127,127,127,63,63,31,31,31
DEFB 14,17, 0,0,0,0,128,128,128,128
DEFB 15,14, 31,15,15,31,63,127,127,124
DEFB 15,16, 15,15,7,7,7,7,7,3
DEFB 15,17, 128,128,128,192,224,240,240,240
; всего: 271 байт
Атрибуты в исходном коде выключил?
---------- Post added at 12:20 ---------- Previous post was at 12:19 ----------
если в программе 3DView.exe отключен флаг "Включать байт атрибутов в спрайты", то необходимо закомментировать несколько строк в тексте ассемблерной программы (конкретные строки указаны в комментариях программы sprite-tester.asm)
Разобрался.
Но не совсем.
Там когда координаты по нулям - выводится в центре экрана спрайт, как сделать относительно левого верхнего угла точку отсчёта?
---------- Post added at 14:52 ---------- Previous post was at 14:49 ----------
И где здесь указывается начальный адрес для вывода?
Я хочу сперва отрисовывать в виртуальном экране.
Скрытый текст
ORG 40000
SPRITE EQU S453R1 ; ????????? ???? ????? ?????? ???????
; ???????? ?????????
LD D,1
LD E,1
LD HL,SPRITE
CALL PUTSPR
RET
; ??????????? ?????? ???????
; ??????? ?????????: HL=????? ???????, DE=?????????? ?????? ?? ??????
; ???????? ?????????? ???
PUTSPR LD A,(HL)
AND A
RET Z ; ?????, ???? ?????? ??????
LD B,A
PUTS1 PUSH BC ; B = ?????????? ????????? ? ???????
INC HL
LD A,(HL)
ADD A,D
LD B,A
INC HL
LD A,(HL)
ADD A,E
LD C,A
INC HL
PUSH DE ; DE = ?????????? ??????? ?? ??????
EX DE,HL ; DE = ????? ?????????? ? ???????, HL = ????????
LD A,B ; ?????? ?????? ??????? ????? ?????????? ? HL
LD H,A
RRCA
RRCA
RRCA
AND A,224
ADD A,C
LD L,A
LD A,H
AND 24
OR 64
LD H,A ; HL = ????? ?????? ?????????? ?? ??????, DE = ????? ??????????? ? ???????
; ????? ?????????? (8 ?????)
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
INC DE
INC H
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
INC DE
INC H
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
INC DE
INC H
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
INC DE
INC H
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
INC DE
INC H
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
INC DE
INC H
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
INC DE
INC H
LD A,(DE)
LD (HL),A ; ?????? ???? ???????
EX DE,HL ; HL = ????? ?????????? ? ???????
POP DE ; HL = ????? ?????????? ? ???????, DE = ?????????? ??????? ?? ??????
POP BC ; B = ???? ?? ?????????? ????????? ? ???????
DJNZ PUTS1
RET
S453R1
DEFB 27
DEFB 8,15, 0,0,0,3,3,31,63,63
DEFB 8,16, 0,0,0,0,128,192,224,224
DEFB 9,14, 0,0,6,7,63,63,63,63
DEFB 9,15, 127,127,255,255,255,255,255,255
DEFB 9,16, 240,240,224,239,255,255,255,255
DEFB 9,17, 0,0,0,0,0,192,192,192
DEFB 10,14, 63,31,31,31,31,31,31,31
DEFB 10,15, 255,255,255,255,255,255,255,255
DEFB 10,16, 255,255,255,255,255,255,255,247
DEFB 10,17, 192,192,192,128,128,128,192,192
DEFB 11,14, 31,15,1,0,0,0,0,0
DEFB 11,15, 255,255,255,255,255,255,255,255
DEFB 11,16, 247,231,227,195,195,199,207,207
DEFB 11,17, 224,224,224,224,224,224,192,192
DEFB 12,14, 1,1,1,3,7,7,15,15
DEFB 12,15, 255,255,255,255,255,255,255,255
DEFB 12,16, 239,239,231,240,240,240,248,248
DEFB 12,17, 192,192,64,0,0,0,0,0
DEFB 13,14, 31,63,127,127,255,254,254,254
DEFB 13,15, 243,225,193,128,0,0,0,0
DEFB 13,16, 248,252,252,254,254,254,254,254
DEFB 14,14, 127,63,63,63,63,63,63,31
DEFB 14,16, 127,127,127,63,63,31,31,31
DEFB 14,17, 0,0,0,0,128,128,128,128
DEFB 15,14, 31,15,15,31,63,127,127,124
DEFB 15,16, 15,15,7,7,7,7,7,3
DEFB 15,17, 128,128,128,192,224,240,240,240
[свернуть]
Включить в программе 3D-View флажки "Гориз.координаты спрайтов с 0" и "Вертик.координаты спрайтов с 0". Если они не включены, то координаты спрайта конвертируются как реально изображены на экране.
ADDR_VIRT_SCREEN - начальный адрес виртуального экранаКод:LD A,B ; расчет адреса первого байта знакоместа в HL
LD H,A
RRCA
RRCA
RRCA
AND A,224
ADD A,C
LD L,A
LD A,H
AND 24
OR 64
LD H,A ; HL = адрес вывода знакоместа на экране, DE = адрес изображения в спрайте
LD BC,ADDR_VIRT_SCREEN
ADD HL,BC
Теперь нужна зеркалка спрайтов.
Код:
;по адресу #5b00 создаем таблицу зеркалирования
;создаем естественно 1 раз
ld hl,#5b00
mirr_0
ld a,l
dup 8
rra
rl (hl)
edup
inc l
jr nz,mirr_0
ret
;как использовать
;--------------------
ld hl,adress
ld de,mirror
ld bc,sprite
;определяем условия
;как будет выглядеть точно сказать нельзя это только иллюстрация
;здесь вывод 2 байтов спрайта с разворотом
ld a,(bc)
inc bc
ld e,a
ld a,(de)
or (hl)
ld (hl),a
dec l
ld a,(bc)
inc bc
ld e,a
ld a,(de)
or (hl)
ld (hl),a
;здесь возможны варианты
;переход на следующий байт
dec l
;или переход на следующую линию
inc h