Картинка исчезает когда доходит до края экрана
| |
afq | Дата: Пятница, 09 Ноября 2018, 19:14 | Сообщение # 1 |
Разработчик
Сейчас нет на сайте
| Я пока ещё текстурами не рисовал, попробую сначала такую сделать, а потом и текстурами заморочусь, когда игра будет играбельна. Вот проблема.
Код for ( int i = 0; i < MAX_SPRITES; i++ ) { //if ( ( s1[i].get_y() <= screen_height ) && ( s1[i].get_y() > -512 ) ) s1[i].render ( ); s1[i].render(); } for ( int i = 0; i < MAX_SPRITES; i++ ) { if ( s2[i].get_y() <= screen_height && s2[i].get_y() > -512 ) s2[i].render ( ); }
Я привел фрагмент кода, в первом ряду я закоментировал строку, и написал рендерить все картинки в столбце. Второй ряд, и все остальные доходя до края экрана, то есть до y = 0 координат, картинка исчезает, хотя у меня написано, чтобы рисовалось если по y координате больше -512 ( но 512 это я замахнулся, когда подумал что может что-то не так с размером, а так надо -256 ).
Вот скрин, я убрал все остальное и оставил только картинки. По ней видно, что первый столбец рисуется, а остальные нет внизу.
|
|
| |
DivES | Дата: Пятница, 09 Ноября 2018, 21:32 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| afq, крайне странный вопрос для человека, который создавал утилиту работы с графическими изображениями... Должно быть:
Код for (int i = 0; i< MAX_SPRT_HEIGHT; i++) for (int j = 0; j< MAX_SPRT_WIDTH; j++) sprites[i][j].render() Где sprites - массив значений спрайтов. А render() в зависимости от значения рендерит нужное изображение. Навожу на мысль
Добавлено (09 Ноября 2018, 21:38) --------------------------------------------- То есть, допустим, ты хранишь значения картинок в виде чисел. Где 0 - грибочек, 1 - шишечка, 2 - красная ягодка, а 3 - фиолетовая. Тогда render() будет работать по типу:
Код switch (value) { case(0): рисуем грибочек; case(1): рисуем шишечку; ... }
Сообщение отредактировал DivES - Пятница, 09 Ноября 2018, 21:38 |
|
| |
afq | Дата: Пятница, 09 Ноября 2018, 21:45 | Сообщение # 3 |
Разработчик
Сейчас нет на сайте
| DivES, у меня уже сделано так как есть, можно конечно переделать, но оно и так работает, и функции другие уже под них подстроены. Да помогло, прям в render сделал проверку на y < -256 return, и всё работает, спасибо. Но всё равно не понятно, почему, ведь логично же
Код if ( s1[i].get_y() <= screen_height && s1[i].get_y() > -256 ) s1[i].render ( );
Нет ведь ошибок, почему не рисует не пойму.Добавлено (09 Ноября 2018, 21:47) --------------------------------------------- DivES, а у меня рендер не так устроен, а в каждом спрайте храниться рисунок. А так я как ты написал даже не подумал, спасибо.
|
|
| |
DivES | Дата: Пятница, 09 Ноября 2018, 21:52 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Цитата afq ( ) можно конечно переделать, но оно и так работает Если так говорить, то никогда не станешь программистом)
|
|
| |
afq | Дата: Пятница, 09 Ноября 2018, 22:00 | Сообщение # 5 |
Разработчик
Сейчас нет на сайте
| DivES, если запихнуть все спрайты в sprites[y][x], то можно будет сразу по горизонтали 6 картинок выводить. Добавлено (09 Ноября 2018, 22:02) --------------------------------------------- DivES, поменял на это, так быстрее будет, чем двумерный массив.
Код for ( int i = 0; i < MAX_SPRITES; i++ ) { s1[i].render ( ); s2[i].render ( ); s3[i].render ( ); s4[i].render ( ); s5[i].render ( ); s6[i].render ( ); }
Добавлено (09 Ноября 2018, 22:19) --------------------------------------------- DivES, на видео не видно, но без записи видно какое то искажение экрана, может ты знаешь что это?
|
|
| |
DivES | Дата: Пятница, 09 Ноября 2018, 22:21 | Сообщение # 6 |
заслуженный участник
Сейчас нет на сайте
| afq, искажение то, что на скриншоте в первом сообщении темы? С какой графической библиотекой работаешь?
|
|
| |
afq | Дата: Пятница, 09 Ноября 2018, 22:25 | Сообщение # 7 |
Разработчик
Сейчас нет на сайте
| DivES, sdl2 + opengl в линуксе. Добавлено (09 Ноября 2018, 22:27) --------------------------------------------- DivES, да, как искажение на картинке.
|
|
| |
DivES | Дата: Пятница, 09 Ноября 2018, 22:32 | Сообщение # 8 |
заслуженный участник
Сейчас нет на сайте
| Цитата afq ( ) sdl2 + в линуксе. Сочетание греет душу
Так ты значит пока что сурфейсами на экран выводишь, без рендерера? Искажение происходит постоянно/во время анимации (вращения)/ или когда рулетка останавливается?
|
|
| |
afq | Дата: Пятница, 09 Ноября 2018, 22:46 | Сообщение # 9 |
Разработчик
Сейчас нет на сайте
| DivES, у меня есть вариант кода, только без этой игры на шейдерах, но на сишке написан. Эту основу я на c++ писал, здесь я вывожу вершины с помощью glVertexPointer а цвета glColorPointer. Искажение происходит только при анимации. Такое же искажение может происходить при просмотре фильма высокого качества. Если бы я в windows это сделал, то скорее всего такого бы искажения не было бы. Вот если в nvidia настройках отключить "Sync to VBlank", то искажений нет, но картинка не так плавно движется тогда.
|
|
| |
DivES | Дата: Пятница, 09 Ноября 2018, 22:51 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| afq, а. Ну так это популярная проблема для Linux. "Tearing" называется, можешь поискать конкретно для своей видеокарты. У меня аналогичная проблема была, т.к. на ноутбуке две видеокарты установлено и... в общем, некорректно работали. Так что это не в коде проблема
|
|
| |
afq | Дата: Суббота, 10 Ноября 2018, 01:59 | Сообщение # 11 |
Разработчик
Сейчас нет на сайте
| DivES, Цитата Если так говорить, то никогда не станешь программистом) Ну учитывая то, что у меня нет даже образования, то я точно никогда не стану программистом.
Цитата Так ты значит пока что сурфейсами на экран выводишь, без рендерера? Вывожу средствами opengl.Добавлено (10 Ноября 2018, 04:39) --------------------------------------------- DivES, решил сделать отдельный проект, но только с текстурами, и вот проблема, я думал что текстура будет сжиматься до определенного размера, а вышло что не так. Вот может я неправильно что в коде указал, но рисуется вот так.
Установил glOrtho
Код glOrtho ( 0.0f, 1.0, 0.0 /*screen_height*/, 1.0 /*0.0f*/, 0.0f, 1.0f );
Также оптимизировал для текстуры код.
Код #include "Sprite.hpp"
Sprite::Sprite ( long pos ) { //init_texture ( ); }
Sprite::Sprite ( ) { }
void Sprite::free_data ( ) { // if ( texture ) free ( texture ); if ( vertices ) free ( vertices ); if ( pixels ) free ( pixels ); } void Sprite::load ( long pos ) { offset = pos; std::FILE *fd = std::fopen ( "data", "r" ); if ( !fd ) { std::perror ( "sprite load" ); exit ( EXIT_FAILURE ); }
int ret; ret = std::fseek ( fd, pos, SEEK_SET ); if ( ret == -1 ) { perror ( "fseek\n" ); }
ret = std::fread ( &width, sizeof ( unsigned int ), 1, fd ); if ( ret == -1 ) { perror ( "width\n" ); } ret = std::fread ( &height, sizeof ( unsigned int ), 1, fd ); if ( ret == -1 ) { perror ( "heigth\n" ); } ret = std::fread ( &max_pixels, sizeof ( unsigned int ), 1, fd ); if ( ret == -1 ) { perror ( "max_pixels\n" ); }
pixels = new unsigned char [ max_pixels ]; if ( !pixels ) { printf (" !@!\n" ); }
ret = std::fread ( &pixels[0] , sizeof ( unsigned char ), max_pixels, fd ); if ( ret == -1 ) { perror ( "pixels\n" ); } std::fclose ( fd );
glGenTextures ( 1, &tex ); glBindTexture ( GL_TEXTURE_2D, tex ); #if 1 glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER ); glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER ); #endif // gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels );
glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels ); glEnable ( GL_TEXTURE_2D );
max_draw = height * width; vertices = new float [ 3 * 2 ]; vertices[0] = 0.0f; vertices[1] = 0.3f; vertices[2] = 0.3f; vertices[3] = 0.0f; vertices[4] = 0.3f; vertices[5] = 0.3f; } void Sprite::render ( ) { #if 1 if ( y > 1.0 ) return; if ( y < -0.3 ) return; #endif
glBindTexture ( GL_TEXTURE_2D, tex ); glPushMatrix ( );
#if 0 glFrontFace ( GL_CCW ); glEnable ( GL_CULL_FACE ); glCullFace ( GL_BACK ); #endif
glTranslatef ( this->x, this->y, 0 );
glEnableClientState ( GL_VERTEX_ARRAY ); glEnableClientState ( GL_TEXTURE_COORD_ARRAY );
glVertexPointer ( 2, GL_FLOAT, 0, vertices ); glTexCoordPointer ( 2, GL_FLOAT, 0, vertices ); glDrawArrays ( GL_TRIANGLES, 0, 6 );
glDisableClientState ( GL_VERTEX_ARRAY ); glDisableClientState ( GL_TEXTURE_COORD_ARRAY );
// glDisable ( GL_CULL_FACE ); // glTranslatef ( 0, 0, -10 );
glPopMatrix ( );
glFlush ( ); }
int Sprite::get_width ( ) { return width; }
int Sprite::get_height ( ) { return height; }
int Sprite::get_x ( ) { return x; }
int Sprite::get_y ( ) { return y; }
void Sprite::set_pos ( int x, int y ) { this->x = x; this->y = y; }
void Sprite::slice ( int width, int height ) { }
int Sprite::get_max_frames ( ) { return max_frames; }
Добавлено (11 Ноября 2018, 02:33) --------------------------------------------- DivES, а, всё, разобрался.
|
|
| |
|