Andrew771, прокрутка окон осуществляется только на видимом экране?
Выяснилось, что с ReadKey(key1, key2); работать неудобно, потому, что искомый код может оказаться в key1 или key2 и нужно их оба проверять. Если их будет 10, то совсем можно будет зашиться. Нужно что-то другое придумать.
Не реализовал функции ArrayClear - ищу способ, Asm - команды другие, так просто не получится её реализовать, MapSearch - толком не понял, что она ищет.
Остальное, вроде, готово. Пересмотрю код, использование флагов и завтра, наверное, уже смогу показать.
Граф Дракула наш кумир, патамушта он вомпир!
VKINK 9 : BORDER NOT PI
Не нужно обе проверять, если только одна клавиша, а только первую переменную key1, т.к. асмовская процедура заполняет всегда сначала key1, если хотя бы одна клавиша нажата.
С 10-ю да, нужно подумать. Может, сортировать коды по возрастанию в буфере клавиш... Но это замедлит чтение.
Вернуться к конструкции if KeyPressed then ReadKey? Т.е. KeyPressed определяет, нажато ли хоть одно что-нибудь, а ReadKey уже медленная процедура для 10 клавиш.
- - - Добавлено - - -
Это просто обнуление числового массива или заполнение пустыми строками строкового массива. На асме я сделал через команду ldir, чтобы юзер не писал свою медленно работающую пошлость for i:=1 to i_max do a[i]:=0;
В ней куча опций. Ищет заданное значение клетки или диапазон значений клеток в области клеток карты (карта - двумерный массив типа byte).
А если 2? Например, мы можем идти и начать стрелять, тогда в key1 код "вправо", а в key2 код "огонь", а можем просто стрелять, тогда в key1 уже код "огонь". Можем пойти стреляя, тогда в key1 код "огонь", а в key2 код "вправо". Можем перестать стрелять и код "вправо" переместиться в key1. В общем, пока не однозначно.
Это понятно, но в дельфи в процедуру не передаются двумерные массивы напрямую. Это можно обойти, конечно, но тогда будет написано по другому, например я сделал тестовую программу, где пришлось написать MapSet(map[0,0],mapspr,0,0,32,24); вместо MapSet(map,mapspr,0,0,32,24);
- Далее, в дельфи объявленные переменные не обязательно идут друг за другом, поэтому, все спрайты карты пришлось объединить в один большой массив.
- Вдруг выяснилось, что если захочется попробовать спрайты с атрибутами и без них, то придётся править все спрайты, что неудобно. Почему бы не сделать все спрайты с атрибутами, а при сброшенном флаге "спрайты с атрибутами" просто не копировать атрибуты. Да, это будет на 10% больше места занимать, но будет гораздо удобнее.
- Ещё задумал написать генератор спрайтов. Можно будет загрузить в него 1 битную картинку, а она выдаст её в текстовом виде для вставки в исходник программы. Или такой уже есть?
- - - Добавлено - - -
Сейчас у меня вот, что получилось TestZXPas02.rar.
- - - Добавлено - - -
Кнопки 1 и 2 показывают цифры 1 и 2, кнопки 0 и пробел - выход из программы.
Сделайте уже метод ReadKey как в Паскале, чтобы возвращал только одну кнопку, и function CheckKeys(Keys: string): Word, в которой в Keys передаются проверяемые кнопки в виде строки символов (например, "MQAOP"), а в результате установлены биты нажатых кнопок (например, для вверх-вправо-огонь - %11001). Тогда управление в игре можно будет хранить в строках (хоть у пользователя запрашивай, хоть константами забивай, особенно, если для джойстика придумать символы тоже) и проверять единообразно-безобразно.
ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.
А почему нельзя просто допрашивать кнопки в матрице. Всякие ReadKey нужны для определения факта нажатия но не удержания
- - - Добавлено - - -
IsKeyPressed нужна функция
Есть пара идей на счёт ReadKey, не знаю какая лучше/удобнее.
- В ReadKey передаётся массив из 3-5 элементов (нужно решить и принять соглашение о количестве), оттуда возвращается с заполненными кодами нажатых клавиш. Программа просматривает массив на предмет нужных кодов. Например, проверка нажатия вправо ищет в массиве код соответствующей клавиши и возвращает 1 или 0 по результатам поиска, и т.д. Если надо набирать текст, то можно просматривать массив в поисках первого ненулевого значения и его принимать за нажатую клавишу.
- Ввести функцию SetKeyBuffer, которой передаётся массив из 3-5 элементов (нужно решить и принять соглашение о количестве), его адрес запоминается и обработчик клавиатуры автоматически заносит туда коды. Программе не нужно вызывать ReadKey, просто обрабатывает массив как в предыдущем случае.
- Наиболее близко к классическому паскалю, где-то есть буфер клавиатуры, он заполняется обработчиком клавиатуры по нажатию и отжатию клавиш. Функция ReadKey возвращает код нажатой и отжатой клавиши из этого буфера, можно в 2 разных переменных, в одной код клавиши, в другой флаг отжатия. Тогда программе нужно будет в цикле вызывать ReadKey до тех пор, пока key <>0 и соответственно обрабатывать полученные коды.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)