Основной игровой цикл.
У меня получается наоборот.. таймер на 100м векторе живет своей жизнью.. обрабатывая список вывода (заранее просчитанных) активных объектов.
Вид для печати
Заодно привяжи к нему и синхронизацию игрового цикла.
Привяжи - это не значит, помести обработку игрового цикла внутрь обработчика кадровых пререываний.
На спектруме, повторюсь, так и делают. На кадровых прерываниях, например, висит музыка. А так же по ним синхронизируется игровой цикл.
Поясню:
Допустим есть десять подвижных объектов.
В основном цикле мы заранее просчитали положение сдвиг спрайта и сохранили в буфере (экранные координаты, размеры, адрес для стирания)+признак активности.
На основании этого сформировали список из 10 позиций который будет крутить таймер.
Единожды отобразив на экарне сбрасывается признак активности и выводятся только те объекты в которых произошли изменения.
т.е. сдвинул спрайт в буфере, установил признак активности - в следующем кадре он выводится.
- - - Добавлено - - -
я догадываюсь :)
т.е. там же сделать некий счетчик и мы будем знать сколько кадров прошло с прошлого раза.
Включить\Выключить сетевой таймер из ЦП можно только так?
Или есть еще варианты?Код:.ASCIZ <33><267> ;влючить сетевой таймер ЦП
.ASCIZ <33><277><267> ;вылючить сетевой таймер ЦП
Обновление:
https://yadi.sk/d/XLyQ-qbc_17P5w
Можно уже стрелять и геноцидить :)
Возможны глюки, все в процессе отладки.
на первом же экране при попадании в самого нижнего кого то там вылет,
https://pic.maxiol.com/thumbs2/15870...6153020502.png
повторный запуск, вылет этажом выше
https://pic.maxiol.com/thumbs2/15870...6153419971.png
Не молоти пробел как угорелый.. разбираюсь с этой проблемой, также в упор врагов не расстреливай (негуманно :) )
- - - Добавлено - - -
Такова цена асинхронности отрисовки.. глюки вылазят где не ждали, поэтому выше спрашивал про таймер.. все дружно промолчали :(
- - - Добавлено - - -
Еще неприятность - пробел пересекается с кнопкой вправо, так что при движении вправо стрелять не получится.
Бит 9 регистра 0177054 в магистрали ПП, установлен в 1 - не работает, сброшен в ноль - работает.
BIC #400,@#177054 - разрешить сетевой таймер в магистрали ЦП.
BIS #400,@#177054 - запретить сетевой таймер в магистрали ЦП.
Но есть одно НО. События сетевого таймера поступают на вход EVNT процессора, там по данному случаю устанавливается триггер, по установленному состоянию которого и производится прерывание по вектору 100. При удовлетворении прерывания триггер очищается. Теперь представим такую ситуацию: у нас в ЦП запретили прерывания командой MTPS #200. Установлен 7-й бит в PSW, прерывания не возникают, но импульсы на вход EVNT поступают, поэтому триггер сетевого таймера установлен. В магистрали ПП командой BIS #400,@#177054 запрещаем подавать импульсы на вход EVNT ЦП. Но триггер сетевого таймера остался в установленном состоянии. Поэтому при разрешении прерываний командой MTPS #0 всё равно проскочит одно прерывание по сетевому таймеру.
действительно рисует лишний кадр (даже может и часть) из предыдущего состояния.. это я заметил.
Таймер мне нужно выключать именно из ЦП.. в меру своего понимания я сделал так: при входе в процедуру по 100му вектору я пытаюсь выключить таймер <33><277><267> отрисовываю.
Включаю же таймер когда пересчитал все для следующего кадра.
- - - Добавлено - - -
А глюки вылетают где придется.. мне нужно это еще переварить. Как при общем доступе к данным..
В новой версии персонаж как-то бешенно стал носится, относительно того, что было раньше.
И цвета лабиринт мне нравились раньше больше. Может даже не сами цвета, а то, как это все было нарисовано.
Хобот, потести на предмет вылетов:
https://yadi.sk/d/XLyQ-qbc_17P5w
насчет геймплея не заморочивайся, просто полетай постреляй, пока не глюканет.
Глюки возникали при совместном доступе к данным из программы и прерывания, правильная расстановка MTPS все решила.
Изменений довольно много сделал, добился "плавности " анимации до той степени которая меня устроила.
S_V_B, не вылетело пока, вылетит отпишу...
похоже ты много чего там поправил или я раньше не заметил
1. игра ярче стала выглядеть в градациях, что крайне важно
2. скорость очень шустрая ПКМ в эмуляторе
вопрос: может быть проблему со стрельбой вправо можно решить пересадив упр. на ДКЛ ? - это же почти джойстик на реале довольно удобный )
S_V_B, так сделай как на спектруме азоп+спейс или НР+стрелки как в "Кнайте" или "ЗЕТ" + цифровая или файер любая кроме дкл, где только движение - вариантов масса же...ты тетрис для 2-их Высотина включал? А ты включи и попробуй подвигать левый и правый фигуры. Можно по моему зажать кнопку и ППЦ - но если играть "честно" играть можно )))
Напоминаю: в большинстве игр на PDP-11 управление делается не стрелочками, а кнопками отдельной цифровой клавиатуры. "4" - влево, "5" - вниз (назад), "6" - вправо, "8" - вперед (вверх). Ну, и "7" - стрелять влево, "9" - стрелять вправо, если это нужно. В одномерном случае - "4" - влево, "5" - стоп, "6" - вправо. Иногда это дело опускают на ряд ниже - 1-2-3-5.
Цифры тоже пересекаются.
- - - Добавлено - - -
Дабы отвлечься сделал в редакторе экспорт тайлов 8х8 (в формате игры) и начал перерисовывать. (чтобы использовать все цвета в фоне, а не случайное наложение 3го плана как было раньше).
Зацени глазки:
https://pic.maxiol.com/thumbs2/15874...0421180642.png
зомбически!
AFZ, УК-НЦ клавиатура имеет специфику )))
особенно когда работаешь со скан-кодами, как я подозреваю и работает автор игры.
Мой вопрос-запрос про переделку исходника по прежнему актуален
>https://zx-pk.ru/threads/20444-pasca...=1#post1053389
Будем ждём версию пощупать поглядеть с обновлённой графикой и возможно управлением!
Спасибо.
Если использовать кнопки "C,F,Y,W,пробел", что очень удобно на реальной УКНЦ (все работает одновременно и летает и стреляет), становится невозможно играть на эмуляторе с его ПЦшной раскладкой :(
Сделаешь выбор и ты навыбираешь, что вообще летать толком не будет (с одновременно нажатыми клавишами).
Короче будет так: стрелки + шифт. (хотя шифт мне не нравится).
пробуйте:
https://yadi.sk/d/XLyQ-qbc_17P5w
- - - Добавлено - - -
Смысл в том чтобы.. лететь стрелять -- лететь по диагонали-- стрелять и все одновременно, не как на БК отдергивая пальцы как пианист:)
Да кстати уже можно пробивать препятствия (стены со взрывчаткой).
Боюсь после добавление всех проверок.. будет медленно летать и нужно будет опять все оптимизировать.
Хотя прогресс на лицо.. раньше инкремент кораблика был +2, сейчас по точкам.
На реале есть проблемка.. когда много врагов чуть помыргивают спрайты по очереди.. я думал что решил это выводом чет-нечет в прерывании, хотя пока не проверял может что и затупил.
- - - Добавлено - - -
Сейчас переходим к самому интересному:
1. Нужно сделать AI врагов.. сейчас кроме "камикадзе" никто не работает.
2. Изюминка этой игры - база (танк) который нужно за собой таскать.. поскольку энергия в корабле ограничена и для зарядки нужно возвращаться на базу.. и таскать ее за собой для этого и стены, чтобы жизнь медом не казалась.. иначе игра будет очень примитивна, как на БК.
+ пушки+ самонаводящиеся ракеты+ пузыри из противных трубок.. не знаю насколько мне удастся повторить оригинал.
Сделал AI врагов типа "шизик", двигаются непредсказуемо.
Улучшил в очередной раз плавность анимации и по мелочам еще.
https://yadi.sk/d/XLyQ-qbc_17P5w
На реале все вроде плавно.
В твоем эмуле очень быстро и странно себя "шизики" ведут - сразу падают вниз.. хотя должны метаться по экрану.
Возможно из-за того, что рандом на таймер ПП завязан, сейчас еще раз на реале проверю, если там все ок... то
- - - Добавлено - - -
Проверил на реале, "шизики" ведут себя правильно, бегают как положено. Что-то в твоем эмуле не так.
Есть проблемка, не успевает за один проход спрайты вывести - поэтому помыргивает. (не смог найти быстрый способ отключения таймера из ЦП). Но вылизывать позже буду.
Подергивание связано с отсутствием выравнивания длительности основного цикла (пока не придумал как сделать, по сетевому таймеру не вариант, получается маленькая разница в отсчетах).
Попробовал на танке покататься:
https://yadi.sk/d/XLyQ-qbc_17P5w
Нужно думать как ускорять (хотя циклы вывода уже развернуты). Можно попробовать засунуть танк в ПП (заранее сдвинув спрайты).
Когда выезжаешь из первой комнаты, и возвращаешься, левый нижний угол комнаты портится.
Я в курсе. Этож только для прикидки делалось, чтобы ресурсоемкость определить.. танк все равно убирать придется в ПП.
Кстати в оригинале есть такая "подлость", что можно самому по запарке подстрелить свой танк (тогда начнешь все с начала), стоит ли оставлять?
- - - Добавлено - - -
О великие ГУРУ УКНЦ, спуститесь наконец с "микросхемных небес" и объясните мне тупому как быть..
(мы работаем в адресном пространстве ЦП)
Всем понятная ситуация (кто пробовал рисовать по вектору 100).. когда пришло прерывание, нужно отключить таймер чтобы не начал повторно рисовать (если не успел)..
Варианты.. попросить через терминал, свой обработчик в ПП... медленные, получаются глюки.
С отрубанием MTPS работает, но дергано и (при переходе в другую локацию)... стирает не там.. (это к сообщению Titus выше).. (успеть нарисовать за ход луча не вариант, итак уже рисуем чет-нечет, скорости разные (на единичку) чтобы в кадр попадало как можно меньше объектов)
Как бы вы справились с подобной ситуацией? (Или УКНЦ сделана для работы только с RT-11 и только для совместимости с терминалами и для работы с софтом который стырили у DEC? )
- - - Добавлено - - -
Это я к чему... если вырубить таймер то анимация будет гораздо плавнее, а не рывками с пропусками больших кусков кода по MTPS.
Классический подход при работе с прерываниями на архитектуре PDP-11 - обработчик прерывания начинает работать на уровне приоритета устройства (точнее - на том, что загрузилось в PSW из слова вектор_прерывания_+_2) и, по рекомендациям DEC, на выполнение работы у него есть с десяток команд процессора. Напоминаю, PDP-11 проектировались, в том числе, для создания систем реального времени. Если обработчик прерывания не успел сделать свою работу, то, по хорошему, должна быть очередь для обработки таких (отложенных) прерываний, соответственно, запрос на продолжение работы ставится в эту очередь и обработчик завершает свою работу. После того, как ВСЕ активные запросы на прерывания будут обработаны или поставлены в очередь - начинается выборка заданий из очереди - и доделывание работы.
С учётом того, что твоя игрушка - по сути система реального времени (к примеру, отрисовка в обработчике прерывания заняла 2 секунды - на 2 секунды игра застыла и не реагирует, скажем, на прерывания от клавиатуры) - или хайли оптимизировать обработчик прерывания от таймера или переходить на выше описанный вариант или высчитывать синхронизацию разных действий (с очень небольшим количеством выполняемых команд) с точностью до команды.
И в третьем случае:
- это 101, а не 2 команды.Код:mov #100., r1
10$:
sob r1, 10$
- - - Добавлено - - -
в соответствии со стандартной архитектурой PDP-11 и на ней будет работать всё, что написано под эту архитектуру. Именно поэтому перенос на неё, скажем, RT-11 - тривиален, в отличии от, скажем, БК
Это я к чему... если вырубить таймер то анимация будет гораздо плавнее, а не рывками с пропусками больших кусков кода по MTPS.
Не заметил очереди.. режет по живому :)
это находится в другом адресном пространстве.. и насколько я понял в ЦП полезных прерываний нет.. поэтому и работает при MTPS #200
Вопрос в другом как у этого "котопса" выключить быстро таймер у пса если это можно сделать только попросив кота?
- - - Добавлено - - -
Да к стати я придумал кличку для УКНЦ -"КОТОПЕС ". (ORR)
Обычно эту работу берёт на себя операционка. И по большей части этот механизм сделан для драйверов. Но в RSX есть API и для программ, но он несколько более (для программ /PR:5) или более замороченный (для программ /PR:0). И ЕМНИП, что то есть и в RT.
Или же программа сама реализует (похожий) механизм.
Прерывание от клавиатуры и вывода на экран (177560-177566), прерывание от С2, по идее - прерывание от MZ, вектор 4, вектор 10 - это как минимум.
MTPS #200
Быстрее - нет. Это - логическая маскировка. Физическая маскировка (нет на УК-НЦ) -- BIC #100, @#177546. Почему маскировка. Таймер каждые 0.02 с выставляет запрос на прерывание. В этот механизм разрешение или запрет никак не вмешивается. То есть, если за 0.0000000001с до выставления запроса включить разрешение - от через 0.0000000001 с прилетит прерывание. А не через 0.02 с
Какая разница где - механизм прерываний и их обработка одинаков.
Отработает любая команда MTPS #байт. И выставится любой приоритет процессора от 0 до 7. Просто снаружи возможен запрос только с пятым приоритетом, так что или выставить приоритет от 0 до 4 - и тогда снаружи прилетит, или от 5 до 7 - и тогда запросы снаружи игнорируются.
Быстрее работающий ЦП.. никак не может на это повлиять... ну не верю... вы же под микроскопом смотрели... должна быть какая-то ячейка при обнулении которой таймер останавливается.. за 3 такта.. (шучу конечно)
- - - Добавлено - - -
Не забывай - два процессора - две разные машинки. :)
И ПП разрешает прерываться по 100му ЦП.