Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > OpenGL:рисование 2x координатами в 3x пространстве


Автор: KaraKum 16.3.2008, 12:17
Доброе время суток.
Создаю 3-х мерную игру в жанре стратегии на основе OpenGL. Ну и как, наверное, во всех стратегиях в процессе самой игры снизу будет меню (что строить, мини-карта и так далее) и время-от-времени появляющееся справа меню.
Так вот, так как расположения этих меню не будут зависеть от угла обзора в игре, нет смысла рисовать их в 3-х мерном пространстве, к тому же будет удобнее и быстрее, если ещё до преобразования 2-х мерных координат указателя мыши в 3-х мерные будет совершаться проверка на соответствие их (координат) координатам меню (клик по меню).
Подскажите, пожалуйста, как в 3-х мерном пространстве нарисовать 2-х мерные объекты, которые будут абсолютно всегда располагаться "поверх" всех остальных объектов.

Автор: Graf_h 17.3.2008, 10:33
устанавливаеш ортогональную проэкцию рисуеш все что тебе надо в плоскости!

Автор: KaraKum 17.3.2008, 12:03
Вставил следующий код:
Код

glOrtho(0, 1024, 768, 0, 1, 1);
glColor3d(1, 0, 1);
glBegin(GL_QUADS);
    glVertex2i(10, 10);
    glVertex2i(1000, 10);
    glVertex2i(1000, 700);
    glVertex2i(10, 700);
glEnd();

Но вообще никакой реакции, а ведь, как я понимаю, должен нарисоваться квадрат почти во весь экран. В чём проблема?

Автор: Graf_h 17.3.2008, 15:41
Код

void ResizeWindow(GLsizei w,GLsizei h){
GLfloat asp;
if (h==0) h=1;
glViewport(0,0,w,h);
asp= GLfloat (w)/GLfloat (h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w>=h){
glOrtho(-100*asp, 100*asp, -100, 100, 1.0, -1.0);} else
glOrtho(-100, 100, -100/asp, 100/asp, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

Должно заработать!  smile 

Автор: KaraKum 17.3.2008, 18:08
Заработало! Только вот получается так, то нарисованное изображение также является 3-х мерным объектом и поэтому, если какие-то другие объекты окажутся ближе к наблюдателю, чем этот, то они будут прорисовываться поверх игрового меню. И к тому же здесь снова придётся преобразовывать координаты мыши, а нельзя просто сверить координаты мыши и меню по координатам 1024/768. Неужели нельзя установить опции так, чтобы в итоге можно было нарисовать абсолютно ближайший объект, которые никогда не перекроют другие и желательно с помощью координат 1024/768, чтобы можно было проверять координаты мыши сначала не нажал ли пользователь на меню, а только потом преобразовывать их в 3-х мерный мир?
Подскажите, пожалуйста, очень нужно.

И ещё вопрос в довесок: можно ли и как в OpenGL определять цвет как смесь 3-х цветов от 0 до 255, а не между 0 и 1?

Автор: Graf_h 17.3.2008, 18:54
Цитата(KaraKum @  17.3.2008,  18:08 Найти цитируемый пост)
И ещё вопрос в довесок: можно ли и как в OpenGL определять цвет как смесь 3-х цветов от 0 до 255, а не между 0 и 1?
 
Можно! непомню точно, кажется glColor3ub(...)




Цитата(KaraKum @  17.3.2008,  18:08 Найти цитируемый пост)
Заработало! Только вот получается так, то нарисованное изображение также является 3-х мерным объектом и поэтому, если какие-то другие объекты окажутся ближе к наблюдателю, чем этот, то они будут прорисовываться поверх игрового меню. И к тому же здесь снова придётся преобразовывать координаты мыши, а нельзя просто сверить координаты мыши и меню по координатам 1024/768. Неужели нельзя установить опции так, чтобы в итоге можно было нарисовать абсолютно ближайший объект, которые никогда не перекроют другие и желательно с помощью координат 1024/768, чтобы можно было проверять координаты мыши сначала не нажал ли пользователь на меню, а только потом преобразовывать их в 3-х мерный мир?Подскажите, пожалуйста, очень нужно.


если честно то не вижу в этом никаких проблем! glRenderMode(GL_SELECT) и ничего не нужно переобразовывать!

Автор: KaraKum 17.3.2008, 21:11
Функция цвета работает так как и хотелось  smile .
А насчёт прорисовки:
Код выглядит так:
Код

glRenderMode(GL_SELECT);
glLoadIdentity();
glBegin(GL_QUADS);
    glVertex2d(1, 1);
    glVertex2d(1000, 1);
    glVertex2d(1000, 700);
    glVertex2d(1, 700);
glEnd();

Но вообще ничего не рисуется. Что я делаю не так?

Автор: Graf_h 18.3.2008, 11:04
Не так!  smile  OpenGL фактически работает в 3 режимах визуализации! По умолчанию стоит GL_RENDER! Если ты хочеш интерактивности, тогда включаеш режим glRenderMode(GL_SELECTION) но этого не достаточно...  далее обрабативаеш щелчок мышы:

Код

void Mousefunction(int button,int state,int x,int y){
if ((button==GLUT_LEFT_BUTTON)&&(state==GLUT_DOWN)){
        yourSelection(x,y);//твоя функция в которой ты будеш делать свой выбор
  }
}



Но и этого не достаточно... Нужно еще из чего то выбирать! В ОпенЖЛ это называется ьуфер выбора... тоесть ты его строиш сам. Более подробно можеш почитать об этом в учебниках smile 

вот пример:
Код

//тоесть в твоем буфере будет не более 10 обектов
#define BUFSIZE = 10

void yourSelection(int xpos,int ypos){ 
GLfloat asp;

static GLfloat yuorSelectBuffer[BUFSIZE];//еще лудше будет если использовать
                                                                 // vector<GLfloat >  yuorSelectBuffer  тогда не нужно заранее
                                                                //  указывать размер твоего буфера
GLint hits,view[4];

glSelectBuffer(BUFSIZE,yuorSelectBuffer);//настройка твоего буфера выбора

glGetIntegerv(GL_VIEWPORT,view);// здесь ты получаеш поле просмотра
glMatrixMode(GL_PROJECTION);
glPushMatrix();

glRenderMode(GL_SELECTION);
glLoadIdentity();
gluPickMatrix(xpos,view[3]-ypos,2,2,view);
asp=static_cast<float> view[2]/static_cast<float> view[3];
gluPerspective(45.0f,asp,1.0,100.0);
RenderScene();//здесь твоя  функция  рисования сцены

hits = glRenderMode(GL_RENDER);//проверяеш на совпадения

if (hits==1){
yourFunction(yuorSelectBuffer[3]);
}

glMatrixMode(GL_PROGECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}

void RenderScene(){
...
glInitNames();//инициализвция стека имен
glPushName(0);

// наппример рисуем сферу

glPushMatrix();

glLoadName(sphere);
drawYourSphere(10);// здесь ты можеш рисовать что угодно
glPopMatrix();

}

// здесь ты анализируеш твой буфер
void yourFunction( GLuint *selBuff){
   int id,count;

  count=selBuff[0];
  id =selBuf[3];
  
  switch(id){
    case sphere: // что то делаем
    break;
}
 
}


Вот бегло пробежался по основным моментам! этот код можеш использовать но не знаю без ошибок ли он... советую почитать больше про выбор! надеюсь это поможет тебе smile 

Автор: KaraKum 18.3.2008, 12:22
Спасибо за такой развёрнутый ответ, но я видимо вопрос не так сформулировал.
Вобщем, я создаю игру в жанре 3-х мерной стратегии, в мире которой можно вращаться по всем осям и перемещаться во все стороны (хоть залезть в дуло танка). Так вот, а механизм взаимодействия мыши с объектами я в теории уже реализовал - это выглядит так: согласно такущему изменению глобальной оси от первоначальной (поворот и изменение угла обзора) при клике или движении мыши строится вектор с направлением, координаты которого можно сверять с объектами и принимать решение поразил ли вектор объект или нет и какой объект был поражён первым - на том и был произведён клик мыши.
Но в игре должно быть меню, причём плоское и абсолютно всегда располагаться поверх всех остальных объектым вне зависимости от того как близко к ним находится наблюдатель. Так вот, если ли возможность каким-ниюбудь образом перейти в режим рисования таких объектов?

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

Автор: Graf_h 18.3.2008, 12:31
Тоесть теб нужно обработать только меню?

Автор: KaraKum 18.3.2008, 12:42
Ну почти: поступившие в прогу координаты мыши (как интервалы между 1024 и 768) можно без проблем заставить обрабатывать объект "Меню" (меню не 3-х мерное и всегда на одном месте), после чего, если клик был не по меню, преобразовывать координаты в 3-х мерный мир и искать объект, на который пользователь предполагал нажать в зависимости от текущего вращения и glTranslated() глобальной матрицы.
Но главное, что нужно от меню, это невозможность его перекрытия, то есть, чтобы меню всегда было поверх всех остальных объектов, даже если, например, наблюдатель приблизился к какому-нибудь объекту по оси Z на расстояние -0.000000001 - вот так вот  smile .

Автор: Graf_h 18.3.2008, 12:58
Цитата(KaraKum @  18.3.2008,  12:42 Найти цитируемый пост)
наблюдатель приблизился к какому-нибудь объекту по оси Z на расстояние -0.000000001 - вот так вот

 
Так ти же когда устанавливаеш проекции ты вказываеш отсечения по оси z! А когда ты рисуеш в ортогональной прекции то тогда у теба никогда трехмерный обьект не пересечет твое меню! 

Автор: KaraKum 18.3.2008, 13:21
Пробовал! Пересекается!  smile 
В ортогональной проекции он рисуется в такой координате Z, которую указываешь при вызове функции glOrtho(), то есть так будто в 3D, только задаёшь рисунок с двухмерными координатами, а ось Z уже определена - по крайней мере у меня так было и если вращать область видимости (да, нарисованный квадрат (по ортогональной проекции) всегда находится в одном месте относительно наблюдателя) так, чтобы пол или другие объекты стали ближе, чем квадрат, то те объекты начинают прорисовываться поверх этого квадрата. smile 
Причём квадрат приходится рисовать не координатами в интервали 1024/768 (как задавал в функции glOrtho()) а также примерно от -2 до 2.

Автор: Graf_h 18.3.2008, 13:40
В перспективной проекции ставиш отсечения например с 0.1 до например -200.0! 
Когда рисуеш в ортогональной тогда пишеш 
glPushMatrix();
glLoadIdentity();
glTranslated(x,y,0.0f);
DrawObject();
glPopMatrix();

и никогда у тебя ничего не пересечется

Автор: KaraKum 18.3.2008, 14:11
Вставил этот код - вообще всё испортилось  smile .
Можешь дать полный пример? smile 

Автор: Graf_h 18.3.2008, 16:20
Код

#include "stdafx.h"
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <gl/glaux.h>
#pragma comment(lib,"GLAUX.LIB")

HWND hw;
GLfloat ang=0;
GLfloat amb[]={1.0f,1.0f,1.0f,1.0f};
GLuint    texture[2];
GLfloat posz=-5.0f;
GLint st=1;
int resolutHEIGHT;
int resolutWIDTH;

GLfloat wWidth,wHeight;
/////////////////////////////////////////////////////////////////////////////
GLuint filter=0;                          // Èñïîëüçóåìûé ôèëüòð äëÿ òåêñòóð 
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Õðàíèò òðè òèïà òóìàíà
GLuint fogfilter= 0;                    // Òèï èñïîëüçóåìîãî òóìàíà
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};
//////////////////////////////////////////////////////////////////////////////

GLvoid loadTexture(){
 
    AUX_RGBImageRec *texture1;
    texture1 = auxDIBImageLoad("pic/pic1.bmp");
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,    GL_RGB, GL_UNSIGNED_BYTE, texture1->data);
    
    texture1 = auxDIBImageLoad("pic/pic2.bmp");
    glGenTextures(1, &texture[1]);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture1->sizeX, texture1->sizeY, 0,    GL_RGB, GL_UNSIGNED_BYTE, texture1->data);


}

void SetupRC(void){
glClearColor(0.5f,0.5f,0.5f,1.0f);
loadTexture();
glEnable(GL_TEXTURE_2D);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);

///////////fog///////////////
glEnable(GL_FOG);                       // Âêëþ÷àåò òóìàí (GL_FOG)
glFogi(GL_FOG_MODE, fogMode[2]);// Âûáèðàåì òèï òóìàíà
glFogfv(GL_FOG_COLOR, fogColor);        // Óñòàíàâëèâàåì öâåò òóìàíà
glFogf(GL_FOG_DENSITY, 0.35f);          // Íàñêîëüêî ãóñòûì áóäåò òóìàí
glHint(GL_FOG_HINT, GL_NICEST);      // Âñïîìîãàòåëüíàÿ óñòàíîâêà òóìàíà
glFogf(GL_FOG_START, 6.5f);             // Ãëóáèíà, ñ êîòîðîé íà÷èíàåòñÿ òóìàí
glFogf(GL_FOG_END, 9.5f);               // Ãëóáèíà, ãäå òóìàí çàêàí÷èâàåòñÿ.



}
void box(){
glBindTexture(GL_TEXTURE_2D, texture[1]);
 glBegin(GL_QUADS);

                // Ïåðåäíÿÿ ãðàíü
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Âåðõ ëåâî
    glEnd();

glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);
                // Çàäíÿÿ ãðàíü
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Íèç ëåâî
    glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);                // Âåðõíÿÿ ãðàíü
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Âåðõ ïðàâî
    
    glEnd();
    glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);// Íèæíÿÿ ãðàíü
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Íèç ïðàâî

                // Ïðàâàÿ ãðàíü
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);    // Âåðõ ëåâî
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);    // Íèç ëåâî
glEnd();
    glBindTexture(GL_TEXTURE_2D, texture[1]);
     glBegin(GL_QUADS);// Íèæíÿÿ ãðàíü
                // Ëåâàÿ ãðàíü
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);    // Íèç ëåâî
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);    // Íèç ïðàâî
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);    // Âåðõ ïðàâî
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);    // Âåðõ ëåâî

glEnd();
}


void drawBox(){

/////////////
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,GLfloat (resolutWIDTH)/GLfloat(resolutHEIGHT),0.01f,100.0f);
//MessageBox(hw,"ttt","ttt",0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPopMatrix();
     glPushMatrix();
     glTranslatef(0.0f,0.0f,posz);
    
     glRotatef(ang,1.0f,1.0f,1.0f);
     
     glColor3d(0.5, 0.5, 0.0);
    box();
    
glPopMatrix();
switch(st){
case 1:posz-=0.0035f;
        if (posz<-11.0f ){st=2;}
        ang+=0.5; break;
case 2:posz+=0.0035f;
        if (posz>0.0f ){st=1;}
        ang-=0.5; break;

    }    
//////////////////

}


void drawOrtho(){
GLfloat asp;
asp=resolutWIDTH/resolutHEIGHT;
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (resolutWIDTH<resolutHEIGHT){

glOrtho(-100.0f,100.0f,-100/asp,100/asp,1.0,-1.0);
} else glOrtho(-100.0*asp,100.0*asp,-100,100,1.0,-1.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPopMatrix();
static float x;
static float y;
static stx=1;
static sty=1;
glPushMatrix();

glColor3d(1, 1, 0);
glTranslatef(x,y,-1.0f);
glBegin(GL_QUADS);
    glVertex2i(10, 10);
    glVertex2i(100, 10);
    glVertex2i(100, 700);
    glVertex2i(10, 700);
glEnd();

glPopMatrix();
switch(stx){
case 1:x-=0.1;
if (x<-100.0f ){stx=2;}
break;

case 2:
x+=0.1;
if (x>100.0f ){stx=1;}
break;
};

switch(sty){
case 1:y-=0.5;
if (y<-100.0f ){sty=2;}
break;

case 2:
y+=0.5;
if (y>100.0f ){sty=1;}
break;
};

}

void RenderScene(void){
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     
     drawBox();
     drawOrtho();
glutSwapBuffers();
glutPostRedisplay();    
}

void changeSize(GLsizei w,GLsizei h){
resolutWIDTH=w ;
resolutHEIGHT = h;
    GLfloat asp;

    if (h==0) h=1;

glViewport(0,0,w,h);
asp= GLfloat (w)/GLfloat (h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,asp,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

void  main(void)
{
    HWND hdwind = GetDesktopWindow();
    HDC hdescDc = GetDC(hdwind);
    resolutWIDTH=GetDeviceCaps(hdescDc,HORZRES); 
    resolutHEIGHT = GetDeviceCaps(hdescDc,VERTRES);
    int xx= (resolutWIDTH/2)-400;
    int yy= (resolutHEIGHT/2)-300;

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |GLUT_DEPTH);
    glutInitWindowSize(800,600);
    glutInitWindowPosition(xx,yy);
    
    glutCreateWindow("VSL_Game studio");
    //glutFullScreen();
    glutReshapeFunc(changeSize);
    glutDisplayFunc(RenderScene);
    SetupRC();
    glutMainLoop();
    
}




Просто скопируй этот код! Работает как часы smile 

Автор: KaraKum 19.3.2008, 14:39
(только щас заметил, что появилась вторая страница на теме  smile )
Скомпилировал... шикарно! Особенно туман. smile 

Нашёл проблему. Прежде я просто вызывал функцию glOrtho(), а надо:
Код

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 1024, 768, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//ну и код рисования:
glColor3ub(255, 0, 0);
glBegin(GL_QUADS);
     glVertex2i(600, 10);
     glVertex2i(1000, 10);
     glVertex2i(1000, 300);
     glVertex2i(600, 300);
glEnd();

И теперь всё рисуется, и по координатам экрана - так будто в 2D.
Но снова проблема в том, что иногда этот нарисованный квадрат перекрывается другими объектами, если они располагаются к наблюдателю ближе, чем задано в функции glOrtho().

Вот .exe - файл. Перемащаться на стрелки и PageUp/PageDown, а вращаться на NUMPAD клавишами 8 и 2, 4 и 6, Insert и Delete.
Если подобраться к вращающемуся треугольнику или чайнику, то нарисованный через glOrtho() квадрат будет время от времени перекрываться.

P.S. Что означает "VSL_Game studio"?

Автор: Graf_h 19.3.2008, 15:59
когда рисуеш в плоскости:
glTranslatef(x,y,-1.0f);
Я же тебе пример отправил! там никогда box не перекроет твой квадрат! box выходит за пределы области видимости но не перекрывает квадрат в плоскости! Внимательно посмотри! Будут вопросы обращайся  smile 


Цитата(KaraKum @  19.3.2008,  14:39 Найти цитируемый пост)
P.S. Что означает "VSL_Game studio"?

Это название нашей команды  smile 

Автор: KaraKum 20.3.2008, 09:50
Работает! Как по заказу!  smile 

Цитата

Это название нашей команды

Гордо звучит. Вот бы так, чтобы на мировом рынке производителей игр фигурировали как главные конкуренты несколько русских компаний и "VSL_Game studio" в том числе  smile .

Вобщем, большое спасибо за помощь. Теперь все технические вопросы решены - осталось только программировать.

Вопрос помечен как решённый.

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