Игра-платформер 2d на примере марио



Пример текста

 

Змейка

Пример текста

 

Арканоид

Пример текста

Волейбол

Пример текста

 

Тетрис

Пример текста

Doodle jump

Пример текста

Сапёр

Пример текста

Xonix

Пример текста

 

Простейшие гонки

Пример текста

Шахматы

Пример текста

 

Установка OpenGL

OpenGL- это Open Graphic Library или открытая графическая библиотека. В отличие от SFML, это более низкоуровневая и универсальная библиотека графики. Но при этом она более сложная в освоении, на ней нужно писать больше кода. Также она работает с 3d объектами, а SFML поддерживает только 2d, т.е. плоские вещи. Многие современные игры используют OpenGL. Поэтому мы обязательно рассмотрим эту вещь ниже в нескольких главах, начиная с текущей.

Для того чтобы в devcpp использовать OpenGL, не нужно каких-то специальных ухищрений. Заходим создать проект, выбираем вкладку Multimedia и там выбираем тип проекта OpenGL. Всё. Создастся файл со следующим содержанием (это тестовый код)

/**************************

 * Includes

 *

 **************************/

#include <windows.h>

#include <gl/gl.h>

 

/**************************

 * Function Declarations

 *

 **************************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,

WPARAM wParam, LPARAM lParam);

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);

 

/**************************

 * WinMain

 *

 **************************/

int WINAPI WinMain (HINSTANCE hInstance,

               HINSTANCE hPrevInstance,

               LPSTR lpCmdLine,

               int iCmdShow)

{

WNDCLASS wc;

HWND hWnd;

HDC hDC;

HGLRC hRC;       

MSG msg;

BOOL bQuit = FALSE;

float theta = 0.0f;

 

/* register window class */

wc.style = CS_OWNDC;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor (NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);

wc.lpszMenuName = NULL;

wc.lpszClassName = "GLSample";

RegisterClass (&wc);

 

/* create main window */

hWnd = CreateWindow (

"GLSample", "OpenGL Sample",

WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0, 0, 256, 256,

NULL, NULL, hInstance, NULL);

 

/* enable OpenGL for the window */

EnableOpenGL (hWnd, &hDC, &hRC);

 

/* program main loop */

while (!bQuit)

{

   /* check for messages */

   if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))

   {

       /* handle or dispatch messages */

       if (msg.message == WM_QUIT)

       {

           bQuit = TRUE;

       }

       else

       {

           TranslateMessage (&msg);

           DispatchMessage (&msg);

       }

   }

   else

   {

       /* OpenGL animation code goes here */

 

       glClearColor (0.0f, 0.0f, 0.0f, 0.0f);

       glClear (GL_COLOR_BUFFER_BIT);

 

       glPushMatrix ();

       glRotatef (theta, 0.0f, 0.0f, 1.0f);

       glBegin (GL_TRIANGLES);

       glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f);

       glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.87f, -0.5f);

       glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f);

       glEnd ();

       glPopMatrix ();

 

       SwapBuffers (hDC);

 

       theta += 1.0f;

       Sleep (1);

   }

}

 

/* shutdown OpenGL */

DisableOpenGL (hWnd, hDC, hRC);

 

/* destroy the window explicitly */

DestroyWindow (hWnd);

 

return msg.wParam;

}

/********************

 * Window Procedure

 *

 ********************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,

                     WPARAM wParam, LPARAM lParam)

{

 

switch (message)

{

case WM_CREATE:

   return 0;

case WM_CLOSE:

   PostQuitMessage (0);

   return 0;

 

case WM_DESTROY:

   return 0;

 

case WM_KEYDOWN:

   switch (wParam)

   {

   case VK_ESCAPE:

       PostQuitMessage(0);

       return 0;

   }

   return 0;

 

default:

   return DefWindowProc (hWnd, message, wParam, lParam);

}

}

/*******************

 * Enable OpenGL

 *

 *******************/

 

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)

{

PIXELFORMATDESCRIPTOR pfd;

int iFormat;

 

/* get the device context (DC) */

*hDC = GetDC (hWnd);

 

/* set the pixel format for the DC */

ZeroMemory (&pfd, sizeof (pfd));

pfd.nSize = sizeof (pfd);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DRAW_TO_WINDOW |

PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24;

pfd.cDepthBits = 16;

pfd.iLayerType = PFD_MAIN_PLANE;

iFormat = ChoosePixelFormat (*hDC, &pfd);

SetPixelFormat (*hDC, iFormat, &pfd);

 

/* create and enable the render context (RC) */

*hRC = wglCreateContext( *hDC );

wglMakeCurrent( *hDC, *hRC );

 

}

/******************

 * Disable OpenGL

 *

 ******************/

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)

{

wglMakeCurrent (NULL, NULL);

wglDeleteContext (hRC);

ReleaseDC (hWnd, hDC);

}

Скомпилировав этот код, получим треугольник с цветными краями, который вращается. Пугаться всего этого кода не нужно- в следующих уроках мы по шагам разберём как писать простые фигуры.

Рисование в OpenGL

Пример текста

Моделирование физических процессов

Пример текста

Трёхмерные графики

Пример текста

Простейшая 3d игра типа майнкрафт

Пример текста

Немного о DirectX

Пример текста

________________________________________________

РАЗДЕЛ 5

ПРИЛОЖЕНИЯ С ИНТЕРФЕЙСОМ ДЛЯ WINDOWS

Создание проекта с WINAPI

В devcpp это делается так- создать новый проект, только вместо консольного приложения нужно выбрать Windows Application. Остальное всё как обычно. Создастся главный файл и уже готовый основной код:

#include <windows.h>

/* This is where all the input to the window goes to */

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {

           switch(Message) {          

                           /* Upon destruction, tell the main thread to stop */

                           case WM_DESTROY: {

                                           PostQuitMessage(0);

                                           break;

                           }             

                           /* All other messages (a lot of them) are processed using default procedures */

                           default:

                                           return DefWindowProc(hwnd, Message, wParam, lParam);

           }

           return 0;

}

/* The 'main' function of Win32 GUI programs: this is where execution starts */

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

           WNDCLASSEX wc; /* A properties struct of our window */

           HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */

           MSG msg; /* A temporary location for all messages */

 

           /* zero out the struct and set the stuff we want to modify */

           memset(&wc,0,sizeof(wc));

           wc.cbSize                       = sizeof(WNDCLASSEX);

           wc.lpfnWndProc         = WndProc; /* This is where we will send messages to */

           wc.hInstance = hInstance;

           wc.hCursor                    = LoadCursor(NULL, IDC_ARROW);

               

           /* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */

           wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

           wc.lpszClassName = "WindowClass";

           wc.hIcon                         = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */

           wc.hIconSm                  = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */

 

           if(!RegisterClassEx(&wc)) {

                           MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);

                           return 0;

           }

 

           hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,

                           CW_USEDEFAULT, /* x */

                           CW_USEDEFAULT, /* y */

                           640, /* width */

                           480, /* height */

                           NULL,NULL,hInstance,NULL);

 

           if(hwnd == NULL) {

                           MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);

                           return 0;

           }

 

           /*

                           This is the heart of our program where all input is processed and

                           sent to WndProc. Note that GetMessage blocks code flow until it receives something, so

                           this loop will not produce unreasonably high CPU usage

           */

           while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */

                           TranslateMessage(&msg); /* Translate key codes to chars if present */

                           DispatchMessage(&msg); /* Send it to WndProc */

           }

           return msg.wParam;

}

Теперь можно разобраться с основной структурой. Вместо int main у нас другая функция:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

Пугаться всей этой мешанины букв не нужно, мы просто будем прописывать в нужных местах нужные команды. Сначала как обычно скомпилируем и запустим эту программу. Вылезает обычное программное окошко с белым фоном и заголовком Caption. Мы можем изменить этот заголовок и начальный размер экрана. Нам нужно найти вот этот кусок:

hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,

           CW_USEDEFAULT, /* x */

           CW_USEDEFAULT, /* y */

           640, /* width */

           480, /* height */

           NULL,NULL,hInstance,NULL);

Здесь вместо 640 можно написать свою ширину и вместо 480 свою высоту. Чтобы изменить заголовок, нужно вместо "Caption" наверху в аргументе функции написать свой текст. По сути, как можешь заметить, это всё одна длинная функция создания окна.

В Visual Studio 2012 аналогично: создаём новый проект и там нужно выбрать уже не empty project как обычно, а win32 application. Создастся проект, будет похожий код, но побольше- скомпилируй его и получишь тоже некое окошко даже с 2 вкладками, т.е. это шаблон.

Я буду показывать всё на примере devcpp, потому что у меня маленький ssd куда не помещается эта громоздкая visual studio наряду с другими программами. Когда куплю хотя бы на 64 гб и установлю туда систему- смогу дополнить раздел.

В принципе, среда тут не принципиальна: ты можешь тот же код из devcpp копировать куда угодно, где можно компилировать с++ и использовать. Это просто шаблоны создаются, а можно по идее делать пустой проект и вручную этот начальный код писать (ну или копировать и вставлять)- хотя поначалу ты эти команды наизусть вряд ли выучишь- тема огромная, по ней пишутся отдельные книги, отдельно учатся- поэтому мы затроним её лишь поверхностно. Чтобы было представление как сделать обычное windows приложение, где уже не тупо консольное окно, а есть всякие вкладки, кнопки и прочее- то что ты уже компилировал тестовое шаблонное, но уже с тем что тебе там в этом окошке нужно. Открой любое приложение и там будет некий интерфейс, главное окно: вот примерно такое же, хоть и в более упрощённом виде, нашей задачей стоит научиться делать в текущем разделе.

 

Как создавать кнопки

Пример текста

 

Как добавлять картинки

Пример текста

 


Дата добавления: 2018-09-22; просмотров: 296; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!