Так я же вроде сделал демо режим....
)))
или Вы имеете в виду что-то другое?
И что Вы понимаете под рисовалкой уровней?
Так я же вроде сделал демо режим....
)))
или Вы имеете в виду что-то другое?
И что Вы понимаете под рисовалкой уровней?
демо режим есть, но нажимать чего-то в нем по-моему лишнее (можно было просто указать, что используются такие-о клавиши в игре). Хозяин-барин, я не навязываю автоматический вход в режим демонстрации попрошествии определенного времяни.
----
загрузите lode runner и подождите немного, сами все увидите. Хотя, в данном случае идея дурацкая.
Слушай, чет с музыкой не клеится((
Вроде всё сделал как надо... но дает одну ноту и все... может я чего-то не так понял?
в им2
1)40000-адрес загружаемой мелодии
2)40012-адрес пригрывания следующей ноты
3)0-адрес остановк, который не указывается
4)39900-адрес загрузки им2, по этому же адресу и будут запускаться прерывания, а соответственно и музыка...
в бейсике
10 randomize usr 15619: rem: load"music" code 40000
20 randomize usr 15619:rem: load"im" code 39900
30 randomize usr 39900
правда адрес 39900 он не пропускает (почему такое происходит?), поэтому указываю тот, который он предлагает.
для мелодии компилированной в wham! с адреса 40000 в режиме always, по порядку вводятся следующие значения:
первый адрес вызывается при старте (40000)
второй адрес вызывается при остановке (0, т.к. ничего вызывать не нужно)
третий адрес вызывается каждое прерывание (40012)
четвертый адрес первый байт занимаемый процедурой (расположение в памяти, не более того).
Потому, что в ПЗУ нужного вектора нет, а в ОЗУ значения можно записать только по адресу 255+256*154=39679\39680 (либо 255+256*155=39935\39936). По одному из них и заносится указатель на адрес, начала процедуры обработки прерываний (старший и младший байт).правда адрес 39900 он не пропускает (почему такое происходит?), поэтому указываю тот, который он предлагает.
для запуска на бейсике ввести (для данного случая):
Кстати, для той мелодии, что использовалась мною в демонстрации нужны другие адреса (ибо написана она не в wham!, воспроизводится не через бипер, и принцип прогирывания другой).Код:8 clear 39899 10 randomize usr 15619: rem: load"music" code 40000 20 randomize usr 15619: rem: load"im" code 39935 30 randomize usr 39971
----
На самом деле, обработчик можно прописать по любому адресу (т.к. все три части не особо связаны между собой), занеся два байта в ячейки на которые указывает вектор прерываний. Для этого можно использовать программу autoIM2 стерев строки со 2 по 17 и набрать:
в своей программе же нужно вписать:Код:2 let m1=адрес при старте 4 let m2=адрес при остановке 6 let m3=адрес в прерывании 8 let i=адрес начала процедуры 10 let o=i 12 let z=старший байт вектора (0-255)
либо вычислить все значения заранее.Код:здесь z и i - числа, соответствующие переменным использованным в предыдущей программе! 10 poke 255+256*z,i-256*int (i/256) 12 poke 255+256*z+1,int (i/256)
----
Сам долго не мог разобраться, как работают прерывания, пока не допетрил, что вектор прерываний указывает на две ячейки, содержимое которых указывает на адрес начала процедуры обработки прерываний. Что-то вроде рекурсии: go to n, где в строке n стоит go to m, а уже со строки m располагается подпрограмма.
----
добавил вложение.. enjoy it!
----
Ну, наконец-то.. Рад за вас!![]()
Последний раз редактировалось null_device; 03.10.2015 в 13:42.
спасибо!!! теперь все ок!!!
Может все таки вторые прерывания используем более продуктивно? Водичку анимируем, ключики крутящиеся сделаем или еще че-нить придумаем.. ну, или музыку в каком-нить другом редакторе написать можно. Игра на бипере сильно подвешивает даже вторые прерывания (из-за особенности синтез звука).
Последний раз редактировалось null_device; 23.02.2010 в 19:47.
пока не думал...
Хотя идея очень интересная! Сначала надо бы уровней побольше и музыку впихнуть))) а там уже будет видно...
А по какому принципу это все будет работать?
Такой размышлизм: Скидывая magic button различный варез на диски и изучая, то, что получилось - столкнулся с музыкой лежащей в доп страницах (при том, зачастую, одних и тех же). Такое ощущение, что мелодия используется путем впечатывания страницы - проигрывается квант мелодии - возвращается на место предыдущая страница.
----
Написал загогулину! %) Даже две! Процедурка получилась сырой, но вполне работспособный пример в виде снапшота. Пока, работает довольно тормознуто. Вариант номер раз: даем run - запуск вторых прерываний, потом пауза - жмем любую кнопку, запуск только самой процедуры замкнутой в цикл. Вариант два: просто run и глядим, как крутятся ключики, бежит водичка и шевелится растительность.. Либо набиваем строку 30 как в первом варианте и смотрим работу только процедурины (они компилированы в одни и те же адреса). 8D
Последний раз редактировалось null_device; 03.10.2015 в 13:42.
Прикольно!!
А разница только в скорости изменения изображения?
и ещё мне интересен принцип... надо вводить новые значения графики udg? каким образом это делается?
Никаких задержек в самой программе специально не делается..Первый вариант тормозит из-за неоптимального алгоритма (и, вообще использования компилятора, надо полагать). Если бы писалось на ассемблере без использования штатных процедур ПЗУ скорость была бы выше на порядок.
Первый вариант: каждое прерывание выводится один элемент (из 50), значения которого беруться из массива. Получилось тормознуто, решил сделать обработку "оптом".
Второй вариант: каждое прерывание выводится максимально возможное кол-во элементов (в моем случае все 50).
Видимо проблема медленной работы в том что происходит инициализация компилированной программы и обработка стандартной процедуры (jp 56) прерываний после вызова подпрограммы в кодах.
Программка простая до ужаса. Правда, пришлось увеличить кол-во спрайтов (на каждый юнит 4 спрайта для анимации).----Код:10 let s=40000 : let g=50000 ; таблица юнитов, обл спрайтов 12 let n=peek s: if n>50 then goto 200 ; проверка обработки всех юнитов 14 let m=peek (s+1+(n*4)) : let f=peek (s+2+(n*4)) ; тип юнита, фаза спрайта 16 let y=peek (s+3+(n*4)) : let x=peek (s+4+(n*4)) ; координаты юнита 18 randomize (g+(m-1)*32) : poke 23675, peek 23670: poke 23676, peek 23671 20 if m<>0 then go to 30 ; проверка на пустой юнит 22 goto 104 ... 30 let f=f+1 : if f>3 then let f=0 ; инкремент фазы 100 poke s+2+(n*4),f 102 print st y,x; paper 8; ink 8; chr$ (144+f) ; печать юнита 104 poke s,n+1: goto 12 ; следующий юнит 200 stop
Добавил вложение с бейсик программой и компилятором (т.к. конечный вариант сделан именно им). Для просмотра нужно загрузить файл probe.B, запустить со строки 1000. После чего можно сделать run посмотреть работу одного цикла программки, или вставив в строку 200 goto 12 - зациклить анимацию.
Последний раз редактировалось null_device; 03.10.2015 в 13:41.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)