Важная информация

User Tag List

Страница 17 из 54 ПерваяПервая ... 131415161718192021 ... ПоследняяПоследняя
Показано с 161 по 170 из 531

Тема: ZX Like Pascal

  1. #161
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Есть идея насчёт ReadKey. Нужно сделать её похожей на стандартную турбопаскалевскую. Пусть будет буфер на 4 кода. Обработчик прерываний опрашивает клавиатуру и найденную клавишу помещает в первую свободную (=0) ячейку буфера. Автоповтор тоже так же реализуется. При отпускании тоже помещается код клавиши, но с флагом release. Так же, ещё должны быть флаги модифицирующих клавиш капс и символ шифт. Флаги возвращаются в отдельной переменной. Вызов выглядит так Readkey(key,flag);
    После чтения кода процедура прокручивает буфер вперёд, обнуляя последний код. Если ничего не нажато, то возвращается код 0. Так удобнее, чем использовать конструкцию if KeyPressed then ReadKey(); Программа просто читает и обрабатывает коды клавиш, пока key возвращается не нулевой. Это хорошо подойдёт для набора текста, ввода имени в турнирную таблицу и т.д.

    Вторая часть идеи. Тут предлагали дать доступ к портам, но можно по другому. Программа создаёт массив из 10 байт и вызывает функцию SetKeyBuffer(keys); Теперь обработчик прерывания видит, что задан буфер клавиш и читает порты клавиатуры и считанное заносит в этот буфер в соответствующие байты. Т.е., получаем в байтах массива нажатые кнопки с каждой полустроки клавиатуры. В 9 и 10 байты занести считанное значение порта джойстика. В итоге, всё под рукой и можно легко узнать какая клавиша нажата. Можно даже в обработчике инвертировать считанный байт, чтобы установленный бит означал нажатую клавишу. Ну это не обязательно.
    В конце программа вызывает функцию ReleaseKeyBuffer;, которая обнуляет свой указатель на массив и обработчик прерывания более не заполняет его.

  2. #162
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,611
    Спасибо Благодарностей отдано 
    2,187
    Спасибо Благодарностей получено 
    140
    Поблагодарили
    106 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Посмотрите как устроен буферизованный ввод с клавиатуры в ZXDev. Применяется буфер на 8 клавиш, обработчик повешен на прерывание, поэтому пользователь может нажать и отпустить клавишу между опросами, её нажатие всё равно будет зафиксировано. Также работает автоповтор.

    https://github.com/Oleg-N-Cher/XDev/.../Lib/C/Input.c

    Это примерно то же, что предлагает AzAtom.

    Ещё есть универсальная процедура опроса управления, опрашивает джойстики и QAOPSpace, возвращая все (одновременно) нажатые кнопки в виде битового поля. Это для игр. Разумеется, чудес не бывает, и ей присущи все аппаратные ограничения Спектрума на одновременное число нажатых клавиш.

    https://github.com/Oleg-N-Cher/XDev/...ib/C/Control.c

  3. #163
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Обновил генератор спрайтов. http://zx-pk.ru/threads/24967-zx-lik...l=1#post882316

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

    - - - Добавлено - - -

    Ещё идея насчёт спрайтов.

    На настоящий момент нет поддержки анимации. Чтобы например ГГ ходил нужно задать несколько отдельных спрайтов и печатать их по очереди.
    Предлагаю сделать мультиспрайт, который является одним массивом, но содержит подряд несколько спрайтов, подобно тому, как я здесь объединил спрайты карты.
    Спрайты должны быть одинакового размера в байтах. В массиве байты 0 и 1 содержат 16 битное число - размер одного спрайта в байтах. Емнип, спрайты могут состоять из 255*11+1 = 2806 байт, поэтому, одним байтом не обойтись.
    Спрайты имеют номера от 0 и выше. В процедуры вывода спрайтов ввести ещё один параметр - номер выводимого спрайта, например SpritePutClear(<sprite name>,<sprite index>,<x>,<y>);
    Тогда мультиспрайт анимации ГГ может содержать, например:
    0 - исходное положение (стоит),
    0, 1, 2, 3 - фазы хождения,
    0, 4, 5 - фазы приседания,
    0, 4, 6 - фазы прыжка,
    0, 7 - фазы стрельбы,
    0, 4, 8 - фазы умирания.
    При желании можно несложно сделать кучу фаз движений, как в "Принц Персии".
    Мультиспрайт гранаты может содержать фазы её вращения при полёте, мультиспрайт бочки может содержать фазы взрыва.

    Спрайты карты тоже можно задать как один мультиспрайт с кучей спрайтов. И чтобы не плодить разных функций можно оставить только мультиспрайты.
    Можно даже не переделывать названия функций.
    Думаю, удобно получится, а размер увеличится всего на 2*(количество мультиспрайтов) байт, т.е., не так уж и много.
    Последний раз редактировалось AzAtom; 22.08.2016 в 12:03.

  4. #164
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AzAtom Посмотреть сообщение
    Предлагаю сделать мультиспрайт, который является одним массивом, но содержит подряд несколько спрайтов
    Классная идея. Теперь тогда можно сделать единый формат для спрайтов и спрайтов карт. Только размер каждого спрайта в мультиспрайте вот думаю, сделать одинаковыми или может быть различным (для экономии памяти, чтобы не хранить пустые знакоместа). Можно вообще сделать прямоугольными, тогда координаты каждого знакоместа не надо хранить. Но могут попадаться пустые знакоместа - 8-9 байт лишнего хранения на каждое.

    Про начальный адрес компиляции 23900 думал. Не буду всё-таки делать его изменение из программы, т.к. будет хаос. Виртуальный экран занимает свою область памяти. А еще когда будут введены параметры процедур, нужно будет под стек серьезно память расширить. Лучше пусть компилятор это распределяет, а не пользователь. Да и зачем сдвигать 23900, планируется на Бейсике еще что-то писать до Паскаля?
    Если уж так надо, меняй адрес компиляции вручную в скомпилированном файле, как сейчас.

    Чтение клавиатуры. Думаю, сделать процедуру без параметров Readkey, которая заполняет буфер нажатых клавиш (пусть будет 10). А потом можно проверять переменную key, нажата ли какая-либо клавиша из буфера или нет:

    Readkey;
    if key='q' and key='p' then ... {движение вверх-вправо}

    Спрайт-генератор включу в дистрибутив ZX Like Pascal, удобный.

  5. #165
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я тут подумал, даже не нужно указывать размер спрайта в байтах, он же просто вычисляется 1+количество знакомест*размер знакоместа (10 или 11 в зависимости от наличия атрибута). Просто главное, чтобы размеры в байтах были одинаковые, иначе скорость вычисления смещений может замедлится заметно.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Только размер каждого спрайта в мультиспрайте вот думаю, сделать одинаковыми или может быть различным (для экономии памяти, чтобы не хранить пустые знакоместа)
    Ну у тебя же знакоместо может находится в любом месте спрайта и они не должны быть прямоугольными. Просто при прыжке спрайт может быть более высоким и там будут нарисованы руки, при стрельбе может торчать сбоку знакоместо с оружием, при беге знакоместо будет содержать ноги. Главное, чтобы количество знакомест было одинаковым в одном мультиспрайте.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Да и зачем сдвигать 23900, планируется на Бейсике еще что-то писать до Паскаля?
    Я хотел один проект сделать, который должен жить и работать с 32768. А до него ещё одну программу уместить. В общем, 2 программы, одновременно, одна с нынешнего адреса, вторая с 32768.

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Спрайт-генератор включу в дистрибутив ZX Like Pascal, удобный.
    Спасибо. Конечно, тут напрашивается и некий редактор, но тогда проще будет прикрутить к готовому редактору сохранение в текстовом виде.

    - - - Добавлено - - -

    Ещё идея про клавиши. Обработчик клавиатуры опрашивает клавиатуру и складывает в специальный массив все нажатые кнопки, хоть 10, хоть 20 штук. Туда входят и кнопки джойстика.

    Программисту доступны функции:
    - функция function ReadKey(flag:byte):byte;, которая возвращает код нажатой клавиши и во флаге признаки нажатых шифтов. Коды всегда соответствуют большим буквам как в таблице из мануала. По анализируя флаг программа уже может сделать прописные буквы и т.д. Можно организовать как буфер, т.е., при нажатии программа считывает код один раз, при автоповторах тоже по одному разу. Как в турбопаскале, в общем.

    - функция function KeyPressed:boolean; - аналог турбопаскалевской функции.

    - функция function KeyPressed(key:byte):boolean; - возвращает, нажата ли сейчас клавиша с кодом в key, ищет во всём массиве, это должно быть быстро, вроде и команда такая есть у процессора.

    Кнопкам джойстика тоже надо дать коды.

    В результате, программу можно писать так:
    В программе есть переменные для кодов клавиш, например kleft, kright, kup,kdown,kfire,kexit:byte;
    раздел переопределения управляющих клавиш может выглядеть так:
    TextOut(5,5,'Нажмите "Налево"'); потом kleft:=ReadKey(kflag);, и т.д.

    А во время игры просто проверка нажатия влево: if KeyPressed(kleft) then begin ... end; и так для каждой нужной клавиши.

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

  6. #166
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    if key='q' and key='p' then
    Это антинаучно!

  7. #166
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  8. #167
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ещё хорошо бы спектрум-специфические функции реализовать в отдельном модуле, функции работы со спрайтами, с экраном, вывод звука, ввод с клавиатуры. И тогда мы могли бы назвать модули одинаково и можно будет в дельфи компилировать под windows, в турбопаскаль компилировать под DOS, а в ZX Like Pascal компилировать под спектрум и всё это вообще без изменения кода.
    Хорошо бы, и у тебя ввести процедуры Init и Deinit, тогда можно будет без изменения кода перекомпилировать. В принципе, в дельфи получается и без них, но тогда флаги не передать.

    - - - Добавлено - - -

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Спрайт-генератор включу в дистрибутив ZX Like Pascal, удобный.
    Перекачай, исправил пару небольших ошибок. http://zx-pk.ru/threads/24967-zx-lik...l=1#post882316

    - - - Добавлено - - -

    Andrew771, можешь расписать принцип работы функции MapSearch? Мне осталось реализовать её и SounfEffect, тогда можно будет пробовать компилировать и в delphi и в zx like pascal.

  9. #168
    Veteran
    Регистрация
    26.11.2013
    Адрес
    г. Новосибирск
    Сообщений
    1,042
    Спасибо Благодарностей отдано 
    934
    Спасибо Благодарностей получено 
    227
    Поблагодарили
    122 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AzAtom Посмотреть сообщение
    функция function ReadKey(flag:byte):byte;, которая возвращает код нажатой клавиши
    Я-бы посоветовал не перегружать ReadKey таким образом. ReadKey уже описана в мануалах и привычна. Она возвращает была ли нажата и возможно давно отжата клавиша. А нам нужно узнать давится-ли клавиша прямо сейчас. Если не понравилось моё GetKeyState, придумайте новое, может KeyDown?
    И всётаки считаю лучшим вариант с виртуальными кодами:
    Есть текстовой слой, связка KeyPressed и ReadKey; для ввода текста, с нужным регистром. Всё чётко, научно и без граблей.
    (Возможно добавить процедуры инициализации клавиатуры, процедуры обслуживания по таймеру 50 герц)

    И есть слой "кнопочный", ближе к железу; для игрового процесса;
    GetKeyState(VirtualKeyCode:word):boolean;

    Например "IF GetKeyState(VirtualKeyCode) then ", где VirtualKeyCode 16-битная константа, должно компилится в
    LD A,HI(VirtualKeyCode)
    IN A,($FE)
    AND LO(VirtualKeyCode)
    JP NZ,SKIP_NNN

    И GetVirtualKeyCode:word вернёт код нажатой сейчас клавиши, в готовом формате для GetKeyState.[/QUOTE]
    Например TextOut(5,5,'Нажмите "Налево"'); kleft:=ReadKey(kflag); wkleft:=GetVirtualKeyCode; TextOut(5,15,kleft);
    И в игре вызывать её:
    IF GetKeyState(wkleft) then
    LD HL,(wkleft)
    LD A,H
    IN A,($FE)
    AND L
    JP NZ,SKIP_NNN

  10. #169
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AzAtom Посмотреть сообщение
    Ещё хорошо бы спектрум-специфические функции реализовать в отдельном модуле, функции работы со спрайтами, с экраном, вывод звука, ввод с клавиатуры. И тогда мы могли бы назвать модули одинаково и можно будет в дельфи компилировать под windows, в турбопаскаль компилировать под DOS, а в ZX Like Pascal компилировать под спектрум и всё это вообще без изменения кода.
    Это я изначально не планировал, думал только под Спектрум. Сейчас Oleg N.Cher поругается.

    Цитата Сообщение от AzAtom Посмотреть сообщение
    Andrew771, можешь расписать принцип работы функции MapSearch?
    В мануале описан, цитирую:
    MapSearch(<x>,<y>,<id element>,<id condition>,<distance>,<value variable>,<x variable>,<y variable>)

    Поиск элемента (значения клетки) на карте вокруг исходной клетки <x>,<y> карты. Параметры карты должны быть предварительно заданы в операторе MapSet.
    <x> - горизонтальная координата исходной клетки карты, может быть <arithmetic expression>.
    <y> - вертикальная координата исходной клетки карты, может быть <arithmetic expression>.
    <id element> - значение элемента (клетки карты), которое необходимо найти, может быть <arithmetic expression>.
    <id condition> - условие поиска элемента (0 – равно значению элемента, 1 – не равно значению элемента, 2 – меньше значения элемента, 3 – больше или равно значению элемента), может быть <arithmetic expression>.
    <distance> - расстояние в клетках от исходной клетки карты, может быть <arithmetic expression>.
    <value variable> - имя переменной типа Byte, в которую запишется количество найденных элементов (если не найдены, то 0).
    <x variable> - имя переменной типа Byte, в которую запишется горизонтальная координата ближайшего найденного элемента (если не найдены, то 0).
    <y variable> - имя переменной типа Byte, в которую запишется вертикальная координата ближайшего найденного элемента (если не найдены, то 0).
    Т.е., поиск определенного значения клетки карты вокруг клетки с координатами x,y на расстоянии distance в прямоугольной области. Можно просто искать конкретное значение клетки, а можно все не равные этому значению, или все клетки с бОльшим значением, или все клетки с меньшим значением. Нужно указать имена переменных <value variable>, <x variable>, <y variable>, куда запишется найденное количество подходящих клеток, удовлетворяющих условию поиска, а также ближайшие к искомой клетке координаты клетки с подходящим значением.
    Например, найти вокруг клетки с координатами 12,16 в прямоугольной области 10х10 клеток значение клетки 8:
    MapSearch(12,16,8,0,10/2,value,x,y)
    После выполнения в value запишется количество найденных клеток со значением 8, а в x,y - ближайшая клетка со значением 8.

    - - - Добавлено - - -

    Цитата Сообщение от Reobne Посмотреть сообщение
    Я-бы посоветовал не перегружать ReadKey таким образом. ReadKey уже описана в мануалах и привычна. Она возвращает была ли нажата и возможно давно отжата клавиша. А нам нужно узнать давится-ли клавиша прямо сейчас. Если не понравилось моё GetKeyState, придумайте новое, может KeyDown?
    да, пока думаю. Оптимальное не найдено, но хочется что-то простое.
    Имеется буфер с заполненными нажатыми клавишами. Нужно проверить конкретную клавишу, есть ли она там. Всё.

  11. #170
    Activist Аватар для AzAtom
    Регистрация
    05.04.2015
    Адрес
    г. Майкоп
    Сообщений
    292
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    поиск определенного значения клетки карты вокруг клетки с координатами x,y на расстоянии distance в прямоугольной области.
    Ага, так понятнее.

    Насчёт звука вопрос. Если передать в SoundEffect(0,0,0); это же будет самый длинный звук, да? Сколько секунд длится самый длинный звук?

    Цитата Сообщение от Reobne Посмотреть сообщение
    И GetVirtualKeyCode:word вернёт код нажатой сейчас клавиши, в готовом формате для GetKeyState.
    Т.е., чтобы VirtualKeyCode код содержал и адрес порта? Ну что-то в этом есть, да, но это привязка к конкретному железу, виртуальные коды могут быть несовместимые или обязательно для всех спектрумов одинаковые?

    Цитата Сообщение от Reobne Посмотреть сообщение
    Если не понравилось моё GetKeyState, придумайте новое
    В принципе, я тоже похожее предложил, только использовать не виртуальный 2 байтовый код клавиши, а 1 байтный вроде скан-кода клавиши, где не учитываются регистры букв, всё равно столько клавиш нет, кодов хватит и на джойстики тоже.
    Читать не именно в текущий момент, а обработчик прерывания опрашивает клавиатуру и заполняет некий буфер. Функция KeyPressed(key:byte):boolean; ищет уже в этом массиве. Команда CPIR поможет. Правда, такая система занимает больше времени, но коды клавиш могут быть одинаковые для любой реализации клавиатуры и джойстиков.

    - - - Добавлено - - -

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Имеется буфер с заполненными нажатыми клавишами. Нужно проверить конкретную клавишу, есть ли она там. Всё.
    Тоже думаю, что так будет лучше. Надо только добавить коды джойстиков.

    - - - Добавлено - - -

    Andrew771, про MapSearch. Если найдено 2 удовлетворяющие условиям ячейки, например, слева и справа на расстоянии 1, координаты которой будут возвращены? А если справа и справа-сверху, то которые координаты будут возвращены?

Страница 17 из 54 ПерваяПервая ... 131415161718192021 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. PASCAL + MACRO11 (УКНЦ-ДВК).
    от hobot в разделе ДВК, УКНЦ
    Ответов: 341
    Последнее: 15.01.2022, 17:30
  2. Turbo Pascal для msx/msx2
    от Оззя в разделе MSX
    Ответов: 4
    Последнее: 23.02.2020, 23:59
  3. в розыске дисковая версия Pascal.
    от goblinish в разделе Программирование
    Ответов: 18
    Последнее: 16.08.2011, 16:30
  4. Pascal
    от Andrew771 в разделе Программирование
    Ответов: 22
    Последнее: 24.05.2011, 21:20
  5. Скопировать/вставить из/в HiSoft Pascal в эмуляторе
    от kit в разделе Программирование
    Ответов: 1
    Последнее: 05.02.2010, 15:35

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •