PDA

Просмотр полной версии : Быстрый вывод картинки 88*88



ALKO
14.03.2011, 15:49
Нужна процедура ввода\вывода картинки.
80*88 пикселей в любую область экрана.
ввод (занесение в память ОЗУ содержимого видео-ОЗУ) может осущесвляться с левого верхнего угла, а вот вывод желательно с указанием координат.
Подкиньте, пожалуйста асмовскую процедуру...

---------- Post added at 16:46 ---------- Previous post was at 16:45 ----------

координаты не обязательно попиксельные, можно и по знакоместу.

---------- Post added at 16:49 ---------- Previous post was at 16:46 ----------

упс,ошибся...размер 88х88

VNN_KCS
14.03.2011, 16:28
Обычный вывод спрайтов подойдёт?

GM BIT
15.03.2011, 05:08
;EmuzWin ZX Assembler++

org 30000
jp get_spt
ld b,0 ;координата Y (+4)
ld c,0 ;координата X (+6)
call set_adr
ex de,hl
ld hl,40000
ld b,88
out1 push bc push de
ld bc,11
ldir
pop de pop bc
call down_de
djnz out1
ret

get_spt ld hl,16384
ld de,40000
ld b,88
get1 push bc push hl
ld bc,11
ldir
pop hl pop bc
call down_hl
djnz get1
ret

set_adr ld a,b
rrca rrca rrca
and #e0
ld l,a
ld a,b and #18 or #40 ld h,a
ld b,0 add hl,bc
ret
down_hl inc h ld a,h and 7
ret nz
ld a,l add a,32 ld l,a
ret c
ld a,h sub 8 ld h,a
ret
down_de inc d ld a,d and 7
ret nz
ld a,e add a,32 ld e,a
ret c
ld a,d sub 8 ld d,a
ret

Вызов 30000 - снимет спрайт в координатах 0,0 и поместит его в 40000
Вызов 30003 - выведет спрайт из 40000 в экран по координатам в ячейках 30004(Y),30006(X)
Проверок на вывод за экран в программе нет

NovaStorm
15.03.2011, 11:01
>;EmuzWin ZX Assembler++
>ld a,b and #18 or #40 ld h,a
Оо Ядрёный асм =)

>ld b,88
>...
>call down_de
>djnz out1
Может стоит развернуть цикл и по 8 линий сразу сделать без лишних вызовов down_rr?
В связи с этим возник тоже интересный вопрос, переброс от сотни до пары тысяч байт лучше делать ldir или есть варианты со стеком, всосать/выплюнуть все регистры?

VNN_KCS
15.03.2011, 12:09
есть варианты со стеком, всосать/выплюнуть все регистры?
Так намного шустрей, но памяти займёт гораздо больше.

---------- Post added at 11:09 ---------- Previous post was at 11:07 ----------


down_hl inc h ld a,h and 7
ret nz
ld a,l add a,32 ld l,a
ret c
ld a,h sub 8 ld h,a
ret
down_de inc d ld a,d and 7
ret nz
ld a,e add a,32 ld e,a
ret c
ld a,d sub 8 ld d,a
ret
Зачем 2 процедуры? А нельзя сделать ex de.hl?

NovaStorm
15.03.2011, 12:26
Так намного шустрей, но памяти займёт гораздо больше.
Не, ну разворачивать тоже без фанатизма надо =)
Цикл по
pop
exx
pop
push
exx
push
?
Что-то у меня такой цикл со счётчиком по прикидкам LDIR не обгоняет из-за накладных расходов на этот самый счётчик и модификацию SP, упустил может что...

VNN_KCS
15.03.2011, 14:57
Упустил то, что PUSH и POP юзают сразу 2 байта.

ALKO
15.03.2011, 15:48
спасибо за исходники,но я тут примерил,довольно много памяти будет занимать всё это - 968 байт (!) картинка.
Не влезет в 48к машину то что хотел.
а именно файтинг со средней анимацией (хотя б 2(3) кадра на удар) +basiс компилятор в верхней области +сам бейсик сзади будет поджимать, и между этими двумя голодными тварями наврят ли поместится хотя б 20 кадров.
....
А, чуть не забыл ещё +область куда компилируется исходный код.

NovaStorm
15.03.2011, 16:23
Упустил то, что PUSH и POP юзают сразу 2 байта.
Не, ну как так можно =)
Проблема в том что регистров мало и нужен регистр на счётчик(минус BC).
Даже если взять только костяк
pop af,de,hl
exa,exx
pop af,de,hl
...
push hl,de,af
exa,exx
push hl,de,af
то это уже 142/12=почти по 12 тактов на байт, не считая танцев с SP. А пачка развёрнутых LDI будет жрать по 16 с небольшим.
В общем, пример можно?

---------- Post added at 16:23 ---------- Previous post was at 16:14 ----------


968 байт (!) картинка.
И это без маски...

Не влезет в 48к машину то что хотел.
Про бейсик лучше забыть, про 48к забыть крайне желательно. Анимация сожрёт слишком много места.
Но! Если есть сильное желание, для файтинга можно попробовать сегментировать бойцов и выводить их по кускам.

ALKO
15.03.2011, 16:34
Сегментацией будет гемморойнее.
А про 48к не смогу забыть, так как у меня 128к нету.
Под реал хочу создать,эмулятор - отстой...у него нет души.

---------- Post added at 17:34 ---------- Previous post was at 17:29 ----------

я раньше создавал некое подобие *****файта.
Там человечки 8х8 были, и вся анимация уместилась в UDG...
AI был таков - рандомный выбор (нанесение ударов (нога (рука)) уход назад), если же противник (тобиш игрок) далеко - подойти и произвести рандомное действие.

GM BIT
15.03.2011, 17:00
Господа программисты, а где ваша готовая прога????????
Алгоритмами мы тут все умеем блистать!!! А 3 минуты потратить?
Была просьба, была помощь. Какая никакая!


Зачем 2 процедуры? А нельзя сделать ex de.hl?
Можно, руки быстрее пишут чем голова думает :)

---------- Post added at 17:00 ---------- Previous post was at 16:58 ----------


В связи с этим возник тоже интересный вопрос, переброс от сотни до пары тысяч байт лучше делать ldir или есть варианты со стеком, всосать/выплюнуть все регистры?
Смотря, какая задача, экономия памяти, экономия скорости, способ вывода и т.д.

NovaStorm
15.03.2011, 17:03
>будет гемморойнее
Ещё как =) Но оно может того стоить.
Как вариант, делать графику бойцов по типу принца персии, каратеки, shaq fu, another world и flashback. Она и занимать меньше будет, и упаковываться на ура.

---------- Post added at 17:03 ---------- Previous post was at 17:00 ----------


Смотря, какая задача, экономия памяти, экономия скорости, способ вывода и т.д.
Ну по памяти LDIR не переплюнуть, но можно ли сделать простую пересылку блока быстрее, не расходуя килобайты кода?(быстрее пачки LDI, а значит наверное со стеком)

GM BIT
15.03.2011, 17:05
упаковываться на ура.
А вот это самое правильное! Выводить сразу упакованную графику, будет огромная экономия памяти

---------- Post added at 17:05 ---------- Previous post was at 17:04 ----------


можно ли сделать простую пересылку блока быстрее, не расходуя килобайты кода?
оптимизация 1:
dup 11
ldi
edup

NovaStorm
15.03.2011, 17:11
Ох, про Каратеку я наверное зря, на Спеке она как раз спрайтовая, но идея думаю понятна, делать довольно схематичную графику в угоду размеру и количеству кадров из больших горизонтальных блоков, которые утопчутся уже на RLE стадии. LZ тут всё же не нужен, тк распаковать хотя бы пару килобайт на анимацию удара например за 2-3 прерывания довольно сложно, хотя...

ALKO
15.03.2011, 17:12
Как вариант, делать графику бойцов по типу принца персии, каратеки, shaq fu, another world и flashback. Она и занимать меньше будет, и упаковываться на ура.
Вообще-то в another world векторная графа.(как и заставки в флэшбэке).

NovaStorm
15.03.2011, 17:27
Сомневаюсь, что на всех платформах ведь оно работало ещё на SMD и SNES, и если 68к ещё туда-сюда, то 65c816 на векторах встал бы раком. Да и вывод там спрайтовый. ИМХО там как раз куча простых, но за счёт этого хорошо упакованных кадров.
Да и wikipedia про Flashback говорит "while the vectors are pre-rendered".

ALKO
15.03.2011, 17:34
так я про SMD и говорю.(ну на ПЦ она по любому векторная)

Robus
15.03.2011, 19:03
Привет !!!

Дай примеры графики, которую собираешься отображать. Если графика ручной работы, то будет паковаться. В общем нужно пробовать на примере.

ALKO
15.03.2011, 19:56
то 65c816 на векторах встал бы раком.
а там он не один, у него под командыванием куча примочек вращения и масштабирования. иначе как бы он дум утянул?

---------- Post added at 20:55 ---------- Previous post was at 20:55 ----------


Дай примеры графики, которую собираешься отображать. Если графика ручной работы, то будет паковаться. В общем нужно пробовать на примере.
примерно вот:
http://sdb.drshnaps.com/objects/4/551/Sprite/ShredderTF.gif

---------- Post added at 20:56 ---------- Previous post was at 20:55 ----------

можо зум уменьшить через граф редактор на несколько пикселей.

NovaStorm
15.03.2011, 21:12
а там он не один, у него под командыванием куча примочек вращения и масштабирования. иначе как бы он дум утянул?
Ох лол. Ты помнишь тот кастрированный Дум? Тянул кстати его не ЦП, а Super FX, который сейчас АФАИК поставляется как кастомное ядро ARC - http://en.wikipedia.org/wiki/ARC_International

А картинки надо сконвертить в 1битный "цвет" и спеково разрешение, если не возникает отвращения, значит нервы(или желудок) крепкие и можно продолжать =)
Но "ручная" графика по опыту сжимается отсилы процентов на 40 в лучшем случае.

ALKO
15.03.2011, 21:32
Ох лол. Ты помнишь тот кастрированный Дум? Тянул кстати его не ЦП, а Super FX, который сейчас АФАИК поставляется как кастомное ядро ARC
так я об этом и говорю, что там куча прибамбасов:


а там он не один, у него под командыванием куча примочек вращения и масштабирования.
и плюс сигналный проц на звуке.

---------- Post added at 22:32 ---------- Previous post was at 22:31 ----------


А картинки надо сконвертить в 1битный "цвет" и спеково разрешение, если не возникает отвращения, значит нервы(или желудок) крепкие и можно продолжать =)
через BMP2SCR это делается в два счёта

NovaStorm
15.03.2011, 21:53
>так я об этом и говорю, что там куча прибамбасов
SuperFX не в SNES, он в картрижде, но мы в принципе друг друга поняли.
>через BMP2SCR это делается в два счёта
Ну если результат устраивает, это хорошо. Единственное я могу посоветовать, если уж не найти художника, то графику искать на NES, там палитра не сильно далеко от спека ушла =)

newart
16.03.2011, 07:50
если уж не найти художника
ALKO сам художник неплохой. Если бы еще и рисовал в продвинутых редакторах, а не самописных на бейсике...

ALKO
16.03.2011, 14:22
в продвинутых надо вникать в интерфейс,а то что своё - более понятно работает.(раньше создавал редактор с RLE в машинных кодах, только вот листик с кодами посеял (к тому же коды десятичные))

Andrew771
16.03.2011, 14:46
Я бы сделал или небольшие спрайты, или масштабируемые в 2 или 4 раза спрайты.
Если основная программа на Бейсике, то ИМХО заморачиваться с ldi и push-pop смысла нет - всё равно по сравнению с Бейсиком никто и не заметит разницу.

А вот процедура вывода произвольного спрайта (познакоместное):



; подпрограмма вывода спрайта
; входные параметры: HL=адрес спрайта, DE=координаты знакоместа для вывода на экране (D-вертик., E-гориз.)

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 = свободно
PUSH BC ; BC = реальные координаты спрайта на экране

LD A,B ; расчет адреса атрибутов знакоместа в HL
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A

POP BC ; BC = реальные координаты спрайта на экране
LD A,(DE) ; читаем байт атрибутов знакоместа в спрайте
LD (HL),A ; заносим атрибуты знакоместа на экран
INC DE

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



SPRITE1 ; метка-адрес спрайта
DEFB 24 ; количество знакомест
DEFB 1,5,1, 0,7,125,0,15,12,8,8 ; знакоместо 1: вертик.координата, гориз.координата, байт атрибутов, 8 байт изображения
DEFB 1,6,1, 0,0,0,0,255,255,13,0 ; знакоместо 2
... ; остальные 22 знакоместа

ALKO
16.03.2011, 15:53
с зумом мне идея нравится, сделать бы как в Repton'e всё большое и квадратное.

VNN_KCS
23.03.2011, 15:08
Очень интересно - проблему решил? Если решил, интересно - как?

Andrew771
27.03.2011, 21:48
проблему решил?
наверное, ALKO начал писать масштабирование на ассемблере. Бейсик тут не поможет :)

ALKO
28.03.2011, 15:41
Вообще-то поможет.
В beta Basic'е есть такая процедура.

ALKO
28.03.2011, 16:18
Вот набросок моей весьма невзрачной игры (внизу ещё шипов добавлю):

ALKO
28.03.2011, 16:21
размеры "бойцов" 32*32 пикселя

Andrew771
28.03.2011, 17:44
Нормально получается! Размеры бойцов увеличишь?

NovaStorm
29.03.2011, 08:32
Вот набросок моей весьма невзрачной игры
Аирдэш будет? =)

ALKO
29.03.2011, 15:51
Размеры бойцов увеличишь?
В смысле перерисовать по крупнее?
-памяти мало.
А если зум,то этого я не умею делать на асме.


Аирдэш будет? =)
Типа удар с прыжка или это какой-то персонаж?

Andrew771
29.03.2011, 16:42
А если зум,то этого я не умею делать на асме.
Да, зум. Ты ж писал, что Beta Basic может.
Ну если не может, то я могу написать.

ALKO
29.03.2011, 17:04
Beta basic то может, но он занимает почти всё оставшееся ОЗУ.
Для написания арканоида сойдёт, но не более того.

---------- Post added at 16:04 ---------- Previous post was at 16:03 ----------

кстати в нём даже скроллинг экрана есть

Andrew771
29.03.2011, 17:10
Ладно, напишу тебе процедурку зума на асме. А ты мне можешь помочь вот с этим: http://zx.pk.ru/showpost.php?p=370750&postcount=197 ?

ALKO
29.03.2011, 17:12
Это типа FPS что ли?

Andrew771
29.03.2011, 17:19
ага. Чтоб имел представление, текущая рабочая версия тут: http://zx.pk.ru/showpost.php?p=369676&postcount=182

NovaStorm
29.03.2011, 20:21
Типа удар с прыжка или это какой-то персонаж?

Вообще имелось в виду общее направление файтинга, школа и стиль игры. Планируется ли он быстрым/агрессивным с "рывками" и блоками в воздухе, а-ля ГГ, или футсис тягомотиной на земле а-ля СФ? А может это вообще симулятор? =)
Ну или вообще (с учётом платформы-то, да =)), комбы будут?
<troll-mode/>список знаком же?
http://ru.wiktionary.org/wiki/Приложение:Список_файтинг-терминов

ЗЫ: линию пола наверное стоит пониже опустить.

Andrew771
30.03.2011, 12:33
Лови процедуру масштабирования спрайта в 4 раза. Выводит сразу на экран без всяких промежуточных буферов и таблиц, чтобы максимально сэкономить память. Проверок на выход за пределы экрана нет, так что координаты знакомест в спрайте должны иметь значения: вертикальная = 0..5, горизонтальная = 0..7.


; тестовая программа
ORG 60000
LD HL,SPRITE
LD D,0
LD E,0
CALL ZOOM
RET


; подпрограмма масштабирования в 4 раза спрайта
; входные параметры: HL=адрес спрайта, DE=координаты знакоместа для вывода на экране (D-вертик., E-гориз.)

ZOOM LD A,(HL) ; HL = адрес нахождения в спрайте
AND A
RET Z ; выход, если пустой спрайт

LD B,A
ZOOML1 PUSH BC ; B = количество знакомест в спрайте
PUSH DE ; DE = координаты знакоместа для вывода

INC HL
LD A,(HL)
RLCA
RLCA
ADD A,D
LD B,A
INC HL
LD A,(HL)
RLCA
RLCA
ADD A,E
LD C,A ; BC = реальные координаты левого верхнего знакоместа на экране

INC HL
EX DE,HL ; DE = адрес нахождения в спрайте, HL = свободно

LD (TMP_BC),BC ; запоминаем BC

LD A,B ; расчет адреса атрибутов знакоместа в HL
RRCA
RRCA
RRCA
LD L,A
AND 31
OR 88
LD H,A
LD A,L
AND 252
OR C
LD L,A ; HL = адрес атрибутов левого верхнего знакоместа


; заполняем квадрат 4х4 знакоместа змейкой байтом атрибутов
LD BC,32
LD A,(DE) ; читаем байт атрибутов знакоместа в спрайте
LD (HL),A ; заносим атрибуты знакоместа на экран
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
ADD HL,BC
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A
ADD HL,BC
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
INC HL
LD (HL),A
ADD HL,BC
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A
DEC HL
LD (HL),A


; масштабируем по паре байтов знакоместа (4 пары), заполняем прямоугольник 4х1 знакоместа
LD B,4
ZOOML2 PUSH BC ; B = номер пары байтов изображения

LD BC,(TMP_BC) ; BC = реальные координаты левого верхнего знакоместа для пары
INC B
LD (TMP_BC),BC ; сразу запоминаем BC для следующей пары байтов
DEC B

INC DE ; DE = адрес нахождения в спрайте

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 = адрес изображения в спрайте

PUSH DE
CALL ZBYTES ; выводим масштабированный первый байт пары
POP DE

INC DE
PUSH DE
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный второй байт пары
POP DE

POP BC
DJNZ ZOOML2 ; на следующую пару

EX DE,HL ; HL = адрес нахождения в спрайте, DE = свободно

POP DE ; DE = координаты спрайта на экране
POP BC ; B = цикл по количеству знакомест в спрайте
DJNZ ZOOML1
RET


; масштабирование байта изображения
; DE = адрес в спрайте, HL = адрес первого байта знакоместа на экране
ZBYTES LD A,(DE)
LD B,A ; B = байт изображения
XOR A
LD C,A
LD D,A
LD E,A ; в регистры C,D,E,A будем кидать масштабированные по горизонтали биты по два

ZOOM7 RL B ; загоняем во флаг CY 7-й бит байта изображения
JP NC,ZOOM6 ; если CY=0, переходим на следующий
OR #F0 ; устанавливаем %1111 для бита

ZOOM6 RL B
JP NC,ZOOM5
OR #0F

ZOOM5 LD C,A
XOR A
RL B
JP NC,ZOOM4
OR #F0

ZOOM4 RL B
JP NC,ZOOM3
OR #0F

ZOOM3 LD D,A
XOR A
RL B
JP NC,ZOOM2
OR #F0

ZOOM2 RL B
JP NC,ZOOM1
OR #0F

ZOOM1 LD E,A
XOR A
RL B
JP NC,ZOOM0
OR #F0

ZOOM0 RL B
JP NC,ZOOM8
OR #0F

; выводим на экран содержимое регистров C,D,E,A змейкой в прямоугольник 4х0.5 знакоместа
ZOOM8 LD (HL),C
INC HL
LD (HL),D
INC HL
LD (HL),E
INC HL
LD (HL),A

INC H
LD (HL),A
DEC HL
LD (HL),E
DEC HL
LD (HL),D
DEC HL
LD (HL),C

INC H
LD (HL),C
INC HL
LD (HL),D
INC HL
LD (HL),E
INC HL
LD (HL),A

INC H
LD (HL),A
DEC HL
LD (HL),E
DEC HL
LD (HL),D
DEC HL
LD (HL),C

RET


TMP_BC DEFW 0 ; буфер для хранения значений в BC

SPRITE ; тестовый спрайт
DEFB 16
DEFB 0,0,33, 128,0,0,24,24,0,8,255
DEFB 1,0,34, 192,48,192,48,192,48,192,48
DEFB 1,1,33, 12,3,12,3,12,3,12,3
DEFB 1,2,33, 0,0,0,0,128,192,64,192
DEFB 2,0,2, 254,159,129,224,254,31,24,248
DEFB 2,1,2, 7,230,254,223,193,240,255,15
DEFB 2,2,2, 192,64,64,192,192,64,64,192
DEFB 3,0,2, 255,159,128,224,255,31,24,248
DEFB 3,1,2, 6,254,255,195,192,254,63,6
DEFB 3,2,2, 64,64,192,192,64,64,192,192
DEFB 4,0,3, 255,143,128,224,255,31,24,248
DEFB 4,1,3, 230,255,207,192,248,255,6,6
DEFB 4,2,3, 64,192,192,64,64,192,192,64
DEFB 5,0,3, 255,131,128,224,255,24,24,248
DEFB 5,1,3, 255,255,192,192,255,31,6,6
DEFB 5,2,3, 192,192,64,64,192,192,64,64

ALKO
30.03.2011, 13:07
Вообще имелось в виду общее направление файтинга, школа и стиль игры. Планируется ли он быстрым/агрессивным с "рывками" и блоками в воздухе, а-ля ГГ, или футсис тягомотиной на земле а-ля СФ? А может это вообще симулятор? =)
Ну или вообще (с учётом платформы-то, да =)), комбы будут?
<troll-mode/>список знаком же?
http://ru.wiktionary.org/wiki/Прилож...йтинг-терминов
это врят ли,сложно сделать динамичную игру на машине с ограниченой памятью и вычислительными способностями (хотя очень хотелось бы).
Тут должно присутствовать мастерство кодинга.

NovaStorm
30.03.2011, 15:09
Но можно менять концепт, и сделать например одинаковых бойцов, взамен разнообразив им движения. Тем более что с ростом джвижений, кол-во анимаций расти будет не так существенно, тк много спрайтов будет повторяться.
Да и по поводу маски, если ещё не отказался, то наверное можно сделать на экране снизу пол, сверху какую-нибудь фигню как на скрине, а поле оставить пустым, визуально это не сильно скажется, но сэкономить и память и такты на маске поможет.
Такие спрайты как на мокапе, можно наверное хорошо сжимать RLE+START/(STEP)/STOP кодами. А декодировать таблично - получится почти Хаффман.
ЗЫ: Если уж делать файтинг, надо побить по играбельности хотя бы Yie Ar Kung-Fu =)

ALKO
30.03.2011, 15:22
ЗЫ: Если уж делать файтинг, надо побить по играбельности хотя бы Yie Ar Kung-Fu =)
Ну или хотя бы Mortal Kombat 3

NovaStorm
30.03.2011, 15:53
Ну или хотя бы Mortal Kombat 3

Это который из них? А то на спеке я играбельных МК не помню, все делались как технодемы =\

Andrew771
30.03.2011, 19:38
Лови процедуру масштабирования спрайта в 4 раза.
Кстати, если тебе не нужны атрибуты, то процедуру можно сократить.

ALKO
30.03.2011, 21:09
атрибуты не нужны,а увеличение бы в 2 раза сделать

Andrew771
30.03.2011, 21:49
атрибуты не нужны,а увеличение бы в 2 раза сделать
хорошо, завтра сделаю

Robus
31.03.2011, 03:34
Привет !

Очень немаловажно это то, какая будет графика. От этого будет зависеть степень сжатия графики. Я по-быстрому набросал примеры вывода графики. Данная графика, что была выложена как пример, была, конечно большая. И ко всему этому прогнанная через конвертер, а значит уже не идеальна. Как бы то ни было, я сделал три вида вывода графики, с разными параметрами объёмов и скорости. И так, в примере высвечивается спрайт 80х88 пикселей, и если нажать:

"1" - Вывод с максимальной скоростью, размер одного спрайта примерно 2200 байт.
"2" - Вывод с упаковкой, размер одного спрайта примерно 800 байт.
"3" - Вывод без упаковки с оптимальной скоростью, размер одного спрайта ТОЧНО 960 байт.

Цветом на бордюре ты можешь определить занятость процессора и примерно оценить сколько ты успеешь сделать кадров за секунду. Второй вариант должен был упаковать данный спрайт, но спрайт не простой из-за чего сжатие не сильное.

Хочу обратить внимание, что совсем не ясен весь процесс вывода спрайта. Вывод квадратика(спрайта) не так сложно, сложен комплекс. В первую очередь нужно чётко спланировать желаемый результат. Графику поле вывода нужно стереть(наверное), скорее всего спрайты должны налазить друг на друга(наверное). В общем, в итоге получится "движок". Хочу сразу привести пример на написанный мной движок вот по этой ссылке: http://zx.pk.ru/showthread.php?t=2513

Этот "движок" вряд-ли можно подружить с бейсиком, и собственно, не вижу смысла. Однако в этом "движке" реализована возможность отображать героев высотой в 1/2 экрана с наложением и регенерацией всего экрана. Мало того, графика именно упакованная, и реализована возможность поворачивать героев. Плюс возможность отображать только маску, что можно использовать как эффект мерцания героя. Расчёт игры был именно для Mortal Kombat. И оба персонажа со всеми ударами влазили в 128к, без фаталитей, конечно.

В общем, если заинтересуешься, я дам способ вывода спрайтов, и конвертеры графики. Сейчас я выложу пример вывода по клавише "3":


LD HL,18432+8

ShowSSPR
LD (SSSx1+1),SP
EXX
LD SP,SSPRTDT
POP DE
LD YL,D
LD A,E
RRCA
LD C,A
RLCA
RLCA
ADD A,C
LD B,0
LD C,A
LD HL,SSSxEN
SBC HL,BC
LD (SSSxJ0+1),HL
LD (SSSxJ1+1),HL
LD (SSSxJ2+1),HL
LD A,E
NEG
INC A
EXX
LD B,0
LD C,A
JR SSSxJ2
SSSxST DUB 16
POP DE ;10
LD (HL),E ;7
INC L ;4
LD (HL),D ;7
INC L ;4
EDUB
SSSxEN EQU $
ORG $-1
DEC YL
JR Z,SSSx1
ADD HL,BC
LD A,H
AND 7
SSSxJ0 JP NZ,0
LD A,L
ADD A,32
LD L,A
SSSxJ1 JP C,0
LD A,H
SUB 8
LD H,A
SSSxJ2 JP 0
SSSx1 LD SP,0
RET

SSPRTDT DB 10,88
IncBIN "gfx_00.bin"



Остальные способы не привожу, поскольку они адаптированы под мой язык ASAM. Если нужно будет, скажи я и их упрощу(распишу) под стандартные ассемблеры.

Да ... И ... Это ... Маленький совет ... Выкинь ВАСИК !

Andrew771
31.03.2011, 11:33
Наверное, не стоит делать компрессию спрайтов, лучше масштабирование.
А стирать область экрана тоже асмовской процедурой.

Вот процедура для увеличения спрайта в 2 раза, без атрибутов:



; тестовая программа
ORG 60000
LD HL,SPRITE
LD D,0
LD E,0
CALL ZOOM
RET


; подпрограмма масштабирования в 2 раза и вывода спрайта
; входные параметры: HL=адрес спрайта, DE=координаты знакоместа для вывода на экране (D-вертик., E-гориз.)

ZOOM LD A,(HL) ; HL = адрес нахождения в спрайте
AND A
RET Z ; выход, если пустой спрайт

LD B,A
ZOOML1 PUSH BC ; B = количество знакомест в спрайте
PUSH DE ; DE = координаты знакоместа для вывода

INC HL
LD A,(HL)
RLCA
ADD A,D
LD B,A
INC HL
LD A,(HL)
RLCA
ADD A,E
LD C,A ; BC = реальные координаты левого верхнего знакоместа на экране

INC HL
EX DE,HL ; DE = адрес нахождения в спрайте, HL = свободно

LD A,B ; расчет адреса первого байта знакоместа в HL для 1-4 байтов изображения
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 = адрес изображения в спрайте

PUSH BC

CALL ZBYTES ; выводим масштабированный первый байт

INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт


INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт


INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт

POP BC

INC B ; второе знакоместо ниже для 5-8 байтов изображения

LD A,B ; расчет адреса первого байта знакоместа в HL для 5-8 байтов изображения
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 = адрес изображения в спрайте

INC DE ; следующий байт изображения в спрайте
CALL ZBYTES ; выводим масштабированный байт


INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт


INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт


INC DE ; следующий байт изображения в спрайте
INC H ; следующая строка в знакоместе
CALL ZBYTES ; выводим масштабированный байт


EX DE,HL ; HL = адрес нахождения в спрайте, DE = свободно

POP DE ; DE = координаты знакоместа для вывода
POP BC ; B = цикл по количеству знакомест в спрайте
DJNZ ZOOML1

RET


; масштабирование байта изображения
; DE = адрес в спрайте, HL = адрес первого байта знакоместа на экране
ZBYTES LD A,(DE)
LD B,A ; B = байт изображения
XOR A
LD C,A ; в регистры C и A будем кидать масштабированные по горизонтали биты по четыре

ZOOM7 RL B ; загоняем во флаг CY 7-й бит байта изображения
JP NC,ZOOM6 ; если CY=0, переходим на следующий
OR %11000000 ; устанавливаем %11 для бита

ZOOM6 RL B
JP NC,ZOOM5
OR %00110000

ZOOM5 RL B
JP NC,ZOOM4
OR %00001100

ZOOM4 RL B
JP NC,ZOOM3
OR %00000011

ZOOM3 LD C,A
XOR A
RL B
JP NC,ZOOM2
OR %11000000

ZOOM2 RL B
JP NC,ZOOM1
OR %00110000

ZOOM1 RL B
JP NC,ZOOM0
OR %00001100

ZOOM0 RL B
JP NC,ZOOM8
OR %00000011

; выводим на экран содержимое регистров C и A змейкой в 2 байта по 2 строки
ZOOM8 LD (HL),C
INC HL
LD (HL),A
INC H
LD (HL),A
DEC HL
LD (HL),C

RET


SPRITE ; тестовый спрайт
DEFB 16
DEFB 0,0, 255,0,0,24,24,0,0,255
DEFB 1,0, 192,48,192,48,192,48,192,48
DEFB 1,1, 12,3,12,3,12,3,12,3
DEFB 1,2, 0,0,0,0,128,192,64,192
DEFB 2,0, 254,159,129,224,254,31,24,248
DEFB 2,1, 7,230,254,223,193,240,255,15
DEFB 2,2, 192,64,64,192,192,64,64,192
DEFB 3,0, 255,159,128,224,255,31,24,248
DEFB 3,1, 6,254,255,195,192,254,63,6
DEFB 3,2, 64,64,192,192,64,64,192,192
DEFB 4,0, 255,143,128,224,255,31,24,248
DEFB 4,1, 230,255,207,192,248,255,6,6
DEFB 4,2, 64,192,192,64,64,192,192,64
DEFB 5,0, 255,131,128,224,255,24,24,248
DEFB 5,1, 255,255,192,192,255,31,6,6
DEFB 5,2, 192,192,64,64,192,192,64,64