Показаны сообщения с ярлыком CodeBlocks. Показать все сообщения
Показаны сообщения с ярлыком CodeBlocks. Показать все сообщения

суббота, 19 сентября 2015 г.

Прикручиваем библиотеку SDL 1.2.15 к Code::Blocks 13.12 в Ubuntu 15.04 Linux


Для создания нового SDL проекта будет использована среда программирования Code::Blocks 13.12. Но, в первую очередь данную IDE необходимо установить. В Ubuntu 15.04 установить Code::Blocks можно из центра приложений Ubuntu (Ubuntu Software Center). Запустим центр приложений Ubuntu (Смотрите рисунок 1, обозначение 1). Для поиска приложения воспользуйтесь полем поиска приложений (Смотрите рисунок 1, обозначение 2).

 
Рисунок 1. Центр приложений Ubuntu

Введите в поле поиска название приложения “code blocks”, результатом поиска будет необходимая нам среда Code::Blocks (Смотрите рисунок 2).

Рисунок 2. Поиск в центре приложений Ubuntu


Установите Code::Blocks IDE, для этого выберете приложение и нажмите кнопку Install (Установить).
Запустите только что установленное приложение Code::Blocks IDE из главного меню Ubuntu (Смотрите рисунок 3).

 
Рисунок 3. Запуск Code::Blocks IDE
 
Для вызова главного меню Ubuntu нажмите на значак Ubuntu как показано на рисунке 3, обозначино цифрой 1. В поле поиска установленных приложений наберите “code blocks” как показано на рисунке 3, обозначено цифрой 2. Запустите найденое приложение Code::Blocks IDE как показано на рисунке 3, обозначено цифрой 3.
Прежде чем мы продолжим, нам необходимо установить SDL. В Ubuntu это делается легко, одной командой в терминале. Запустим терминал и выполним команду:

sudo apt-get install libsdl1.2debian libsdl1.2-dev

Так же нам необходимо подготовить окружение для сборки нашего проекта из исходного кода. Выполните команду в терминале:
sudo apt-get install build-essential

Запустите Code::Blocks IDE.

Рисунок 4. Главное окно Code::Blocks IDE

Code::Block открыт (Смотрите рисунок 4), выбираем пункт меню File (Файл) > New (Новый) > Project... (Проект...). В окне выбора нового проекта, выберите проект с названием Empty project (Пустой проект), после нажать кнопку Go (Вперед). После нам откроется мастер настройки пустого проекта. На первом шаге мастера нажимаем кнопку Next. На втором шаге зададим название проекта (Project title), например sdl_p1, зададим путь (Folder to create project in) по которому будет хранится наш проект, например ~/projects/sdl (~ - Домашний каталог текущего пользователя), поля название файла проекта (Project filename) и название полного пути проекта (Resulting filename) оставим по умолчанию и нажмем кнопку Next. На третьем шаге мастера пустого проекта нас попросят выбрать название компилятора установленного в вашей операционной системе, и имена папок, где будет хранится отладочная информация и конечный исполняемый файл нашей программы, так что все оставляем по умолчанию и нажимаем кнопку Finish. Все пустой проект создан, переходим к добавлению исходного файла, где мы будем писать наш исходный код. Для создания исходного файла выберите пункт меню File (Файл) > New (Новый) > File... (Файл...). В окне выбора типа нового файла необходимо выбрать Empty file (Пустой файл), после нажать кнопку Go (Вперед). Далее в открывшемся окне мастера настройки пустого файла, на первом шаге, нажать кнопку Next. На втором шаге задать имя создоваемого исходного файла с указанием его полного пути хранения. Исходный файл назавем main.c, а путь хранения исходного файла будет путь до папки, где хронится наш проект, это ~/projects/sdl/sdl_p1/main.c. На этом же шаге нас попросят указать цели сборки проетка, выберим обе цели сборки проекта Debug - проект сообирается с отладочной информацией и Release - проект собирается без отладочной информации. После нажмите кнопку Finish. Далее в опциях сборки проекта нам необходимо прописать пути до заголовочных файлов и статически линкуемых библиотек SDL. Например у меня заголовочные файлы хронятся на /usr/include, а статически линкуемые библиотеки /usr/lib/x86_64-linux-gnu. Теперь выбираем пункт меню Project > Build options..., в открывшемся окне мы увидим название нашего проекта и две цели сборки проекта Debug и Realese. Для каждой из целей сборки проекта мы должны указать все необходимые параметры для успешной сборки проекта, но, так как мы начинающие разработчики мы будем использовать только одну цель сборки проекта Debug. Debug - режим сборки проекта при котором исполняемый файл проекта комплектуется отладочной информацией, который позволяет отлаживать проект во время выполнения, и отслеживать значения переменных и ход работы программы. Значит выбераем режим проекта Debug, для этого режима в разделе Linker Settings (Настроек Ликовщика), для группы Link libraries указать имена файлов статически линкуемых библиотек SDL. Для этого нажмите кнопку Add (Добавить) и выберите статические библиотеки с именами файлов libSDLmain.a и libSDL.a. На вопрос (Keep this as a relative path?) использовать относительный путь или нет, ответьте нет (No). То есть, путь к статической библиотеке будет абсалютный и примет следующий вид /usr/lib/x86_64-linux-gnu/libSDLmain.a и /usr/lib/x86_64-linux-gnu/libSDL.a соответствено (Смотрите рисунок 5).

Рисунок 5 . Настройка опций компиляции и линковки


Для группы Other linker options (Другие опции линковщика) необходимо ввести следующие опции линковщика:

`sdl-config --libs`

Таким образом мы линковщику сообщили, что при линковке необходимо, при получание исполняего фыйла, присоеденить статически игровой библиотеки SDL (Смотрите рисунок 5).
Теперь перейдите в раздел Search directories (Директории поиска) и в подгруппе Compiler добавьте путь до заголовочных (подключаемых) файлов библиотеки SDL, данный путь выглядит так: /usr/include. Далее в подгруппе Linker добавьте путь до статически линкуемых библиютек, данный путь выглядит так: /usr/lib/x86_64-linux-gnu/.
Ну вот и все, с настройками закончили, теперь в наш проект необходимо добавить минимальный код для создания окна с использованием библиотеки SDL.

Данный код выглядит так:
#include "SDL/SDL.h"
int main( int argc, char* args[] ) {
    SDL_Surface* display = NULL;
    SDL_Init( SDL_INIT_EVERYTHING );
    display = SDL_SetVideoMode( 640, 480, 32, SDL_SWSURFACE );
    int quit = 0;
    SDL_Event event;
    while( !quit )
    {
        if( SDL_PollEvent( &event ) )
        {
            if( event.type == SDL_KEYDOWN ) {
                switch( event.key.keysym.sym ) {
                    case SDLK_ESCAPE: quit = 1; break;
                    default : break;
                }
            }
            else if( event.type == SDL_QUIT )
            {
                quit = 1;
            }
        }
        SDL_Flip(display);
    }
    return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1

среда, 11 июля 2012 г.

CodeBlocks 8.02 и OpenGL в Ubuntu 10.04

В данном посте мне бы хотелось рассказать как скомпилировать шаблонный пример OpenGL идущий со средой CodeBlocks 8.02

Внимание: Прежде чем начать, убедитесь что у вас установлены драйвера на вашу видео карту и работает 3D ускорение. Проверить это можно поставив 3D игрушку в Ubuntu или программой glxgears.

Установите IDE CodeBlocks из репозитория Ubuntu. На момент написания поста использовалась среда CodeBlocks 8.02. Запустите Ubuntu Software Center и в поле поиска введите CodeBlocks, потом установите программу.


Создайте в домашнем каталоге папку Projects и вложенную в нее папку OpenGL, здесь будем хранить наш проект. У меня это (~/Projects/OpenGL), где ~ домашний каталог вашего пользователя.

Запустите среду разработки CodeBlocks и создайте новый проект из меню File → New → Project... В мастере создания нового проекта из шаблона выберите категорию 2D/3D Graphics. Выделите шаблон OpenGL project и нажмите кнопку Go.


Далее вас поприветствует мастер создания нового OpenGL проекта поэтому нажмем кнопку Next, следующим шагом необходимо указать название проекта, например ogl_p1, там же укажите название каталога, где будет создан проект. На последнем шаге нажмите Finish.

Если вы попробовали скомпилировать шаблонный код который нам предложил мастер по завершению свой работы, то у вас, возможно, как и у меня отобразилось сообщение о том, что не найдены заголовочные файлы OpenGL.

Теперь нам необходимо установить заголовочный файлы и библиотеку OpenGL. В Ubuntu OpenGL реализован через проект Mesa. Поэтому установить нам надо пакет libgl1-mesa-dev
Свободная реализация OpenGL API -- GLX файлы разработки. В терминале вводим:

sudo apt-get install libgl1-mesa-dev

Данный пакет должен потянуть кучу других пакетов, у меня это:

libdrm-dev
libgl1-mesa-dev (этот пакет)
libpthread-stubs0
libpthread-stubs0-dev
libx11-dev
libxau-dev
libxdmcp-dev
mesa-cammon-dev
x11proto-core-dev
x11proto-input-dev
x11proto-kb-dev
xtrans-dev

Я не знаю для чего нужны эти пакеты, поэтому примем это как должное и неотъемлемое.

После установки библиотеки OpenGL еще раз пробуем скомпилировать. Но нет, проект не компилируется, выдает сообщение, что не найден компилятор g++.

Пробуем поставить компилятор g++. Следующая команда установит компилятор:

sudo apt-get install g++

Еще раз построим проект, нажмите кнопку Build, потом нажмите Run. У вас должно появится окно похожее на это:



Нажатие левой кнопки мыши вращение куба вокруг координаты X. Нажатие средней кнопки мыши вращение куба вокруг координаты Y. Нажатие правой кнопки мыши вращение куба вокруг координаты Z. Нажмите ESC чтобы завершить программу.

Ниже расположен весь код шаблонного проекта поставляемый со средой CodeBlocks 8.02. 

/* A simple program to show how to set up an X window for OpenGL rendering.
* X86 compilation: gcc -o -L/usr/X11/lib main main.c -lGL -lX11
* X64 compilation: gcc -o -L/usr/X11/lib64 main main.c -lGL -lX11
*/
#include <stdio.h>
#include <stdlib.h>

#include <GL/glx.h> /* this includes the necessary X headers */
#include <GL/gl.h>

#include <X11/X.h> /* X11 constant (e.g. TrueColor) */
#include <X11/keysym.h>

static int snglBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16, None};
static int dblBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None};

Display *dpy;
Window win;
GLfloat xAngle = 42.0, yAngle = 82.0, zAngle = 112.0;
GLboolean doubleBuffer = GL_TRUE;

void fatalError(char *message)
{
fprintf(stderr, "main: %s\n", message);
exit(1);
}

void redraw(void)
{
static GLboolean displayListInited = GL_FALSE;

if (displayListInited)
{
/* if display list already exists, just execute it */
glCallList(1);
}
else
{
/* otherwise compile and execute to create the display list */
glNewList(1, GL_COMPILE_AND_EXECUTE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

/* front face */
glBegin(GL_QUADS);
glColor3f(0.0, 0.7, 0.1); /* green */
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glVertex3f(-1.0, -1.0, 1.0);

/* back face */
glColor3f(0.9, 1.0, 0.0); /* yellow */
glVertex3f(-1.0, 1.0, -1.0);
glVertex3f(1.0, 1.0, -1.0);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);

/* top side face */
glColor3f(0.2, 0.2, 1.0); /* blue */
glVertex3f(-1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, 1.0);
glVertex3f(1.0, 1.0, -1.0);
glVertex3f(-1.0, 1.0, -1.0);

/* bottom side face */
glColor3f(0.7, 0.0, 0.1); /* red */
glVertex3f(-1.0, -1.0, 1.0);
glVertex3f(1.0, -1.0, 1.0);
glVertex3f(1.0, -1.0, -1.0);
glVertex3f(-1.0, -1.0, -1.0);
glEnd();
glEndList();
displayListInited = GL_TRUE;
}
if (doubleBuffer)
glXSwapBuffers(dpy, win);/* buffer swap does implicit glFlush */
else
glFlush(); /* explicit flush for single buffered case */
}

int main(int argc, char **argv)
{
XVisualInfo *vi;
Colormap cmap;
XSetWindowAttributes swa;
GLXContext cx;
XEvent event;
GLboolean needRedraw = GL_FALSE, recalcModelView = GL_TRUE;
int dummy;

/*** (1) open a connection to the X server ***/

dpy = XOpenDisplay(NULL);
if (dpy == NULL)
fatalError("could not open display");

/*** (2) make sure OpenGL's GLX extension supported ***/

if(!glXQueryExtension(dpy, &dummy, &dummy))
fatalError("X server has no OpenGL GLX extension");

/*** (3) find an appropriate visual ***/

/* find an OpenGL-capable RGB visual with depth buffer */
vi = glXChooseVisual(dpy, DefaultScreen(dpy), dblBuf);
if (vi == NULL)
{
vi = glXChooseVisual(dpy, DefaultScreen(dpy), snglBuf);
if (vi == NULL) fatalError("no RGB visual with depth buffer");
doubleBuffer = GL_FALSE;
}
if(vi->class != TrueColor)
fatalError("TrueColor visual required for this program");

/*** (4) create an OpenGL rendering context ***/

/* create an OpenGL rendering context */
cx = glXCreateContext(dpy, vi, /* no shared dlists */ None,
/* direct rendering if possible */ GL_TRUE);
if (cx == NULL)
fatalError("could not create rendering context");

/*** (5) create an X window with the selected visual ***/

/* create an X colormap since probably not using default visual */
cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
swa.colormap = cmap;
swa.border_pixel = 0;
swa.event_mask = KeyPressMask | ExposureMask
| ButtonPressMask | StructureNotifyMask;
win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0,
300, 300, 0, vi->depth, InputOutput, vi->visual,
CWBorderPixel | CWColormap | CWEventMask, &swa);
XSetStandardProperties(dpy, win, "main", "main", None,
argv, argc, NULL);

/*** (6) bind the rendering context to the window ***/

glXMakeCurrent(dpy, win, cx);

/*** (7) request the X window to be displayed on the screen ***/

XMapWindow(dpy, win);

/*** (8) configure the OpenGL context for rendering ***/

glEnable(GL_DEPTH_TEST); /* enable depth buffering */
glDepthFunc(GL_LESS); /* pedantic, GL_LESS is the default */
glClearDepth(1.0); /* pedantic, 1.0 is the default */

/* frame buffer clears should be to black */
glClearColor(0.0, 0.0, 0.0, 0.0);

/* set up projection transform */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0);
/* establish initial viewport */
/* pedantic, full window size is default viewport */
glViewport(0, 0, 300, 300);

printf( "Press left mouse button to rotate around X axis\n" );
printf( "Press middle mouse button to rotate around Y axis\n" );
printf( "Press right mouse button to rotate around Z axis\n" );
printf( "Press ESC to quit the application\n" );

/*** (9) dispatch X events ***/

while (1)
{
do
{
XNextEvent(dpy, &event);
switch (event.type)
{
case KeyPress:
{
KeySym keysym;
XKeyEvent *kevent;
char buffer[1];
/* It is necessary to convert the keycode to a
* keysym before checking if it is an escape */
kevent = (XKeyEvent *) &event;
if ( (XLookupString((XKeyEvent *)&event,buffer,1,&keysym,NULL) == 1)
&& (keysym == (KeySym)XK_Escape) )
exit(0);
break;
}
case ButtonPress:
recalcModelView = GL_TRUE;
switch (event.xbutton.button)
{
case 1: xAngle += 10.0;
break;
case 2: yAngle += 10.0;
break;
case 3: zAngle += 10.0;
break;
}
break;
case ConfigureNotify:
glViewport(0, 0, event.xconfigure.width,
event.xconfigure.height);
/* fall through... */
case Expose:
needRedraw = GL_TRUE;
break;
}
} while(XPending(dpy)); /* loop to compress events */

if (recalcModelView)
{
glMatrixMode(GL_MODELVIEW);

/* reset modelview matrix to the identity matrix */
glLoadIdentity();

/* move the camera back three units */
glTranslatef(0.0, 0.0, -3.0);

/* rotate by X, Y, and Z angles */
glRotatef(xAngle, 0.1, 0.0, 0.0);
glRotatef(yAngle, 0.0, 0.1, 0.0);
glRotatef(zAngle, 0.0, 0.0, 1.0);

recalcModelView = GL_FALSE;
needRedraw = GL_TRUE;
}
if (needRedraw)
{
redraw();
needRedraw = GL_FALSE;
}
}

return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1