Вход

Просмотр полной версии : Помогите с выводом спрайтов



Руслан
24.07.2012, 19:16
Привет, сможет ли кто написать на ассемблере код по выводу спрайта по маске. Что бы я мог выводить его из бейсика таким способом -

10 randomize usr 32768 poke 32769,34 (34 координата по горизонтали)

А лучше - я прогружаю код по адресу 32768, по следующему адресу выбираю количество кадров спрайта, далее кордината икс и игрик. Запустив код, у меня запускается анимация из пяти кадров. Помню был какой то редактор, но он не по маске выводил, лазер бейсик тоже не по маске выводит. Буду признателен кто напишет этот код. Хочу сделать игру.

---------- Post added at 18:10 ---------- Previous post was at 18:09 ----------

просьба если напишите, сразу откомпилировать.

---------- Post added at 18:16 ---------- Previous post was at 18:10 ----------

просьба если напишите, сразу откомпилировать.

Protom
24.07.2012, 20:14
Какой размер спрайтов? Где и как будешь их держать?

Руслан
24.07.2012, 20:41
страницы с 32768 переключаются? (не помню просто)
Если да то именно с 32768 и выше, высота спрайта примерно 35, ширина 25.

Руслан
24.07.2012, 22:14
Единственный мой опыт работы с лазер бэйсиком закончился тем что из за нехватки памяти пришлось забросить игру на 50%. На счет маски, может я и заблуждаюсь.
Мне достаточно того что я попросил, лазер бэйсик мне не нужен.

Alex Rider
24.07.2012, 22:56
В "Графике" ответил.

Руслан
24.07.2012, 23:29
Alex Rider, спасибо!

null_device
25.07.2012, 05:05
Единственный мой опыт работы с лазер бэйсиком закончился тем что из за нехватки памяти пришлось забросить игру на 50%.

Можете попробовать посмотреть в сторону библиотеки для работы с графикой от Вячеслава Медноногова (http://www.zxpress.ru/article.php?id=9972)..

GriV
26.07.2012, 12:46
В "Графике" ответил.
Ссылку дали бы тоже. Вот мне трудно найти - что там конкретно отвечено в графике.

Alex Rider
26.07.2012, 13:40
http://zx.pk.ru/showthread.php?t=19713

Руслан
08.08.2012, 10:41
Спасибо Alex Rider'u за помощь. Но появилось еще небольшая необходимость в небольшой доработке данного кода.


ld hl,50000
ld ix,32774
loop ld a,(hl)
ld (ix + 2),a
inc hl
ld a,(hl)
ld (ix + 0),a
inc hl
ld a,(hl)
ld (ix + 1),a
inc hl
push ix
push hl
call 32768
pop hl
pop ix
ld a,(hl)
and a
jr nz,loop
inc hl
ld a,(hl)
and a
jr nz,loop
ret

Данный код выводит определенные спрайты по определенным координатам.
Мне нужно к нему добавить еще сравнения. То есть.

Допустим, если такой то бит равен двум, то значение в первой строке (ld hl,50000) равно 50400. И в таком же духе.
Просто у меня 40 экранов, повторять код это лишний килобайт, а я хочу в 48 уложиться. Подскажите плиз что нужно приписать. Спасибо!

alone
08.08.2012, 11:46
Вызывай эту процедуру с параметром в HL.

Руслан
08.08.2012, 13:38
как это по удобней сделать чтоб, с учетом того что я работаю из под бэйсика?

Protom
08.08.2012, 13:54
Из бейсика делаешь два POKE и вызываеш процедуру.

Или делай много входов процедуру:


PIC1: ld hl,50000
jr MAIN
PIC2: ld hl,50400
jr MAIN
....
PICX: ld hl,xxxxxx
jr MAIN
MAIN: ld ix,32774
loop ld a,(hl)
ld (ix + 2),a
inc hl
ld a,(hl)
ld (ix + 0),

Руслан
08.08.2012, 14:01
Из бейсика делаешь два POKE и вызываеш процедуру.

мне интересно как там рассчитывать адрес, если через поке его выставлять.

на счет много входов, не совсем понял

GriV
08.08.2012, 14:48
Смотрите, у вас программа начинается с адреса 30000 (любимое всеми новичками). Тогда команда LD HL,XXYY будет занимать ячейки 30000, 30001 и 30002.
Младший байт адреса будет в ячейке 30001, старший в 30002.
Тогда из Бейсика достаточно написать POKE 30001,<некое нравящееся число> и потом делать запуск.

Руслан
08.08.2012, 14:51
POKE 30001,<некое нравящееся число> и потом делать запуск

мне нравиться 50000, но что то не работает)

Shadow Maker
08.08.2012, 15:04
Зачем надо для каждого момента создавать новую тему? Пиши в той же. Посты перенес.

Alex Rider
08.08.2012, 17:14
Сначала поворчу:

Допустим, если такой то бит равен двум,
Поаккуратнее так... Могут прокомментировать жоско.

но что то не работает)
А вот так не делаем больше совсем. Всегда пишем как не работает, что показывается/не показывается, как ведет себя программа/компилятор...

Теперь по делу. Итак, как я понимаю, у тебя есть табличка типа этого:


Экран Адрес
--------------
1 50000
2 51000
3 52000
...


Еще допустим, что ты дописал первой строчкой к моему коду ORG 40000, то есть, положил программу в 40000 и оттуда же ее запускаешь.

Тебе предложили несколько способов вызова, сейчас распишу подробнее.
Итак, способ №1, самый простой и самый медленный: адрес спрайтовой карты задается в коде первой строкой: ld hl,50000. Чтобы менять его из BASIC'а, надо сделать так примерно:


1000 LET HL=50000: REM HL - адрес нужной карты спрйатов (51000, 52000...)
1010 LET H=INT(HL/256): LET L=HL-H*256
1020 POKE 50001,L: POKE 50002,H
1030 RANDOMIZE USR 40000


Способ №2 - побыстрее способа №1, но его нельзя использовать если в отсальной программе используется функция Бэйсика RND


1000 LET HL=50000: REM HL - адрес нужной карты спрйатов (51000, 52000...)
1010 RANDOMIZE HL
1020 POKE 50001,PEEK 23670: POKE 50002,PEEK 23671
1030 RANDOMIZE USR 40000


Эти 2 способа не требуют изменения ассемблерной программы.
Способ №3 - самый быстрый, но несколько расточительный по памяти.
Что надо:
1) убрать строку ld hl,50000 в начале программы.
2) в следующую после убранной строчку в поле меток написать метку main
3) для каждой спрайтовой карты дописать перед строкой с main (после ORG) такие строки:


ld hl,50000
jr main
ld hl,51000
jr main
ld hl,52000
jr main
...

4) если номер спрайтовой карты хранится в переменной N, то для вывода каждой карты надо написать RANDOMNIZE USR 40000+N*5 (потому что ld hl,NNNN: jr main занимает 5 байт).

Есть способы еще поменьше и побыстрее, но предлагаю их пока отложить.
Кстати, у меня к тебе есть 2 вопроса:
1) зачем ты загружаешь код вывода спрайтов в 32768? У тебя для Бэйсика останется всего 32768-23755 =~ 9 Кб, что очень мало для игры. Ты говорил, что не смог написать игру с помощью Laser Basic'а потому, что тебе не хватило места - но он располагается гораздо ниже, в районе 50000 примерно, то есть под Бэйсик оставалось 26 Кб - и этого тебе не хватило.
2) Если ты исползуешь Sprite Graber, то процедура вывода карты может быть уменьшена и ускорена. Если надо - обращайся.

Руслан
09.08.2012, 19:08
32768 это временное место расположение. Подниму выше. На лазерб не хватило памяти, потому что я расположение координаты спрайтов хранил в том же бэйсике, а это много занимало. Сейчас же у меня 40 экранов вместе с координатами весят 10 кб. и их я могу засунуть куда угодно). А сколько как правило памяти занимают переменные в бэйсике? Есть способы узнать это?

Alex Rider
09.08.2012, 21:00
А сколько как правило памяти занимают переменные в бэйсике? Есть способы узнать это?
Тебе нужен размер каждой переменной? Если да, то надо курить формат хранения переменных в BASIC'е. Если отследить в текущий момент времени, то:
ELINE=PEEK 23641 + 256 * PEEK 23642: LET VARS = PEEK 23627 + 256 * PEEK 23628: PRINT ELINE - VARS.