Робота з графікою в SDL: Урок №5: Clickomania |
- Statistics
- Participants
- Translate into Ukrainian
- Translation result
- Translated in draft, editing and proof-reading required.
GFX з SDL: Урок №5: Clickomania
Привіт всім! У цьому туторіалі ми створимо просту гру в SDL під назвою Clickomania. Clickomania - це дійсно дуже проста у написанні гра. Наша версія гри буде складатися із сітки розміром 10х14 із кульок. При натисканні (мишею) на кульку, що з'єднана із двома або більше іншими кульками, всі з'єднані кульки того ж кольору, на який натиснули, зникають. А ті, що знаходились вище, просто падають вниз. Якщо вдається очистити одразу рядок кульок, тоді решта рядків зсуваються справа наліво.
Наступні 4 ілюстрації зображують базові аспекти гри:
Після натискання однієї з пурпуровових кульок в жовтій області, всі вони зникають і кульки, які були над ними падають вниз.
Коли ми позбуваємось кульок в жовтій області, інші будуть рухаються справа наліво. Зверніть увагу на те, що справа наліво рухаються ряди кульок, а не окремі кульки. Тепер давайте перейдемо до написання гри.
Спочатку ми оголошуємо директиви #include та деякі константи #define
#include <stdio.h> //стандартна біблиіотека вводу/виводу
#include <stdlib.h>
#include <stdarg.h>
#include <string.h> // бібліотека для роботи з рядками.
#include <time.h> // бібліотека, яка відповідає за час та рандомні функції.
#include <SDL/SDL.h> // бібліотека, яка використовується для роботи с SDL
Оскільки ми будемо також використовувати SDL шрифти (4 урок), ми повинні включити font.h
#include "font.h"
Тепер оголошення деяких змінних. Перші дві містять розміри ігрового поля. Вони будуть встановлені в деяких значенях пізніше.
int rows; // рядки
int cols; // стовпці
картина повинна бути очевидною. Кулі містять зображення з 10 можливих типів кульок. font1 і font2 не повинно бути занадто багато, щоб зрозуміти краще.
SDL_Surface *screen; // Повернення екрану
SDL_Surface *balls[10];// Зображення кульок
SDLFont *font1; // ініціалізація шрифтів
SDLFont *font2;
в функція playf міститься сітка з всіх кульок. Ми ініціалізуємо її пізніше.
char *playf; // Ігрове поле
scrwidth та scrheight містить висоту та ширину поля за замовчуванням.Пізніше ми розберемо аргументи командного рядка , якщо користувач схоче запустити цю програму з іншим розширенням екрану. Залежно від розширення екрану, сітка кульок може і не може повністю покрити екран зображувані на екрані координат О, О. centx і centy дають нам знати, де треба починати малювати масив кульок. Це буде розраховано пізніше.
// ширина і висота екрану за замовчуванням
int scrwidth=640, scrheight=480;
// використовується для задання центру сітки на екрані
int centx=0,centy=0;
Наступна змінна, bls, показує, скільки різних кольорів кульок на екрані. bla використовується для миші. Точніше ця змінна використовується для перевірки натиснення кнопки миші. Результат повинен бути очевидним.
int bls=4; // кількість різних кольорів кульок
int bla=0; // використовується для роботи з мишею...
int score=0; // поточний результат (кількість очків)
На даний момент функція DrawIMG повинна бути порожня.
// ця функція малює (виводить) поверхню на екран
void DrawIMG(SDL_Surface *img, int x, int y)
{
SDL_Rect dest;
dest.x = x;
dest.y = y;
SDL_BlitSurface(img, NULL, screen, &dest);
}
Тепер функція міняє посилання між двома змінними типу char (ігрове поле є масивом типу char, btw). Потім вони просто міняються між собою.
// тут міняються значеннями 2 змінні типу char
void swap(char &r1, char &r2)
{
char temp=r1;
r1=r2;
r2=temp;
}
Функція grid отримує координати ігрового поля як параметри і повертає значення (колір кульки), яке є конкретною координатою. Вона використовується майже повсюдно в інших частинах програми. Функція повертає значення посилання на змінну типу char (замість звичайної змінної char, як ми зазвичай робимо) по координатам, щоб ми могли працювати з ними (міняти їх місцями, присвоювати їм значення, і т.д.) за межами цієї функції.
// отримання кольору кульки на ігрове поле
inline char &grid(int a, int b)
{
return playf[a*cols+b];
}
Наступна функція, collapse, дозволяє кулькам падати якщо під ними є вільне місце і пересуватися вліво якщо є куди. Вона викликається відразу після видалення згустку кульок в сітці.
// ця функція дозволяє кулькам впасти і рухатися вліво якщо є куди рухатись
void collapse()
{
Спочатку ми перевіримо, чи зможуть деякі кульки впасти до низу. Для цього ми проходимо через всі стовпці в сітці. У кожному стовпці цикл по всіх рядках. Якщо ви знайшли кульку зі значенням -1, то пам'ятайте, що це ряд, і потрібно перемістити його на нижній ряд. Після того як ми перемістили одну кульку донизу, ми зменшуємо розмір максимального значення стовпця, з тим щоб наступну кульку ми змогли рухати за попередньою кулькою. Після цього всі кульки будуть падати.
// зробимо щоб кульки падали вниз
int to=-1;
for(int j=0;j<cols;j++)
{
to=-1;
for(int i=rows-1;i>=0;i--)
{
if(to==-1 && grid(i,j)==-1) {to=i;}
else if(to!=-1 && grid(i,j)!=-1)
{swap(grid(i,j),grid(to,j)); to--;}
}
}
Тепер потрібно перемістити кульку справа наліво. Для цього проходимо у циклі по всіх стовпцях. Якщо в одному із цих стовпців нижня комірка в рядку буде порожньою (-1), це означає, що весь стовпець пустий. А раз він пустий, отже, запам'ятовуємо позицію зсуваємо всі інші стовпці на нього.
// зсунути стовпці вліво
to=-1;
{
for(int j=0;j<cols;j++)
{
if(to==-1 && grid(rows-1,j)==-1)
{
to=j;
} else if(to!=-1 && grid(rows-1,j)!=-1) {
for(int i=0;i<rows;i++)
{
grid(i,to) = grid(i,j);
}
to++;
}
}
Коли все це зроблено, очищаємо стовпці, що залишились.
{
if(to!=-1)
if(to!=-1)
for(int j=to;j<cols;j++)
{
for(int i=0;i<rows;i++)
{
grid(i,j)=-1;
}
}
Original (Ukrainian): GFX with SDL: Lesson 5: Clickomania
Translation: © eReS, ALEXfanata, rom-broiler, BlaXpirit, wertomaniak, igorko .
