Другое > Hard'n'Soft
как юзать SDL_rotozoom ?
(1/1)
Гламурная киса:
Пишу игру в стиле old school на SDL.
Нужно промасштабировать всё содержимое окна при помощи rotozoom.

Хочу задать scale без сглаживания на весь экран при помощи SDL_rotozoom.h (из набора SDL_gfx http://www.ferzkopp.net/joomla/content/view/19/14/)

В данный момент все "поверхности" в виде bmp рисуются на одном surface (screen).
Вызываю функцию zoomSurface(screen,2.0,2.0,0); (первый параметр - масштабируемый сюрфэйс, второй и третий - масштаб, четвёртый сглаживание вкл\выкл)
компилятор ругается на "undefined reference to `zoomSurface'"
хотя #include <SDL_rotozoom.h> присутствует и данный хэдер находится там, где и все хэдеры среды.
(среда code::blocks)

может что-то нужно в глобальных настройках линкера вписать?
Подскажите,пожалуйста, тк я не программист и не разбираюсь ни черта в этом.

Добавлено позже:
Следуя этому мануалу http://www.threelas.com/2011/09/how-to-install-sdlgfx-in-codeblocks.html,
ошибки удалось избежать....Но и сама функция почему-то не работает (не увеличивает изображение)
gepar:

--- Цитата: Гламурная киса ---компилятор ругается на "undefined reference to `zoomSurface'"
--- Конец цитаты ---
В таких случаях кроме хидера нужна ещё какая-то либа, гугли каких либ не хватает и подключай их в проект. Не забывай только что code::blocks это не vs, так что подключать либы нужно напрямую, а не через pragma.
Гламурная киса:

--- Цитата: gepar от 25 Март 2012, 03:22:31 ---В таких случаях кроме хидера нужна ещё какая-то либа, гугли каких либ не хватает и подключай их в проект. Не забывай только что code::blocks это не vs, так что подключать либы нужно напрямую, а не через pragma.

--- Конец цитаты ---
Я ж говорю, что уже компилирует нормально после выполнения всех действий,указанных тут http://www.threelas.com/2011/09/how-to-install-sdlgfx-in-codeblocks.html
Но сами функции библиотеки SDL_gfx мёртвые...При том , что SDL работает нормально и вырисовывет картинку и обрабатывает нажатие клавиш, а вот ротации , масштабирование и примитивы ни каким макаром не проявляются. :'(
gepar:

--- Цитата: Гламурная киса ---Я ж говорю, что уже компилирует нормально после выполнения всех действий,указанных тут http://www.threelas.com/2011/09/how-to-install-sdlgfx-in-codeblocks.html
--- Конец цитаты ---
Я по ссылкам просто с мобильного инета на выходных не хожу так что не смотрел что там и сразу написал почему чаще всего случается такая проблема.

--- Цитата: Гламурная киса ---а вот ротации , масштабирование и примитивы ни каким макаром не проявляются.
--- Конец цитаты ---
Может поищи другую версия с другими версиями библиотек.
Mashin:
Гламурная киса, покажи кусок кода в котором ты увеличиваешь изображение.
Гламурная киса:

--- Код: ---SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 128, 128, 128));
printmap();   
SDL_BlitSurface(bmp, 0, screen, &penis);
zoomSurface(screen,4,4,0);
//rotozoomSurface(screen,0,3,0);
SDL_Flip(screen);

--- Конец кода ---
Mashin:
Из документации:

--- Цитата ---SDL_Surface *    zoomSurface (SDL_Surface *src, double zoomx, double zoomy, int smooth)

Returns:
The new, zoomed surface.
--- Конец цитаты ---

То есть эта функция возвращает указатель на новую поверхность, а не изменяет поверхность которую ты передаешь функции.
Гламурная киса:
А вот с этого момента пожалуйста поподробнее.
как мне объявить поверхность, на которую выплёскивать промасштабированную картинку.

Сейчас рендерится на сюрфэйс screen со следующими атрибутами :

--- Код: ---SDL_Surface* screen = SDL_SetVideoMode(256, 192, 8,
                                           SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_NOFRAME  );
--- Конец кода ---
(256*192, разрешение на zx spectrum, хочу сделать закос под эту машину)

Допустим я хочу вывести SDL_Flip(virtScreen);
Это мне нужно перед этим поставить virtScreen = rotozoomSurface(screen,0,3,0); ?
И как мне его объявить?
Mashin:
Видимо как-то так (сам я с SDL_gfx никогда не работал):

--- Код: ---SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 128, 128, 128));
printmap();
virtScreen = zoomSurface(bmp,4,4,0);
SDL_BlitSurface(virtScreen, 0, screen, &penis);
SDL_Flip(screen);
--- Конец кода ---


--- Цитата ---И как мне его объявить?
--- Конец цитаты ---

--- Код: ---SDL_Surface * virtScreen;
--- Конец кода ---

Только screen'у наверно надо будет изменить размер.
Гламурная киса:
Заработало, кое-как....
Только В-РОТ-МНЕ НОГИ ДО ЧЕГО ЖЕ ОНА ТОРМОЗНАЯ!!!
На двухядерном проце 2.2 GHz выдаёт около 8-ми фрэймов в секунду.(конечно это окончательно приближает графон  к уровню zx spectrum'a )

Добавлено позже:
А средствами OpenGL реально промасштабировать виртуальный экран (в данном случае поверхность screen)?
Он вроде как находится в ОЗУ.

Добавлено позже:
Или может проще свою функцию зума создать  <_<
Знать бы только как проверить состояние пикселя в координатах на сюрфэйсе.

Добавлено позже:
Вот какой фрэймрэйт сейчас
С зумом и без зума

Добавлено позже:
Кстати, почему-то перестаёт увеличивать через некоторое время выполнения программы.(и жрёт БОЛЕЕ ГИГА ОПЕРЫ !!! после чего вырубается)
При том, что без зума хавает полтора метра стабильно.(ну и процессорного времени,за счёт структуры SDL 50%, но это терпимо , так как DOS BOX на той же SDL примерно столько же времени требует на обработку процом)
Гламурная киса:
Всё-таки пришлось написАть свою процедуру зума.
Работает шустрее...
Но,  почему-то вырисовывается и масштабированая картинка и виртуальный экран.

--- Код: ---for(int matx=0;matx<255;matx++){
for(int maty=0;maty<195;maty++){

if(get_pixel(screen,matx,maty)==0){
    karta.x=matx*4;
    karta.y=maty*4;

SDL_BlitSurface(pix, 0, vScreen, &karta);
}
}
}
   SDL_Flip(vScreen);
--- Конец кода ---

pix - это БМПшка 4х4.

А вот функция получения состояния пикселя

--- Код: ---Uint8 get_pixel( SDL_Surface *surface, int x, int y )
{

    Uint8 *pixels = (Uint8 *)surface->pixels;
       return pixels[ ( y * surface->w ) + x ];
}
--- Конец кода ---


Добавлено позже:
Хммм... <_<
MetalliC:

--- Цитата: Гламурная киса ---Кстати, почему-то перестаёт увеличивать через некоторое время выполнения программы.(и жрёт БОЛЕЕ ГИГА ОПЕРЫ !!! после чего вырубается)
--- Конец цитаты ---
конечно, утечка памяти же на лицо

SDL_FreeSurface(virtScreen);
нужен после
SDL_Flip(screen);

Добавлено позже:
вообще, зум с поворотом довольно ресурсоемкая хрень, и не удивительно, что он тормозит.
попробуй найти простой зум

кстати в SDL 1.3 оно уже встроено


--- Код: ---/**
 *  \brief Perform a fast, low quality, stretch blit between two surfaces of the
 *         same pixel format.
 * 
 *  \note This function uses a static buffer, and is not thread-safe.
 */
extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src,
                                            const SDL_Rect * srcrect,
                                            SDL_Surface * dst,
                                            const SDL_Rect * dstrect);

--- Конец кода ---
Гламурная киса:

--- Цитата: MetalliC от 28 Март 2012, 22:47:47 ---конечно, утечка памяти же на лицо
SDL_FreeSurface(virtScreen);
нужен после
SDL_Flip(screen);

--- Конец цитаты ---
отлично...время освобождения памяти...дополнительные тормоза.

--- Цитата: MetalliC от 28 Март 2012, 22:47:47 ---вообще, зум с поворотом довольно ресурсоемкая хрень, и не удивительно, что он тормозит.
попробуй найти простой зум

--- Конец цитаты ---
Дык с той библиотеки использую zoomSurface(screen,zoomX,zoomY,smooth[вкл\выкл]) - тут нет угла поворота в качестве передаваемых параметров, да и название самой функции не намекает на поворот.
MetalliC:

--- Цитата: Гламурная киса ---время освобождения памяти...дополнительные тормоза.
--- Конец цитаты ---
free() раз в кадр - лишние тормоза ? поучи матчасть


--- Цитата: Гламурная киса ---тут нет угла поворота в качестве передаваемых параметров
--- Конец цитаты ---
а, ну да.

--- Цитата: Гламурная киса ---да и название самой функции не намекает на поворот.
--- Конец цитаты ---
знаешь, программеры такие программеры, для зума могли ф-цию рот-зум использовать с поворотом на 0 градусов :)
Гламурная киса:
после добаления SDL_FreeSurface(virtScreen); начало хавать 6 метров оперы, но остались всё те же адские лаги.
В то время,как с моей процедурой зума поедает только 1.8 метра и гораздо быстрее передвигается.
Я не ставлю перед собой цель создать очень драйвовую игру (динамичнее своего "кровавого мяча" я вряд ли сделаю уже), но и не сильно тормозную.
Гламурная киса:
Эхе-хе-ехее-хееее..... :wall:

Добавлено позже:
Кстати, попробуйте понажимать клавиши "1","2","3","4"...Тут типа псевдо-фильтр.
Навигация
Главная страница сообщений

Перейти к полной версии