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 строки экрана. На этом пока все! Творческих успехов вам!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября