Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Игра


Автор: m1kle 23.8.2007, 20:14
Очень важно, нужна хорошая 2D библиотека для игры ( желательно лучшая на данный момент ) и документация к ней.

Автор: JackYF 23.8.2007, 20:23
m1kle, OpenGL? всё открыто, инфы в гугле и на сайтах - навалом.

Автор: m1kle 23.8.2007, 20:28
OpenGL это разве 2D?

Автор: bsa 23.8.2007, 20:31
Цитата(m1kle @ 23.8.2007,  20:28)
OpenGL это разве 2D?

А в чем отличия? Ты знаешь, что 2D - это частный случай 3D (проекция)?

Автор: m1kle 23.8.2007, 20:37
bsa, нет. А не лучше ли DirectX 10 использовать?

Автор: Solomon 23.8.2007, 20:48
Цитата(m1kle @  23.8.2007,  19:37 Найти цитируемый пост)
bsa, нет. А не лучше ли DirectX 10 использовать?

млин не начинайте этот вечный спор что лучше Опер или Директ... smile

Обе бь посвоему хороши.. смотря для какой задачи


Автор: bsa 23.8.2007, 22:30
Цитата(m1kle @ 23.8.2007,  20:37)
bsa, нет. А не лучше ли DirectX 10 использовать?

Что умеешь, то и используй. Только учти, что DirectX только в Windows работает.

Автор: Daevaorn 23.8.2007, 22:34
http://www.libsdl.org/

Автор: m1kle 23.8.2007, 23:15
а откуда собственно можно скачать OpenGL?

Добавлено через 4 минуты и 8 секунд
И ещё, как установить визул студио 2008 Бета 2 на висту?

Автор: FREEDEV 23.8.2007, 23:32
http://www.opengl.org/

Но вообще DirextX и OpenGL зачастую поставляются с драйвером для твоей видеокарты.

Вот еще хорошый мануаль, если будешь учить GL
http://pmg.org.ru/nehe/index.html

Автор: m1kle 23.8.2007, 23:35
я уже давно открыл окно я этим сайтом, в википедии нашёл, насчёт скачать, не нашёл на их оффиц. сайте, дайти плиз ссылку.

Добавлено через 12 минут и 25 секунд
к стати а с Dev-cpp он работает?

Автор: JackYF 24.8.2007, 01:23
Цитата(m1kle @  23.8.2007,  23:35 Найти цитируемый пост)
к стати а с Dev-cpp он работает? 

эх... они работают с любым нормальным компилятором, это же библиотека, а не среда программирования.

Автор: m1kle 24.8.2007, 01:28
разобрался, теперь вот такая ошибка пишет ( вот код )
Код

#define CDS_FULLSCREEN 4
#include <windows.h>              // Çàãîëîâî÷íûå ôàéëû äëÿ Windows
#include <gl\gl.h>                // Çàãîëîâî÷íûå ôàéëû äëÿ áèáëèîòåêè OpenGL32
#include <gl\glu.h>              // Çàãîëîâî÷íûå ôàéëû äëÿ áèáëèîòåêè GLu32
#include <gl\glaux.h>              // Çàãîëîâî÷íûå ôàéëû äëÿ áèáëèîòåêè GLaux

HGLRC  hRC=NULL;              // Ïîñòîÿííûé êîíòåêñò ðåíäåðèíãà
HDC  hDC=NULL;              // Ïðèâàòíûé êîíòåêñò óñòðîéñòâà GDI
HWND  hWnd=NULL;              // Çäåñü áóäåò õðàíèòñÿ äåñêðèïòîð îêíà
HINSTANCE  hInstance;              // Çäåñü áóäåò õðàíèòñÿ äåñêðèïòîð ïðèëîæåíèÿ

GLvoid DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     // Î÷èñòêà ýêðàíà
                                                        // è áóôåðà ãëóáèíû
        glLoadIdentity();                               // Ñáðîñ ïðîñìîòðà
               glTranslatef(-1.5f,0.0f,-6.0f);         // Ñäâèíåìñÿ âëåâî íà 1.5 åäèíèöû è
                                                // â ýêðàí íà 6.0
                                                        glBegin(GL_TRIANGLES);
                glVertex3f( 0.0f, 1.0f, 0.0f);  // Ââåðõ
                glVertex3f(-1.0f,-1.0f, 0.0f);  // Ñëåâà ñíèçó
                glVertex3f( 1.0f,-1.0f, 0.0f);  // Ñïðàâà ñíèçó
        glEnd();


        glTranslatef(3.0f,0.0f,0.0f);           // Ñäâèíåì âïðàâî íà 3 åäèíèöû
        
                glBegin(GL_QUADS);
                glVertex3f(-1.0f, 1.0f, 0.0f);  // Ñëåâà ââåðõó
                glVertex3f( 1.0f, 1.0f, 0.0f);  // Ñïðàâà ââåðõó
                glVertex3f( 1.0f,-1.0f, 0.0f);  // Ñïðàâà âíèçó
                glVertex3f(-1.0f,-1.0f, 0.0f);  // Ñëåâà âíèçó
        glEnd();
}

ошибка
  [Linker error] undefined reference to `glClear@4' 
и много ошибок такого типа :(

Автор: JackYF 24.8.2007, 01:43
Цитата(m1kle @  24.8.2007,  01:28 Найти цитируемый пост)
и много ошибок такого типа :( 

подключи нужный .lib - файл от opengl.

Автор: m1kle 24.8.2007, 01:46
А где его скачать?

Добавлено через 11 минут и 23 секунды
Скачал, теперь вопрос как их инклюдить и куда ставить?

Автор: m1kle 24.8.2007, 02:02
* я скачал opengl32.lib, и glu32.lib, вроде это то..

использую Dev-cpp

Автор: JackYF 24.8.2007, 02:20
Цитата(m1kle @  24.8.2007,  01:46 Найти цитируемый пост)
их инклюдить и куда ставить? 

Это бинарные файлы, их нужно прописать в настройки проекта (libraries).

Автор: m1kle 24.8.2007, 02:24
уже лучше, но другая ошибка
  [Linker error] undefined reference to `WinMain@16' 

Автор: m1kle 24.8.2007, 03:57
 File format not recognized :(((

Автор: bsa 24.8.2007, 09:37
создай консольный проект. Или вместо функции main() создай WinMain(). Только учти, у нее другие параметры - прочитай в документации какие.

Автор: m1kle 24.8.2007, 10:21
Код
#define CDS_FULLSCREEN 4
#include <windows.h>        // Заголовочный файл для Windows
#include <gl\gl.h>            // Заголовочный файл для OpenGL32 библиотеки
#include <gl\glu.h>            // Заголовочный файл для GLu32 библиотеки
#include <gl\glaux.h>        // Заголовочный файл для GLaux библиотеки

static HGLRC hRC;        // Постоянный контекст рендеринга
static HDC hDC;            // Приватный контекст устройства GDI

BOOL    keys[256];        // Массив для процедуры обработки клавиатуры

GLvoid InitGL(GLsizei Width, GLsizei Height)    // Вызвать после создания окна GL
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
                            // Очистка экрана в черный цвет
    glClearDepth(1.0);        // Разрешить очистку буфера глубины
    glDepthFunc(GL_LESS);    // Тип теста глубины
    glEnable(GL_DEPTH_TEST);// разрешить тест глубины
    glShadeModel(GL_SMOOTH);// разрешить плавное цветовое сглаживание
    glMatrixMode(GL_PROJECTION);// Выбор матрицы проекции
    glLoadIdentity();        // Сброс матрицы проекции
    gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
                            // Вычислить соотношение геометрических размеров для окна
    glMatrixMode(GL_MODELVIEW);// Выбор матрицы просмотра модели
}

GLvoid ReSizeGLScene(GLsizei Width, GLsizei Height)
{
    if (Height==0)        // Предотвращение деления на ноль, если окно слишком мало
        Height=1;

    glViewport(0, 0, Width, Height);
        // Сброс текущей области вывода и перспективных преобразований

    glMatrixMode(GL_PROJECTION);// Выбор матрицы проекций
    glLoadIdentity();            // Сброс матрицы проекции

    gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
        // Вычисление соотношения геометрических размеров для окна
    glMatrixMode(GL_MODELVIEW);    // Выбор матрицы просмотра модели
}

GLvoid DrawGLScene(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // очистка Экрана и буфера глубины
    glLoadIdentity();
        // Сброс просмотра
    glTranslatef(-1.5f,0.0f,-6.0f);    // Сдвинемся влево на 1.5 единицы и
                                    // в экран на 6.0
    glBegin(GL_TRIANGLES);
        glVertex3f( 0.0f, 1.0f, 0.0f);    // Вверх
        glVertex3f(-1.0f,-1.0f, 0.0f);    // Слева снизу
        glVertex3f( 1.0f,-1.0f, 0.0f);    // Справа снизу
    glEnd();

    glTranslatef(3.0f,0.0f,0.0f);        // Сдвинем вправо на 3 единицы

    glBegin(GL_QUADS);
        glVertex3f(-1.0f, 1.0f, 0.0f);    // Слева вверху
        glVertex3f( 1.0f, 1.0f, 0.0f);    // Справа вверху
        glVertex3f( 1.0f,-1.0f, 0.0f);    // Справа внизу
        glVertex3f(-1.0f,-1.0f, 0.0f);    // Слева внизу
    glEnd();

}

LRESULT CALLBACK WndProc(
                HWND    hWnd,
                UINT    message,
                WPARAM    wParam,
                LPARAM    lParam)
{
    RECT    Screen;        // используется позднее для размеров окна
    GLuint    PixelFormat;
    static    PIXELFORMATDESCRIPTOR pfd=
    {
        sizeof(PIXELFORMATDESCRIPTOR),    // Размер этой структуры
        1,                // Номер версии (?)
        PFD_DRAW_TO_WINDOW |// Формат для Окна
        PFD_SUPPORT_OPENGL |// Формат для OpenGL
        PFD_DOUBLEBUFFER,// Формат для двойного буфера
        PFD_TYPE_RGBA,    // Требуется RGBA формат
        16,                // Выбор 16 бит глубины цвета
        0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?)
        0,                // нет буфера прозрачности
        0,                // Сдвиговый бит игнорируется (?)
        0,                // Нет буфера аккумуляции
        0, 0, 0, 0,        // Биты аккумуляции игнорируются (?)
        16,                // 16 битный Z-буфер (буфер глубины)  
        0,                // Нет буфера траффарета
        0,                // Нет вспомогательных буферов (?)
        PFD_MAIN_PLANE,    // Главный слой рисования
        0,                // Резерв (?)
        0, 0, 0            // Маски слоя игнорируются (?)
    };
    switch (message)    // Тип сообщения
    {
        case WM_CREATE:
        hDC = GetDC(hWnd);    // Получить контекст устройства для окна
        PixelFormat = ChoosePixelFormat(hDC, &pfd);
            // Найти ближайшее совпадение для нашего формата пикселов
        if (!PixelFormat)
        {
            MessageBox(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            // Это сообщение говорит, что программа должна завершится
            break;    // Предтовращение повтора кода
        }
        if(!SetPixelFormat(hDC,PixelFormat,&pfd))
        {
            MessageBox(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }
        hRC = wglCreateContext(hDC);
        if(!hRC)
        {
            MessageBox(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }
        if(!wglMakeCurrent(hDC, hRC))
        {
            MessageBox(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
            PostQuitMessage(0);
            break;
        }
        GetClientRect(hWnd, &Screen);
        InitGL(Screen.right, Screen.bottom);
        break;

        case WM_DESTROY:
        case WM_CLOSE:
        ChangeDisplaySettings(NULL, 0);

        wglMakeCurrent(hDC,NULL);
        wglDeleteContext(hRC);
        ReleaseDC(hWnd,hDC);

        PostQuitMessage(0);
        break;

        case WM_KEYDOWN:
        keys[wParam] = TRUE;
        break;

        case WM_KEYUP:
        keys[wParam] = FALSE;
        break;

        case WM_SIZE:
        ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
        break;

        default:
    return (DefWindowProc(hWnd, message, wParam, lParam));
    }
    return (0);
}

int WINAPI WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine,
        int nCmdShow)
{
    MSG        msg;    // Структура сообщения Windows
    WNDCLASS    wc; // Структура класса Windows для установки типа окна
    HWND        hWnd;// Сохранение дискриптора окна

    wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc        = (WNDPROC) WndProc;
    wc.cbClsExtra        = 0;
    wc.cbWndExtra        = 0;
    wc.hInstance        = hInstance;
    wc.hIcon            = NULL;
    wc.hCursor            = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    = NULL;
    wc.lpszMenuName        = NULL;
    wc.lpszClassName    = "OpenGL WinClass";

    if(!RegisterClass(&wc))
    {
    MessageBox(0,"Failed To Register The Window Class.","Error",MB_OK|MB_ICONERROR);
    return FALSE;
    }

    hWnd = CreateWindow(
    "OpenGL WinClass",
    "Jeff Molofee's GL Code Tutorial ... NeHe '99",    // Заголовок вверху окна

    WS_POPUP |
    WS_CLIPCHILDREN |
    WS_CLIPSIBLINGS,

    0, 0,            // Позиция окна на экране
    640, 480,        // Ширина и высота окна

    NULL,
    NULL,
    hInstance,
    NULL);

    if(!hWnd)
    {
    MessageBox(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR); 
        return FALSE;
    }

    DEVMODE dmScreenSettings;            // Режим работы

    memset(&dmScreenSettings, 0, sizeof(DEVMODE));    // Очистка для хранения установок
    dmScreenSettings.dmSize    = sizeof(DEVMODE);        // Размер структуры Devmode
    dmScreenSettings.dmPelsWidth    = 640;            // Ширина экрана
    dmScreenSettings.dmPelsHeight    = 480;            // Высота экрана
    dmScreenSettings.dmFields    = DM_PELSWIDTH | DM_PELSHEIGHT;    // Режим Пиксела
    ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
    // Переключение в полный экран

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
    SetFocus(hWnd);

    while (1)
    {
        // Обработка всех сообщений
        while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            if (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                return TRUE;
            }
        }

        DrawGLScene();                // Нарисовать сцену
        SwapBuffers(hDC);            // Переключить буфер экрана
        if (keys[VK_ESCAPE]) SendMessage(hWnd,WM_CLOSE,0,0);    // Если ESC - выйти
    }
}

вот мой код, ошибка -   File format not recognized 

Автор: bsa 24.8.2007, 11:03
Это в каком месте ошибка вылетает? На этапе выполнения, компиляции или линковки?
Приведи полный текст ошибки и строку консоли (лога компиляции), после которой она возникает.

Автор: m1kle 24.8.2007, 11:21
netwar.ru/screen.jpg, я скриншот залил.

Автор: bsa 24.8.2007, 11:32
Цитата(m1kle @ 24.8.2007,  11:21)
netwar.ru/screen.jpg, я скриншот залил.

Куда ты залил? Ничего не открывается.

Автор: m1kle 24.8.2007, 12:11
http://slil.ru/24772670

Автор: bsa 24.8.2007, 12:58
Более бесполезного скриншота я не видел.
Открой "Журнал компиляции" и дай его содержимое.
Скорее всего, ты как-то криво подключил либу.

Автор: m1kle 24.8.2007, 13:02
Компилятор: Default compiler
Building Makefile: "C:\Users\.m1kle\Desktop\.m1kle Studios\Название в разработке\проект\Makefile.win"
Выполнение  make...
make.exe -f "C:\Users\.m1kle\Desktop\.m1kle Studios\Название в разработке\проект\Makefile.win" all
g++.exe main.o  -o "Проект2.exe" -L"C:/Dev-Cpp/lib" -mwindows -lglaux -lopengl32 ../glu32.lib ../opengl32.lib  

../glu32.lib: file not recognized: File format not recognized
collect2: ld returned 1 exit status

make.exe: *** [Проект2.exe] Error 1

Выполнение завершено

Автор: bsa 24.8.2007, 13:20
ну вот. теперь все понятно.
библиотеки подключаются ключем -l. Например: -lopengl32 -lglu32. То что у тебя есть ../glu32.lib и вызывает ошибку, так как g++.exe (компилятор Си++) пытается разобраться это исходник (*.cpp) или объектный файл (*.o), но не может опознать, вот и ругается.

Автор: m1kle 24.8.2007, 13:24
Спасибо ОРГОМНОЕ, работает, просто отпад %))))

Добавлено @ 13:36
А в чём измеряется 0.0f, а то я поставил разршение экрана 1440x900, и объекты плохо отображаются...
glVertex3f( 0.0f, 1.0f, 0.0f);
т.е. что это за тип данных x.xf??

Автор: bsa 24.8.2007, 13:51
Одна тема, один вопрос.
0.0f - это тип float. Может книжку стоит почитать?

Автор: m1kle 24.8.2007, 14:01
Понял. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)