O’zimiz o’yin yaratamiz: Mini gonka (hamma tanidigigan)

O’zimiz o’yin yaratamiz: Mini gonka (hamma tanidigigan)

Salom. Hozirgi kunda o’yinlar juda ko’p, lekin boshlovchi dasturchilar uchun ushbu maqola ast qotishi mumkin. Biz ushbu maqolada OpenGL va SDL kutubxonasidan foydalanamiz. Chunki bu kutubxona opensource bo’lib Android, iOs, Linux, Windows, MacOS platformalarida ishlay oladi.

SDL haqida shu yerdan o’qishingiz mumkin: www.libsdl.org/

Man bu o’yinni tuzguncha Visual Studio 2010 dan foydalandim. Dasturlash tili C/C++.

Ishni boshlashdan oldin www.libsdl.org/download-2.0.php ssilkadan Development Libraries :: SDL2-devel-2.0.1-VC.zip ni ko’chirib olamiz. Bu SDL kutubxonasi bo’lib dasturlash uchun zarur bo’lgan fayllar mavjud.

Endi VS2010 ni ishga tushirib, CTRL+SHIFT+N ni bosib Visual C++ bo’limidan Win32 ga tegishli Win32 Console Application ni tanlaymiz. Proyekt nomini Gonka deb OK ni bosamiz. Keyin Next ni bosib, «Empty project» ni tanlab FINISH ni bosamiz. Keyin shu proyektni ichiga main.cpp fayl yaratamiz.

Endi c:devlibssdl (bu manda siz boshqa joyda qilsangiz ham bo’ladi) ichiga SDL2-devel-2.0.1-VC.zip ni ochib tashlimiz, shunda c:devlibssdl ning ichida include, lib papkalari paydo bo’lishi lozim.

VS ga o’tib, ALT+F7 (Project => Properties) ga kiramiz va quyidagi sozlashlarni amalga oshiramiz:

1. Configuration Properties -> C/C++ -> General -> Additional include directories = c:devlibssdlinclude

903dde

2. Configuration Properties -> Linker -> General -> Additional library directories = c:devlibssdllibx86

318813

3. Configuration Properties -> Linker -> Input -> Additional Dependencies = opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)

dcdce9

4. Va oxirgisi: Configuration Properties -> Debugging -> Environment = PATH=%PATH%;c:devlibssdllibx86 bu SDL.DLL faylini bizni dastur qo’llash olishi uchun kerak. Agar siz oxirig EXE faylni bitta joyga ko’chirmoqchi bo’lsangiz SDL.DLL ni ham qo’shib ko’chiring. Aks holda SDL.DLL topilmadi degan xato beradi.

Agar sozlashlarni qilib bo’lgan bo’lsangiz main.cpp faylga quyidagini yozing va F5 ni bosing. Agar qizil oyna chiqsa demak hammasi OK, ishlashda davom etamiz.

#include 
#include 

//GL ni yuklash
#include "windows.h"
#include 

//SDL ni yuklash
#include 
#define PROGRAM_NAME "Mini gonka"

/* Xatolikni chiqaradigan funksiya */
void sdldie(const char *msg)
{
    printf("%s: %sn", msg, SDL_GetError());
    SDL_Quit();
    exit(1);
}
 
int main(int argc, char *argv[])
{
    SDL_Window *mainwindow; /* Oynda o'zgaruvchisi */
    SDL_GLContext maincontext; /* OpenGL konteksi o'zgaruvchisi */
 
    if (SDL_Init(SDL_INIT_VIDEO) 

Biz hozir o'yin tuzish bilan ovoramiz, keling SDL_GL_DOUBLEBUFFER, SDL_GL_DEPTH_SIZE, glClearColor, GL_COLOR_BUFFER_BIT,… kabi terminlar haqida yana bitta maqola yozaman. Umuman OpenGL qanday ishlaydi mavzusida. Hozircha umumiy qilib tushintirib ketaman. Ya'ni hamma qismini bitta bitta funksiya qilaman va funksiyani nima ish qilishini tushuntiraman.

Bizning gonkamiz quyidagi ko'rinishda bo'ladi:

c9f179

Ha bu o'sha gonka, ko'pchlikni esidan ham chiqqan bo'lsa kerak. Bu NSF Most Wanted masu boshlovchi dasturchilar uchun undanda azizroq gonka bo'ladi.

Keling endi o'zimizga oddiy maqsad qo'ysak. Bu o'yinni yasash uchun bizga asosiy narsa bu to'rt burcha chizishdir.

Bizning 4 burcha chizadigan funksiyamiz

void draw4burchak(int x, int y, int color)
{
	glBegin(GL_QUADS);

	if (color == 0)
		glColor3ub(0, 0, 0); //qora rang
	else
		glColor3ub(52, 111, 255); // ko'k rang

	glVertex2i(x, y);
	glVertex2i(x + 1, y);
	glVertex2i(x + 1, y + 1);
	glVertex2i(x, y + 1);
	glEnd();
}

ko'rinishida bo'ladi. x, y qaysi nuqtaligi ([0, 0] — chap yuqori nuqta, color = 0 — bu qora, aks holda ko'k rang)

Endiki masala mashinani chizishdir.

void drawcar(int x, int y, int color)
{
	draw4burchak(x + 1, y, color);

	draw4burchak(x, y + 1, color);
	draw4burchak(x + 2, y + 1, color);

	draw4burchak(x + 1, y + 2, color);

	draw4burchak(x, y + 3, color);
	draw4burchak(x + 2, y + 3, color);
}

Atrofidagi yo'llarni chizish

void drawyul(int pos)
{
	pos = pos % 3;
	for(int i = 0; i 

pos — yo'l harakatini hosil qilish uchun kerak.

Endi o'yinni yuragini yaratamiz ya'ni GAME LOOP ni, buning uchun main loop ni sal o'zgartiramiz. Qolgani o'ynni logikasi.

O'yin kodi:

#include 
#include 
#include 

//GL ni yuklash
#include "windows.h"
#include 

//SDL ni yuklash
#include 
#define PROGRAM_NAME "Mini gonka"

/* Xatolikni chiqaradigan funksiya */
void sdldie(const char *msg)
{
    printf("%s: %sn", msg, SDL_GetError());
    SDL_Quit();
    exit(1);
}

void draw4burchak(int x, int y, int color)
{
	glBegin(GL_QUADS);

	if (color == 0)
		glColor3ub(0, 0, 0); //qora rang
	else
		glColor3ub(52, 111, 255); // ko'k rang

	glVertex2i(x, y);
	glVertex2i(x + 1, y);
	glVertex2i(x + 1, y + 1);
	glVertex2i(x, y + 1);
	glEnd();
}

void drawcar(int x, int y, int color)
{
	draw4burchak(x + 1, y, color);

	draw4burchak(x, y + 1, color);
	draw4burchak(x + 2, y + 1, color);

	draw4burchak(x + 1, y + 2, color);

	draw4burchak(x, y + 3, color);
	draw4burchak(x + 2, y + 3, color);
}

void drawyul(int pos)
{
	pos = pos % 3;
	for(int i = -1; i = game_time_interval)
	{
		//o'yinni vaqtini oshiirhs
		game_time++;

		//2 ta mashina harakatini hosil qilish
		car2_position_y++;
		car1_position_y++;

		//ekranga ko'rinmiy qolsa, tepaga olib chiqish
		if (car1_position_y >= 15)
		{
			car1_position_y = -5;
			counter++;
		}

		if (car2_position_y >= 15)
		{
			car2_position_y = -5;
			counter++;
		}

		//oxirgi vaqtni saqlash
		last_time = cur_time;
	}

	//o'yinni vaqtini 0 ga tushirish
	if (game_time >= 100)
		game_time = 0;


	//mashina o'rilganligini tekshirish
	if (car1_position == car_position)
	{
		if (car1_position_y >= 9 &&  car1_position_y = 9 &&  car2_position_y 

Umuman olganda bu o'yinni OpenGL va SDL ni ishlatmasdan ham oddiyroq yo'lda tuzsa bo'lardi. Lekin asosiy maqsad OpenGL va SDL dan foydalanishni o'rgatish edi.

Nasib qilsa keyingi maqolalarimda shu o'yinni DEBUG ya'ni ketma-ket analiz qilamiz.

O'yinni ko'chirish

Texnologiyalar
O'zimiz o'yin yaratamiz: Mini gonka (hamma tanidigigan)