Робота з графікою в SDL: Урок №5: Clickomania

Marius Andra, “GFX with SDL: Lesson 5: Clickomania”, public translation into Ukrainian from Ukrainian More about this translation.

Translate into another language.

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;

}

}

Pages: ← previous Ctrl next
1 2 3 4

Original (Ukrainian): GFX with SDL: Lesson 5: Clickomania

Translation: © eReS, ALEXfanata, rom-broiler, BlaXpirit, wertomaniak, igorko .

translated.by crowd

Like this translation? Share it or bookmark!