LINUX.ORG.RU

Не отображается один спрайт

 ,


0

1

Хотел сделать игру, но есть ошибки, которые я не могу исправить. Все основные действия происходят в engine/Game.cpp. Вот пример.


        Sprite *s1 = new Sprite [MAX_SPRITES];
#if 1
        Sprite *s2 = new Sprite [MAX_SPRITES];
        Sprite *s3 = new Sprite [MAX_SPRITES];
        Sprite *s4 = new Sprite [MAX_SPRITES];
        Sprite *s5 = new Sprite [MAX_SPRITES];
#endif
#if 1
        Sprite *background = new Sprite ( );
        background->load ( 262156 );
        background->set_pos ( 0.0, 0.0 );
        background->set_size ( 1.0, 1.0 );
Все Sprite *s[1-5] отображаются нормально, а вот background не отображается, хотя для него параметры такие же, как и для других. Потом если долго нажимать на пробел, то мимо проскакивают очень большие текстуры, хотя как такое может быть. Перед тем, как начать новую игру, все текстуры освобождаются и загружаются новые.
        for ( int i = 0; i < 3; i++ ) {
                s[i].free_data ( );
        }
        s[0].load ( s[MAX_SPRITES - 3].offset );
        s[0].set_pos ( s[MAX_SPRITES - 3].get_x(), s[MAX_SPRITES - 3].get_y() );
        s[1].load ( s[MAX_SPRITES - 2].offset );
        s[1].set_pos ( s[MAX_SPRITES -2].get_x(), s[MAX_SPRITES - 2].get_y() );
        s[2].load ( s[MAX_SPRITES - 1].offset );
        s[2].set_pos ( s[MAX_SPRITES - 1].get_x(), s[MAX_SPRITES - 1].get_y() );

        for ( int i = 3; i < MAX_SPRITES; i++ ) {
                s[i].free_data ();
        }
В файле Sprite.cpp происходит загружка данных из файла и загрузка текстуры, другие файлы *.cpp не используются почти. Вот ссылка ссылка

Все основные действия происходят в engine/Game.cpp

God object — очень плоха музыка.


        Sprite *s1 = new Sprite [MAX_SPRITES];
#if 1
        Sprite *s2 = new Sprite [MAX_SPRITES];
        Sprite *s3 = new Sprite [MAX_SPRITES];
        Sprite *s4 = new Sprite [MAX_SPRITES];
        Sprite *s5 = new Sprite [MAX_SPRITES];
#endif
#if 1

Что это?

Без кода что-то посоветовать довольно сложно. Только вот

другие файлы *.cpp не используются почти

навевает подозрения

XMs ★★★★ ()
Ответ на: комментарий от ghost_of_the_west

.Engine.hpp.swp
.Game.cpp.swp

Тебя не учили не класть мусор в репозиторий?


Game.hpp

extern "C" {

class Game {
	public:
		Game ( );
		void loop ( );
		std::list<Sprite*> wsprites;
	private:
		SDL_Window *window;
		unsigned int screen_width;
		unsigned int screen_height;
};
}

Можешь пояснить смысл сего творения?


SDL_Init ( SDL_INIT_TIMER | SDL_INIT_VIDEO | SDL_INIT_EVENTS );
glViewport ( 0, 0, screen_width, screen_height );

Я не знаком с SDL, но мне кажется, что там нет нужды в прямых вызовах OpenGL.


Признаться честно, даже наличие кода не помогло приблизиться к пониманию, что и зачем там происходит. Начнём с малого: что такое s[1-5]?

XMs ★★★★ ()
Ответ на: комментарий от XMs

s[1-5]

Это

        Sprite *s1 = new Sprite [MAX_SPRITES];
        Sprite *s2 = new Sprite [MAX_SPRITES];
        Sprite *s3 = new Sprite [MAX_SPRITES];
        Sprite *s4 = new Sprite [MAX_SPRITES];
        Sprite *s5 = new Sprite [MAX_SPRITES];
Я использую sdl + opengl. Opengl нужен, чтобы можно было прочитать данные из файла data и предоставить это в таком виде, чтобы можно было отобразить на экране. В файле data находятся несколько рисунков. Они извлекаются по смещениям. Информация о смещениях хранится в файле log. Также с помощью opengl можно отображать изображения так, чтобы на всех экранах было одинаковое изображение, а в sdl так нельзя. Я даже уже немного шейдеры изучил и линейную алгебру, чтобы соответствовать opengl 3.0 и 4.0, В плане перемещения по экрану, но повороты пока не осилил, но в либе одной c++, всё есть. Можно и без линейной алгебры обойтись, если есть либа, которая ( я забыл как она называется ), потому что код немного старый.

ghost_of_the_west ()
Ответ на: комментарий от ghost_of_the_west

s[1-5]

Это

        Sprite *s1 = new Sprite [MAX_SPRITES];
        Sprite *s2 = new Sprite [MAX_SPRITES];
        Sprite *s3 = new Sprite [MAX_SPRITES];
        Sprite *s4 = new Sprite [MAX_SPRITES];
        Sprite *s5 = new Sprite [MAX_SPRITES];

Где это объявляется, я знаю. Ты лучше поведай, зачем оно нужно в таком виде. Тут прямо напрашивается декомпозиция. Почитай, что я писал товарищу, который делал примерно то же, что и ты

XMs ★★★★ ()
Ответ на: комментарий от ghost_of_the_west

wsprites не нужно, это с другого проекта осталось

Ага. Хорошо. А по остальному? У меня этот кусок столько вопросов вызвал, что я даже не знаю, с чего начать

XMs ★★★★ ()
Ответ на: комментарий от XMs

Game ( ) конструктор, в котором инициализируется sdl. Происходят настройки экрана. Получается opengl контекст.
void loop ( ); здесь происходит основной цикл игры.
SDL_Window *window; указатель на window, это sdl.
unsigned int screen_width; размеры экран
unsigned int screen_height; размеры экрана

        Sprite *s1 = new Sprite [MAX_SPRITES];
        Sprite *s2 = new Sprite [MAX_SPRITES];
        Sprite *s3 = new Sprite [MAX_SPRITES];
        Sprite *s4 = new Sprite [MAX_SPRITES];
        Sprite *s5 = new Sprite [MAX_SPRITES];

Это объявляется каждый столбец. Всего пять столбцов. Так проще управлять.

        for ( int i = 0; i < MAX_SPRITES; i++ ) {
                s1[i].set_size ( 0.15, 0.2 );
                s2[i].set_size ( 0.15, 0.2 );
                s3[i].set_size ( 0.15, 0.2 );
                s4[i].set_size ( 0.15, 0.2 );
                s5[i].set_size ( 0.15, 0.2 );
        }
Для каждого столбца для всех изображений устанавливается размер.
        place ( &s1[0], 0, 0.15, 0.15 );
        place ( &s2[0], 0, 0.15, 0.15 + 0.15 );
        place ( &s3[0], 0, 0.15, 0.15 + 0.15 + 0.15 );
        place ( &s4[0], 0, 0.15, 0.15 + 0.15 + 0.15 + 0.15 );
        place ( &s5[0], 0, 0.15, 0.15 + 0.15 + 0.15 + 0.15 + 0.15 );
Для каждого столбца устанавливается начальная позиция. И в каждом столбце устанавливается по вертикали все изображения столбца.
                if ( new_game ) {
                        copy ( s1 );
#if 1
                        copy ( s2 );
                        copy ( s3 );
                        copy ( s4 );
                        copy ( s5 );
#endif
                        place ( &s1[3], 3, 0.15 + 0.2 + 0.2 + 0.2, 0.15 );
                        place ( &s2[3], 3, 0.15 + 0.2 + 0.2 + 0.2, 0.15 + 0.15 );
                        place ( &s3[3], 3, 0.15 + 0.2 + 0.2 + 0.2, 0.15 + 0.15 + 0.15 );
                        place ( &s4[3], 3, 0.15 + 0.2 + 0.2 + 0.2, 0.15 + 0.15 + 0.15 + 0.15 );
                        place ( &s5[3], 3, 0.15 + 0.2 + 0.2 + 0.2, 0.15 + 0.15 + 0.15 + 0.15 + 0.15 );
//                      check_win ( s1, s2, s3, s4, s5 );
                        new_game = 0;
                        continue;
                }
После того как картинки прокрутились, с помощью copy удаляются первые три по вертикали картинки в каждом столбце. Им присваиваются три последних картинки по вертикали, и остальные тоже удаляются и им присваиваются новые картинки.

С паттернами проектирования пока не знаком, читаю понемногу книгу.

ghost_of_the_west ()
Ответ на: комментарий от ghost_of_the_west

Вот. Теперь смотри и считай, сколько сущностей получается:

  1. Экран;
  2. Окно;
  3. Изображение на барабане;
  4. Барабан;
  5. Блок барабанов.

Список перечисленным не ограничивается. Надо понимать, что каждая сущность — это отдельный класс. И все взаимодействия с сущностью выполняются только через методы класса, доступа к полям в соответствии с принципом инкапсуляции быть не должно.

Ты ещё забыл пояснить, зачем там extern "C" и почему loop() лежит в public.

Ещё такой момент: ты грузишь ресурсы из файла. Разумеется, для этого должна существовать своя пачка классов (или один, если структура файла простая), в которой уже и происходит разбор и построение индексов. Тогда ты сможешь избавиться от кучи magic numbers. Я, например, не уверен, что background->load ( 262156 ); содержит правильный offset

XMs ★★★★ ()
Ответ на: комментарий от XMs

Ты ещё забыл пояснить, зачем там extern «C» и почему loop() лежит в public.

Уже не помню. Так было давно.

У меня пока класс только отвечает за сам спрайт, который содержит данные рисунка. И этим спрайтом я управляю.

ghost_of_the_west ()
Ответ на: комментарий от XMs

Тебя не учили не класть мусор в репозиторий?

Первый совет ТСу бесплатно!
$ echo 'set directory-=.' >> ~/.vimrc
Остальные в моём авторском курсе по вимоводству (и гитэксклюдоводству)!

mos ★★★★★ ()
Ответ на: комментарий от ghost_of_the_west

посмотри в /tools/bdata, там программа, которая загружает все изображения в файл. Должно быть все правильно. Эта программа упаковывает все рисунки в файл.

Да ты наркоман. Используй PhysFS, оно умеет работать с архивами и представляет собой абстракцию над ФС в разных операционных системах. Искать файл по оффсету - это мощно... И вообще, почитай пару умных книг по плюсам для начала.

Meyer ★★★ ()
Последнее исправление: Meyer (всего исправлений: 1)
Ответ на: комментарий от ghost_of_the_west

Точно? По коду который выкладываешь или в репах у тебя - как то не очень похоже.

PS: А по теме - осиль отладочный выхлоп, отладчик и valgrind если уж не можешь писать нормально сразу. И почитай что нить про проектирование софта и про отличие говнокода (ну твоего в смысле) от хорошего кода. Просто столько тупняка от тебя на форуме уже вроде не один год, а прогресса как то и не видно совсем.

anonymous ()
Ответ на: комментарий от XMs

зачем там extern «C»

Он хочет сохранить имена.

Я бы возможно хотел, чтобы он подхватил и сказал что именно так и было задумано. Но, учитывая какое у него везде творится непотребство — он скорее всего не понял о чём я...

deep-purple ★★★★★ ()