Игровая программа, таймер и генерация звука |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
Игровая программа, таймер и генерация звука |
Rocket |
9.03.2009 22:56
Сообщение
#1
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Доброго времени суток, уважаемые форумчане! Мне нужно написать программу, которая перед началом игры произвольно устанавливает невидимую на экране метку и видимый символ "*", который перемещается по экрану с помощью стрелок. При движении символа генерируются звуковые колебания, частота которых зависит от расстояния до невидимой метки. Если метка не найдена за 4 секунды, метка перемещается в другую точку.
Мне очень эта программа напоминает металлоискатель : ) Пока что я сделал только перемещение символа "*" с помощью букв w,s,a,d.
Не могу понять, почему "вверх" не срабатывает с первого раза? приходится повторно нажимать "w", в результате мы поднимаеся не на одну позицию, а на две... И как сделать какую-нибудь очистку экрана? чтоб очищать консоль и на экран выводился только один символ "*" . |
volvo |
9.03.2009 23:46
Сообщение
#2
|
Гость |
Цитата И как сделать какую-нибудь очистку экрана? чтоб очищать консоль и на экран выводился только один символ "*". Функция 06h прерывания 10h (прокрутка окна вверх) - задаешь окно, равное всему экрану, и число строк для сдвига = 0 - окно прокручивается полностью, и очищается...Цитата Не могу понять, почему "вверх" не срабатывает с первого раза? приходится повторно нажимать "w", в результате мы поднимаеся не на одну позицию, а на две... Твоя программа у меня только грузит процессор на 25% и больше ничего, ВООБЩЕ ни на что не реагирует, так что тебе еще повезло, что ты хоть КАК-ТО можешь двигать звездочку. |
Rocket |
10.03.2009 0:33
Сообщение
#3
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Функция 06h прерывания 10h (прокрутка окна вверх) - задаешь окно, равное всему экрану, и число строк для сдвига = 0 - окно прокручивается полностью, и очищается... Твоя программа у меня только грузит процессор на 25% и больше ничего, ВООБЩЕ ни на что не реагирует, так что тебе еще повезло, что ты хоть КАК-ТО можешь двигать звездочку. Так, вот добавил очистку экрана...и проблема с двойным "вверх" ушла сама собой) но мне не понятно почему она у Вас не работает... Вот что у меня сейчас:
Вроде никаких хитростей нет, почему не запускается не понятно. Просто сейчас начинается реально трудная вещь, которую я ума не приложу как делать, то есть генерация звука определённой частоты, которая зависит от расстояния до невидимой точки... как вообще эту точку произволно-то ставить? в ассеблере есть что-то вроде рандома? |
andriano |
10.03.2009 8:31
Сообщение
#4
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
1. Звук генерится посредством 53 таймера, причем его прохождение на динамик еще надо разрешить. Конкретных номеров портов навскидку не помню - давно не программировал под DOS.
2. х86 процессор не имеет аппаратных средств для генерации случайных чисел. Это ответ на твой вопрос - есть ли в ассемблере рандом. Но можно сделать программно генератор псевдослучайных чисел. Например, конгруэнтный. А инициализировать его (аналог randomize) чем-то, связанным с текущим временем. Хотя бы содержимым ячейки 0040:006c. |
TarasBer |
10.03.2009 14:50
Сообщение
#5
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
2. х86 процессор не имеет аппаратных средств для генерации случайных чисел. Это ответ на твой вопрос - есть ли в ассемблере рандом. Но можно сделать программно генератор псевдослучайных чисел. Например, конгруэнтный. А инициализировать его (аналог randomize) чем-то, связанным с текущим временем. Хотя бы содержимым ячейки 0040:006c. Я приведу дельфийскую реализацию рандома.
Это для 32х-разрядного проца. Смысл в том, что число RandSeed умножается на спец.константу $08088405, и увеличивается на 1. Так получается новое число RandSeed. А для того, чтобы из этого рандсида извлечь число, этот рандсид умножается на границу. И то, что вылезло за пределы 32 бит (оно автоматически пихается в регистр EDX) - и выдаётся как результат функции. Для 16-битного проца, думаю, можно сделать аналогично, надо только знать, куда команда MUL пихает результат, а куда - то, что вылезло за пределы. И какова спец.константа для 16-битного случая - я не знаю. -------------------- |
TarasBer |
10.03.2009 16:00
Сообщение
#6
|
Злостный любитель Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: 62 |
А турбо-паскальный рандом такой же. Я не нашёл менее порнушного способа перемножить два 32-битных числа на 16-битном асме, так что вот, процедура оформлена по-паскалевски, но оформите её по-асмовски сами.
RS - это RandSeed При сравнении со стандартным рандомом получилось только одно отклонение - для очень больших w стандартный рандом почему-то даёт на 1 больше, чем мой. Сообщение отредактировано: TarasBer - 10.03.2009 16:01 -------------------- |
volvo |
10.03.2009 20:06
Сообщение
#7
|
Гость |
По поводу генерации звуков - когда-то 7in на одном из форумов приводил вот такие процедуры:
Цитата(7in) ; Процедура Sound: генерация звука |
Rocket |
12.03.2009 21:32
Сообщение
#8
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
По поводу генерации звуков - когда-то 7in на одном из форумов приводил вот такие процедуры: У него же были и Randomize + Random, но поскольку кое-что тебе уже подсказали по поводу случайных чисел, то повторяться не буду... Использую эту процедуру в программе, динамик издаёт однократный треск. А как сделать именно дискретное "пиканье" через всё выполнение программы? и чтоб частота этого "пиканья" зависела от расстояния до невидимой точки...? |
andriano |
12.03.2009 21:52
Сообщение
#9
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
Использую эту процедуру в программе, динамик издаёт однократный треск. А как сделать именно дискретное "пиканье" через всё выполнение программы? и чтоб частота этого "пиканья" зависела от расстояния до невидимой точки...? Повесить на прерывание таймера (кажется 1с) управление режимом генерации звука. Основная программа вычисляет параметры (например, интервал между "бипами" в "тиках", т.е. в 1/18.2 сек), а вызываемая по таймеру процедура в нужные моменты включает и выключает динамик. |
Rocket |
14.05.2009 20:26
Сообщение
#10
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
После долго перерыва возвращаюсь к выполнению этого задания (с COM портами вроде разобрался )
Решил систематизировать эту задачку,т.к. довольно она для меня трудоёмкая, сложная и значимая. Так вот, что нужно: 1. Произвольно ставить невидимую точку; 2. Перемещать курсор (значок *); 3. Генерировать звук определённой частоты; 4. Каждые 4 сек менять положение невидимой точки. План минимум, да и вообще основной - это первые три пункта... 2-ой я реализовал- вроде как перемещаю. Начну с randoma. Уже была дана реализация:
Как задать интервал для случайных чисел, минимальное и максимальное значение? Что означает переменная RS (RandSeed) и w? |
volvo |
15.05.2009 0:33
Сообщение
#11
|
Гость |
Цитата Как задать интервал для случайных чисел Как обычно: функция генерации случайного числа от 0 до W у тебя есть, вот и напиши еще одну - для генерации числа в интервале A .. B: (Rnd(B - A + 1) + A) даст тебе число в интервале этом интервале. Цитата Что означает переменная RS (RandSeed) Это значение, которое используется для инициализации генератора псевдослучайных чисел. При инициализации одним и тем же числом, получишь одинаковые последовательности ПСЧ. |
Rocket |
15.05.2009 15:49
Сообщение
#12
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Как обычно: функция генерации случайного числа от 0 до W у тебя есть, вот и напиши еще одну - для генерации числа в интервале A .. B: (Rnd(B - A + 1) + A) даст тебе число в интервале этом интервале. Это значение, которое используется для инициализации генератора псевдослучайных чисел. При инициализации одним и тем же числом, получишь одинаковые последовательности ПСЧ. Оформил функцию под ассемблер:
Вывожу значения с помощью процедуры writeDec. Всё время выводится одно и тоже число: 4298, и оно явно не лежит в интервале от 0 до 80... С чем это связано? Как исправить? |
Rocket |
16.05.2009 0:13
Сообщение
#13
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
В интернете как-то мало материала по этой теме, так что необходимо разобраться в данной реализации random'а на ассемблере... Что не правильно в реализации Rand в предыдущем сообщении? Пожалуйста подскажите.
|
Rocket |
18.05.2009 20:29
Сообщение
#14
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Что-то вопрос о random'е намертво забуксовал... Перейду к другой части задачи: генерация звука определенной частоты. Вот программы, в которой я передвигаю курсор, а его движение сопровождается нотой до (я эту ноту могу часами держать(с) )
Как сделать "пиканье"? то есть, что бы звук включался и отключался в определенные моменты, а так же ускорялся, либо замедлялся |
volvo |
22.05.2009 12:16
Сообщение
#15
|
Гость |
Цитата Что-то вопрос о random'е намертво забуксовал... Ничего не забуксовало... Просто до ассемблера надо еще добраться... Вот тут есть пример работающего Random-а, только что проверил:Random Values (см. последнюю вставку кода, вызывать - так: start: ) |
volvo |
22.05.2009 14:44
Сообщение
#16
|
Гость |
Цитата Как сделать "пиканье"? то есть, что бы звук включался и отключался в определенные моменты Вероятно, в те моменты, когда звук не нужен, его надо отключать, используя NoSound, который ты написал, а зачем - непонятно...Цитата а так же ускорялся, либо замедлялся Кто "ускорялся" или "замедлялся"? Звук? Он не может замедляться и ускоряться. Он может только быть или нет. Может быть, тебе надо более высокие звуки при приближении к цели? Или просто уменьшить интервалы между выключением звука и его следующим включением... |
Rocket |
22.05.2009 15:36
Сообщение
#17
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Вероятно, в те моменты, когда звук не нужен, его надо отключать, используя NoSound, который ты написал, а зачем - непонятно... Кто "ускорялся" или "замедлялся"? Звук? Он не может замедляться и ускоряться. Он может только быть или нет. Может быть, тебе надо более высокие звуки при приближении к цели? Или просто уменьшить интервалы между выключением звука и его следующим включением... Да, мне нужно уменьшать или увеличивать интервалы между включением\отключением звука. Делать это нужно через программирование таймера? Ещё есть варианты? |
volvo |
22.05.2009 15:58
Сообщение
#18
|
Гость |
Цитата Ещё есть варианты? Сомневаюсь... Какие ж варианты еще? А что не нравится с программированием таймера? |
Rocket |
22.05.2009 16:06
Сообщение
#19
|
Знаток Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
|
volvo |
22.05.2009 16:23
Сообщение
#20
|
Гость |
Очень просто... Вот тут есть пример практически того, что тебе надо:
Accelerating the Clock |
Текстовая версия | 10.11.2024 9:11 |