Среда, 18 Декабря 2024, 11:15

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
C++ Проблема с генератором уровней
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 15:27 | Сообщение # 1
частый гость
Сейчас нет на сайте
я написал генератор уровней (кубиками)

вот код

Code
    int bZL = 0;
   if(first==true)
   {
    for (int bXL = 0; bXL < 32; ++bXL)
    {
     for (int bYL = 0; bYL < 512; ++bYL)
     {
      if(bYL<<230){block_pos[bXL][bYL][bZL]=1;}
      if(bYL>>240&&bYL<<242)
      {
       int random=rand()%1+0;
       if(random==1)
       {block_pos[bXL][bYL][bZL]=1;}

       if(random==0)
       {block_pos[bXL][bYL][bZL]=0;}
      }
     }

     if(bXL==32)
     {
      bXL=0;
      ++bZL;
     }
    }
    first=false;
   }

рендер уровня происходит по такому же принцыпу

вот код

Code
  bZL = 0;

    for (int bXL = 0; bXL < 32; ++bXL)
    {
     for (int bYL = 0; bYL < 512; ++bYL)
     {
      if(block_pos[bXL][bYL][bZL]==1)
      {
        draw_cube(  bXL, bYL, bZL,
           1,   
           xtrans, ytrans, ztrans,
           lookupdown, sceneroty);
      }
        
     }

     if(bXL==32)
     {
      bXL=0;
      ++bZL;
     }
    }

draw_cube - функция рисования куба

управление клавой (мышь сам писал) взято из 10-того урока NeHe

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

Code
  draw_cube(  0, 0, 0,
       1,   
       xtrans, ytrans, ztrans,
       lookupdown, sceneroty);

то в позиции [0,0,0] создается куб
если кто-то разберется в моём коде то он гений или я очень 'просто' пишу код

заранее спасибо





Сообщение отредактировал ProFiLeR - Воскресенье, 06 Февраля 2011, 15:27
thitemДата: Воскресенье, 06 Февраля 2011, 15:53 | Сообщение # 2
частый гость
Сейчас нет на сайте
Расскажи подробнее про функцию draw_cube, какие она параметры принимает? Первые три значения - это координаты для куба? (если так, то при передачи параметров b*L нужно умножать их на длину стороны куба) И по возможности покажи ее код.
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 16:23 | Сообщение # 3
частый гость
Сейчас нет на сайте
Code
void draw_cube(GLfloat x,GLfloat y,GLfloat z,GLfloat h,GLfloat xtrans,GLfloat ytrans,GLfloat ztrans,GLfloat lookupdown,GLfloat sceneroty)
{
  glRotatef(lookupdown,1.0f,0,0);
  glRotatef(sceneroty,0,1.0f,0);
  glTranslatef(xtrans, ytrans, ztrans);
  glBindTexture(GL_TEXTURE_2D, texture[1]);
     glColor4f(255,255,255,1.0);

  glBegin(GL_QUADS);                      // Рисуем куб

         glTexCoord2f(0.0f, 0.0f); glVertex3f(x+h,      y+h,      z+(-h));          // Право верх квадрата (Верх)
         glTexCoord2f(h, 0.0f);    glVertex3f(x+(-h),   y+h,      z+(-h));          // Лево верх
         glTexCoord2f(h, h);       glVertex3f(x+(-h),   y+h,      z+h);          // Лево низ
         glTexCoord2f(0.0f, h);    glVertex3f(x+h,      y+h,      z+h);          // Право низ

         glTexCoord2f(h, 0.0f);    glVertex3f(x+h,      y+(-h),   z+h);          // Верх право квадрата (Низ)
         glTexCoord2f(h, h);       glVertex3f(x+(-h),   y+(-h),   z+h);          // Верх лево
         glTexCoord2f(0.0f, h);    glVertex3f(x+(-h),   y+(-h),   z+(-h));          // Низ лево
         glTexCoord2f(0.0f, 0.0f); glVertex3f(x+h,      y+(-h),   z+(-h));          // Низ право

         glTexCoord2f(0.0f, h);    glVertex3f(x+h,      y+h,      z+h);          // Верх право квадрата (Перед)
         glTexCoord2f(0.0f, 0.0f); glVertex3f(x+(-h),   y+h,      z+h);          // Верх лево
         glTexCoord2f(h, 0.0f);    glVertex3f(x+(-h),   y+(-h),   z+h);          // Низ лево
         glTexCoord2f(h, h);       glVertex3f(x+h,      y+(-h),   z+h);          // Низ право

         glTexCoord2f(h, h);       glVertex3f(x+h,      y+(-h),   z+(-h));          // Верх право квадрата (Зад)
         glTexCoord2f(0.0f, h);    glVertex3f(x+(-h),   y+(-h),   z+(-h));          // Верх лево
         glTexCoord2f(0.0f, 0.0f); glVertex3f(x+(-h),   y+h,      z+(-h));          // Низ лево
         glTexCoord2f(h, 0.0f);    glVertex3f(x+h,      y+h,      z+(-h));          // Низ право

         glTexCoord2f(h, 0.0f);    glVertex3f(x+(-h),   y+h,      z+h);          // Верх право квадрата (Лево)
         glTexCoord2f(h, h);       glVertex3f(x+(-h),   y+h,      z+(-h));          // Верх лево
         glTexCoord2f(0.0f, h);    glVertex3f(x+(-h),   y+(-h),   z+(-h));          // Низ лево
         glTexCoord2f(0.0f, 0.0f); glVertex3f(x+(-h),   y+(-h),   z+h);          // Низ право

         glTexCoord2f(0.0f, 0.0f); glVertex3f(x+h,      y+h,      z+(-h));          // Верх право квадрата (Право)
         glTexCoord2f(h, 0.0f);    glVertex3f(x+h,      y+h,      z+h);          // Верх лево
         glTexCoord2f(h, h);       glVertex3f(x+h,      y+(-h),   z+h);          // Низ лево
         glTexCoord2f(0.0f, h);    glVertex3f(x+h,      y+(-h),   z+(-h));          // Низ право
  glEnd();                    // Закончили квадраты

}





Сообщение отредактировал ProFiLeR - Воскресенье, 06 Февраля 2011, 16:23
thitemДата: Воскресенье, 06 Февраля 2011, 16:36 | Сообщение # 4
частый гость
Сейчас нет на сайте
Попробуй вызывать эту функцию так:
Code
draw_cube(  0, 0, 0,   
             0.5,     
             bXL, bYL, bZL,   
             lookupdown, sceneroty);


Сообщение отредактировал thitem - Воскресенье, 06 Февраля 2011, 16:38
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 17:04 | Сообщение # 5
частый гость
Сейчас нет на сайте
неа, не работает


thitemДата: Воскресенье, 06 Февраля 2011, 17:09 | Сообщение # 6
частый гость
Сейчас нет на сайте
Т.е. вообще ничего не рендерится, или рендерится неправильно?

Если рендерится неправильно, то надо еще перед вызовом этой функции отправлять матрицы в стек (glPush вроде, точно не помню), а после выполнения функции возвращать (glPop).

ProFiLeRДата: Воскресенье, 06 Февраля 2011, 17:26 | Сообщение # 7
частый гость
Сейчас нет на сайте
нет, самих кубиков не наблюдается хотя если просто поставить куб в позицию
Code
       draw_cube(  10, 15, 1,
                     50,
                     xtrans, ytrans, ztrans,
                     lookupdown, sceneroty);

то этот куб рендерится

получается в моей функции спасибо xtrans, ytrans, ztrans, исспользуются глобальные координаты а не локальные

Добавлено (06.02.2011, 17:26)
---------------------------------------------
если же вместо

Code
       draw_cube(  10, 15, 1,  
                      50,  
                      xtrans, ytrans, ztrans,  
                      lookupdown, sceneroty);

написать

Code
       draw_cube(  10, 15, 1,  
                      50,  
                      0, 0, 0,  
                      lookupdown, sceneroty);

то это будут локальные координаты





Сообщение отредактировал ProFiLeR - Воскресенье, 06 Февраля 2011, 17:23
thitemДата: Воскресенье, 06 Февраля 2011, 17:32 | Сообщение # 8
частый гость
Сейчас нет на сайте
Кажется я понял в чем дело. Это даже смешно:
Code
int random=rand()%1+0;

надо заменить на
Code
int random=rand()%2;
ezhickovichДата: Воскресенье, 06 Февраля 2011, 17:36 | Сообщение # 9
[Великий и могучий хозяинъ]
Сейчас нет на сайте
я не понял, зачем нужны x, y, z??? (сдвиг в локальных координитах?)
почему не сохраняешь матрицу перед изменением?
вообще ГЛбегин/ГЛенд - жутко тормозная фигня (в нормальном проекте ты их не встретишь)... юзай VBO...

Добавлено (06.02.2011, 17:36)
---------------------------------------------

Quote (thitem)
int random=rand()%1+0;

ЗЫ: Остаток от деления на единицу будет всегда равен единице...
Следовательно таким образом можно получить 0 или 0... smile



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 17:43 | Сообщение # 10
частый гость
Сейчас нет на сайте
эм... int random=1; тоже не помогло

VBO???

Добавлено (06.02.2011, 17:43)
---------------------------------------------
pushmatrix и pop тоже не помогли



ezhickovichДата: Воскресенье, 06 Февраля 2011, 17:46 | Сообщение # 11
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (ProFiLeR)
int random=1;

Quote (thitem)
int random=rand()%2;

Quote (ProFiLeR)
VBO???

Да, но это потом, ты для начала хоть с этим ужасом разберись...



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!


Сообщение отредактировал ezhickovich - Воскресенье, 06 Февраля 2011, 17:46
thitemДата: Воскресенье, 06 Февраля 2011, 17:48 | Сообщение # 12
частый гость
Сейчас нет на сайте
Code
      if(bYL<<230){block_pos[bXL][bYL][bZL]=1;}   
        if(bYL>>240&&bYL<<242)

Эти условия всегда false, т.к. при таком количестве двоичных сдвигов получится 0.


Сообщение отредактировал thitem - Воскресенье, 06 Февраля 2011, 17:48
ezhickovichДата: Воскресенье, 06 Февраля 2011, 17:50 | Сообщение # 13
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Ну возможно имелся в виду не сдвиг, а сравение... (очепятка... КЭП...)


Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 17:59 | Сообщение # 14
частый гость
Сейчас нет на сайте
Quote (ezhickovich)
сравение.

да я имелл ввиду сравнение

VBO???="что такое VBO ???";

Добавлено (06.02.2011, 17:59)
---------------------------------------------
ДААААААААААААААААААААААААААААААААААА ЗАРАБОТАЛО ТАКИ БЫЛА ОПЕЧАТКА В СРАВНЕНИИ



thitemДата: Воскресенье, 06 Февраля 2011, 18:01 | Сообщение # 15
частый гость
Сейчас нет на сайте
Quote (ProFiLeR)
что такое VBO ???

Вершинные буферы

Quote (ProFiLeR)
ДААААААААААААААААААААААААААААААААААА ЗАРАБОТАЛО ТАКИ БЫЛА ОПЕЧАТКА В СРАВНЕНИИ

Ну наконец-таки


Сообщение отредактировал thitem - Воскресенье, 06 Февраля 2011, 18:02
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 18:02 | Сообщение # 16
частый гость
Сейчас нет на сайте
Quote (thitem)
Исправил? Работает?

ДААААААААААААААААААААААААААААААААААА ЗАРАБОТАЛО ТАКИ БЫЛА ОПЕЧАТКА В СРАВНЕНИИ

да но теперь он все по координате Z не ставит на нужное место жп полная =)





Сообщение отредактировал ProFiLeR - Воскресенье, 06 Февраля 2011, 18:03
ezhickovichДата: Воскресенье, 06 Февраля 2011, 18:19 | Сообщение # 17
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (ProFiLeR)
что такое VBO ???

Гугл???
ЗЫ: Походу ты думаешь, что Z - высота...
ЗЫЫ: Z - глубина... (скорее всего ты имел в виду Y)



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 19:20 | Сообщение # 18
частый гость
Сейчас нет на сайте
нет все правильно я просто алгоритм неправильно написал

Добавлено (06.02.2011, 19:20)
---------------------------------------------
дааам лагает ужас, 254288 кубов рендерит по 6 сторон





Сообщение отредактировал ProFiLeR - Воскресенье, 06 Февраля 2011, 19:21
ezhickovichДата: Воскресенье, 06 Февраля 2011, 19:29 | Сообщение # 19
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Quote (ProFiLeR)
дааам лагает ужас, 254288 кубов рендерит по 6 сторон

ЗЫ: Ну дык ты сам их рендеришь, да ещё и самым медленным способом...



Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
ProFiLeRДата: Воскресенье, 06 Февраля 2011, 20:06 | Сообщение # 20
частый гость
Сейчас нет на сайте
да, надо прятать грани, не билдить если по бокам блоки, но это завтра

Добавлено (06.02.2011, 20:06)
---------------------------------------------
Код создания:

Code
    int bXL = 0;
    int bYL = 0;
    int bZL = 0;

    if(first==true)
    {
     do
     {
      if( bYL < 512 )
      {
       if(bYL<230){block_pos[bXL][bYL][bZL]=1;}
       if(bYL>240&&bYL<242)
       {
        int random=1;//rand()%1+0;
        if(random==1)
        {block_pos[bXL][bYL][bZL]=1;}

        if(random==0)
        {block_pos[bXL][bYL][bZL]=0;}
       }
       bYL++;
       if(bXL==32){bXL=0;bZL++;}
       if(bYL==512){bYL=0;bXL++;}

      }
     }while(bZL!=32);
     first=false;
    }

Код рендера:

Code
  bXL = 0;
     bYL = 0;
     bZL = 0;
     do
     {
      if( bYL < 512 )
      {
       if(block_pos[bXL][bYL][bZL]==1)
       {
        if(
         ((bXL==0)&&(block_pos[bXL+1][bYL][bZL]!=1))
         &&
         ((bXL!=0)&&(block_pos[bXL-1][bYL][bZL]!=1))
         &&
         ((bYL==0)&&(block_pos[bXL][bYL+1][bZL]!=1))
         &&
         ((bYL!=0)&&(block_pos[bXL][bYL-1][bZL]!=1))
         &&
         ((bZL==0)&&(block_pos[bXL][bYL][bZL+1]!=1))
         &&
         ((bZL!=0)&&(block_pos[bXL][bYL][bZL-1]!=1))
         )
        {
         draw_cube(  bXL, bYL, bZL,
            0.5,
            xtrans, ytrans, ztrans,
            lookupdown, sceneroty);
        }
       }
       bYL++;
       if(bXL==32){bXL=0;bZL++;}
      }
      if(bYL==32){bYL=0;bXL++;}
     }while(bZL!=32);

теперь ничего не рендерится
помогите за плюсик =)





Сообщение отредактировал ProFiLeR - Воскресенье, 06 Февраля 2011, 20:07
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг