|
Promised Land
#01
31 декабря 2000 |
|
Програмерство - Basic Rulez! Создание карточный игры на Бейсике.

╔══════════════════════════════════╗
║ ║░░
║ ПРОГРАММЕРСТВО ║░░
║ ║░░
╚══════════════════════════════════╝░░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
BASIC RULES!
Сразу предупреждаю: вышенацарапанное не
следует принимать серьезно! И предназначе-
но это для тех, кто пока ассемблером не
владеет, но, тем не менее, желает писать
что-то для себя и для других, пусть даже
на Бейсике...
За годы общения со Спектрум-совместимыми
компьютерами я успел поработать в самых
разных направлениях, однако главным всегда
было создание игр. Как и все, я начинал с
Бейсика - ведь именно на нем так просто и
быстро можно реализовать очень многие за-
мыслы.
Поднабравшись опыта, я начал предъявлять
к своим программам серьезные требования по
части дизайна. Именно тогда и появился МЕ-
НЕДЖЕР. Но вскоре я понял, что на стан-
дартных Бейсиковских приемах далеко не
уехать.
Лет пять назад я увидел на IBM весьма
интересную версию STRIP-покера. Сначала
мне показалось, что это обычный стриппокер
вроде тех, что любой из вас видел на Спек-
труме не один раз. Но потом я понял, что
ошибся.
Основной принцип игры, в общем, тот же,
вот только против вас играют до ТРЕХ впол-
не симпатичных девчонок. И я понял, что не
имею права пройти мимо такой идеи.
Разработка игры пошла довольно медленно.
Основная проблема была не в самой програм-
ме, а в графике. По идее, экран разделялся
на 6 частей следующим образом:
╔════════════════╤════════════════╗
║== Девчонка ==│== Девчонка ==║
║== номер раз ==│== номер два ==║
╠════════════════╪════════════════╣
║ Мои │== Девчонка ==║
║ карты │== номер три ==║
╠════════════════╪════════════════╣
╟ Окно │Размер капитала ║
║ сообщений │каждой из сторон║
╚════════════════╧════════════════╝
Сейчас нас интересуют только окошки с
изображением девиц (в остальных информация
выводится в обычном текстовом виде).
Получить необходимые картинки не соста-
вило труда: берутся картинки из PEEP SHOW,
сжимаются вчетверо, дорисовывается одежда!
Но ведь их еще и на экран как-то надо вы-
водить...
Сначала я хотел подключить для этого ас-
семблер, но с моим тогдашним его знанием
из этой затеи ровным счетом ничерта не вы-
шло. И тут мне попадается книжица "Как на-
писать игру на Бейсике". Даже тогда для
меня в ней все было до примитивного просто
и понятно. Тем не менее, одну совершенно
неожиданную идейку я оттуда выкопал...
В главе, посвященной спрайтам, была из-
ложена техника создания НЕБОЛЬШИХ графиче-
ских изображений при помощи символьных на-
боров и такой себе системной переменной по
кличке CHARS. И тут меня как током удари-
ло: "Черт подери, почему же только неболь-
ших???"
Все оказалось не так и сложно: на каждую
из 6 девчонок получилось по три рисунка
размером 8х16, или 8х16х8=1024 байт, а это
лишь чуть-чуть больше полного символьного
набора... Единственное, что меня беспокои-
ло - быстродействие такой процедуры. Впро-
чем, мне было суждено убедиться, что мои
опасения оказались напрасными: даже на та-
ком тормозе, как "Оризон", шуршало очень
даже здорово!
Чтобы получить изображение, готовое для
вывода из BASICа, можно воспользоваться,
например, Art Studio: выделите окно (Defi-
ne Window), задействуйте опцию Font Editor
в меню Text, затем Misc - Capture Font.
Если, как в нашем случае, длина превысит
768 байт (т.е. 96 знакомест), придется вы-
полнить несколько заходов, а затем обьеди-
нить полученные файлы в один.
Загрузив такой файл по некоторому адресу
в памяти, вы теперь можете адресовать его
при помощи системной переменной CHARS, или
23606/23607.
Итак, в результате получилась одна из
тех игр, которыми я горжусь до сих пор. Но
оставалась еще маленькая деталь, которая
не давала мне покоя: картинки в игре до-
вольно откровенны, и внезапное появление
нежелательных персон вблизи поля боя (это,
конечно, в первую очередь Father & Mother)
заставляла жать RESET, как говорится, "на
самом интересном месте"!
Поразмыслив, я решил реализовать нечто
такое, что позволило бы В ЛЮБОЙ МОМЕНТ за-
вуалировать графику, а потом восстановить
ее - конечно, в соответствии с изменившим-
ся положением в игре). Само собой, это ни
в коей мере не должно мешать самой игре. И
выяснилось, что единственный способ реали-
зации такой возможности - второй режим
прерываний. И пусть начинающих юзеров и
программеров не пугает такое кошмарное на-
звание; на самом деле оно обозначает очень
простую и полезную вещь.
50 раз в секунду в компьютере происходит
прерывание, когда обычная работа системы
приостанавливается и выполняются некоторые
срочные действия: опрос клавиатуры, увели-
чение показаний системных часов и т.д.
Так вот, имеется несложный механизм, при
помощи которого к списку этих срочных дей-
ствий можно "приписать" еще парочку своих.
Для этого лишь нужно организовать прерыва-
ния второго рода.
Я не буду сейчас останавливаться на этой
технологии подробно; в конце-то концов,
есть масса книг, детально освещающих дан-
ный вопрос (например, трехтомник Инфоркома
по ассемблеру). Лично я пользовался одним
из первых номеров "ZX-Ревю" за 1994-й год.
Вкратце, наша задача сводится к следую-
щему: где-то в свободном участке памяти
надо разместить МАЛЮСЕНЬКУЮ программку на
ассемблере, которая будет работать парал-
лельно с основной программой, лишь изредка
вмешиваясь в ее работу. Вмешательство со-
стоит вот в чем:
1) проверяем, нажата ли специальная ком-
бинация клавиш, запускающая сокрытие экра-
на;
2) если нажата, тогда "прячем" экран.
3) если не нажата - выходим, ничего не
делая.
Именно такой механизм, с мелкими наворо-
тами, реализован в Bedtime Poker. Но это
решение, пожалуй, подойдет лишь для более-
менее опытных программистов. Посмотрим,
нельзя ли сделать чуть проще.
Преимущество машинно-кодовой резидентной
процедуры в том, что, будучи однажды за-
пущеной, она сможет быть вызвана АБСОЛЮТНО
из ЛЮБОГО места Basic-программы. В нашем
случае это действительно необходимо, но
часто можно избежать лишней головной боли.
Допустим, что в разных местах вашей про-
граммы идет опрос клавиш по принципу:
10 LET B$=INKEY$: IF B$="" THEN GO TO 10
Все, что нужно сделать - создать где-ни-
будь в программе (лучше ближе к началу)
общую подпрограмму и обращаться к ней че-
рез GO SUB всякий раз, когда понадобится
считать код клавиши.
Где-то в этой подпрограмме (вероятнее
всего, в конце) вставьте:
IF CODE INKEY$=7 THEN ... ,
далее следует список действий для очистки
экрана по нажатии клавиши Edit (Caps+1).
Теперь предположим, что вам надо скрыть
некий, достаточно небольшой участок экрана
таким образом, чтобы его можно было вос-
становить. Это делается при помощи манипу-
ляций с атрибутами.
Пусть участок окрашен PAPER=6, INK=0.
Надеюсь, вы в курсе, что информация о цве-
те хранится в дисплейном файле в адресах
22528..23295 (длина=768). Каждая ячейка
памяти в этой области отвечает за одно
знакоместо. Если его координаты обозначить
X=0..23 и Y=0..31, то адрес вычисляется:
A=22528+Y*32+X .
Значения самих чисел рассчитываются по
достаточно хитрой формуле:
B=INK+8*PAPER+64*BRIGHT+128*FLASH ;
результат функции ATTR выдается именно в
таком формате. Для случая PAPER 6 / INK 0,
получим B=6. А если изображение скрыто, то
получим PAPER 6 / INK 6 -> B=54; 54+6=60.
В идеальном случае, надо бы совместить
процедуры скрытия и восстановления в одну.
Просто, для каждого знакоместа участка вы-
полните следующую конструкцию:
Z=ATTR(X,Y): POKE 22528+Y*32+X, 60-Z ,
и все! В принципе, можно использовать и
PRINT OVER; но POKE работает быстрее и мо-
жет обрабатывать все 24 строки экрана.
На этом пока все! Творческих успехов вам!
Другие статьи номера:
Похожие статьи:
В этот день... 13 ноября