Понедельник, 23 Декабря 2024, 04:25

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Картинка исчезает когда доходит до края экрана
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 + в линуксе.

Сочетание греет душу B)

Так ты значит пока что сурфейсами на экран выводишь, без рендерера?
Искажение происходит постоянно/во время анимации (вращения)/ или когда рулетка останавливается?
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, а, всё, разобрался.

  • Страница 1 из 1
  • 1
Поиск:

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