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 |
|
| | |
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; надо заменить на
|
|
| |
ezhickovich | Дата: Воскресенье, 06 Февраля 2011, 17:36 | Сообщение # 9 |
[Великий и могучий хозяинъ]
Сейчас нет на сайте
| я не понял, зачем нужны x, y, z??? (сдвиг в локальных координитах?) почему не сохраняешь матрицу перед изменением? вообще ГЛбегин/ГЛенд - жутко тормозная фигня (в нормальном проекте ты их не встретишь)... юзай VBO...Добавлено (06.02.2011, 17:36) ---------------------------------------------
Quote (thitem) int random=rand()%1+0; ЗЫ: Остаток от деления на единицу будет всегда равен единице... Следовательно таким образом можно получить 0 или 0...
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
|
|
| |
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; Да, но это потом, ты для начала хоть с этим ужасом разберись...
Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
Сообщение отредактировал 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 |
|
| |
|