Давайте зробимо рогалик

Створення рогалики припускає деяке планування, але є одна річ, яку ми можемо зробити на самому початку: створити титульний екран. Це дозволить нам почати проект, що іноді, буває дуже важко. Легко зупинитися на кроці «З чого ж мені почати?», Але кодування екрану заставки дозволить зрушити з мертвої точки. Робиться це просто, дозволить створити нам кілька файлів для майбутнього проекту, а також, налаштує наше мислення на подальше програмування.
Для екрану заставки, нам необхідний, очевидно, заголовок. Так як ми створюємо класичний рогалик, то дії буде відбуватися в підземеллі. Підземелля. чого? Нам потрібно, щоб назва звучала небезпечно і зловісно. Нехай буде Підземелля Долі (Dungeon of DooM)! Звучить досить добре. Це і буде нашим назвою.
Перше, що ми повинні вирішити - який тип вікна ми будемо використовувати. Ми могли б використовувати звичайне консольне вікно, але тоді б довелося обмежитися лише 16-ма кольорами. Ніякого підстави для цього немає. Для цієї гра ми будемо використовувати графічний екран в 32-х біт, що дозволить користуватися повноцінним RGB палітрою. Для наших цілей на вистачить дозволу екрану 640x480, а використання 32-х бітної палітри дасть нам більше гнучкості для відображення даних. При дозволі 640x480 ми можемо встановити текстовий режим до 80 стовпців на 60 рядків, які дадуть нам чимало місця, і використовуючи шрифт 8x8 ми отримаємо компактний, але добре Новомосковскемий дисплей.
Після того, як ми закінчили створювати зображення, нам потрібно перетворити його в масив квітів.
- Завантажимо зображення в графічному режимі.
- Переберемо всі крапки зображення і збережемо значення кольору в масив цілих без знакових чисел. Я просто використовував функцію Point, тому що швидкість тут не важлива і це найпростіший спосіб.
- Зберігаємо отриманий масив в файл.
В результаті ми повинні отримати файл приблизно наступного содердімого:
Як ви бачите, коди кольорів записані в шістнадцятковому вигляді. Це зроблено для економії місця в файлі.
Для відображення нам буде потрібно написати підпрограму, яка в текстовому режимі буде малювати на екрані квадратні блоки використовуючи кольору задані в цьому файлі.
Двома циклами FOR-NEXT ми перебираємо масив квітів і за допомогою команди Draw String малюємо ASCII символ 219 заданий константою acBlock. Draw String використовує піксельні екранні координати x і y, тому ми може виводити текст в будь-якому місці екрану, а не тільки в певних рядках і шпальтах. Але в даному випадку ми хочемо використовувати саме рядки і стовпці, тому ми зміщуємо координати на ширину і висоту шрифту, заданого константами charw і charh.
На перший погляд код Dim clr As UInteger = title (x + y * titlew) виглядає дещо дивно, але якщо ви подивіться файл title.bi, то можна побачити, що кольори картинки у нас збережені в одновимірному масиві. Для того, щоб перетворити двовимірні координати до одновимірним, ми використовуємо формулу title (x + y * titlew), де x і y - масив індексів, а titlew - ширина текстового екрану. Очевидно, щоб це працювало, необхідно, щоб даний масив був заповнений так само. Наприклад ви можете використовувати наступний код для заповнення масиву:
Цю ж формулу ви можете використовувати для заповнення масиву більшого дозволу, використовуючи додаткові індекси.
Завершує підпрограму функція розблокування екрану ScreenUnlock, для того щоб оновити дисплей. Потім ми чекаємо, поки користувач натисне якусь клавішу, команда Sleep. Останнім шматок коду: Do: Sleep 1: Loop While InKey <> "" Ми очищаємо буфер клавіатури, тому що У ній зараз збережена, як мінімум, та клавіша, яку натиснув користувач для виходу з команди Sleep, яка буфер не очищається. Ми не хочемо підібрати весь цей мотлох клавіш коли будемо обробляти натискання клавіш в меню, тому, буфер клавіатури необхідно очистити.
Хоча наша програма всього лише відображає титульну заставку, в нашому проекті вже є кілька:
- dod.bas. Головний файл проекту.
- defs.bi. Містить список констант.
- title.bi. Містить масив зі значеннями кольорів для заставки.
Поки в файлі визначень у нас тільки кілька констант, необхідних для відображення заставки. Зверніть увагу, ми використовуємо як директиви #Define, так і тип Const. #Define використовується для числових констант і макросоа, а Const для розрахункових значень. Ми не хочемо кожен раз, коли використовуємо fbYellow в програмі, обчислювати для нього RGB значення кольору. Чому ми не використовуємо Const всюди? Тому що використання значення з Const програма повинна звернутися до таблиці символьних імен, щоб знайти значення цієї константи. Коли ж ми використовуємо #Define, то компілятор сам замінює все зустрічаються в програма charw на 8, як ніби ми самі написали там число і програмі не потрібно звертатися до таблиці імен. Однак, якби ми й справді в коді програми всюди вказували конкретне число, а потім, для налагодження наприклад, нам знадобилося б його змінити, то нічого хорошого б з цього не вийшло, тому що дуже важко було б згадати все місця в програмі, де ми вказували 8 для завдання ширини символів. Тому, краще, щоб цю роботу замість нас зробив компілятор.
Всі вихідні коди програми (в тому вигляді, в якому вона існує на даний момент), ви можете знайти в директорії chap01.
Зараз саме час призначити нашому додатком іконку. Додамо до нашого проекту ще 2 файли. Це dod.ico, який знаходиться в директорії images і dod.rc, який повідомляє компілятору FB, де можна взяти іконку для додатка.
Для компіляції, з директорії з проектом, наберіть в командному рядку:
Зверніть увагу, що ми компілюємо програму використовуючи ключ -exx компілятора. Це вкаже компілятору що потрібно повідомляти нам про всі знайдені помилки, наприклад: вихід за рамки масиву або використання невірного покажчика. Ми завжди будемо використовувати -exx під час розробки. Це допоможе нам знайти хоча б деякі помилки. Також, при використанні цього ключа, буде створюватися окреме консольне вікно, за допомогою якого ми зможемо закрити програму, якщо вона, по якійсь причині, «зависла».
Коли наша програма буде готова до поширення, ми будемо компілювати її без вікна консолі і розширеної перевіркою на помилки, тому що це уповільнює виконання.
Ми можемо зробити це в такий спосіб:
Ключ -s gui вказує компілятору, що ми хочемо скомпілювати програму в графічному режимі, без консолі.
Ми закінчили наш початковий план - розпочати наш проект. Ми повинні пройти довгий шлях, але, по крайней мере, у нас є працюючий код і щось більше, ніж просто гарна ідея.