Автор Тема: как юзать SDL_rotozoom ?  (Прочитано 4760 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
как юзать SDL_rotozoom ?
« : 25 Март 2012, 02:35:29 »
Пишу игру в стиле 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

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #1 : 25 Март 2012, 03:22:31 »
Цитата: Гламурная киса
компилятор ругается на "undefined reference to `zoomSurface'"
В таких случаях кроме хидера нужна ещё какая-то либа, гугли каких либ не хватает и подключай их в проект. Не забывай только что code::blocks это не vs, так что подключать либы нужно напрямую, а не через pragma.

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #2 : 25 Март 2012, 03:29:26 »
В таких случаях кроме хидера нужна ещё какая-то либа, гугли каких либ не хватает и подключай их в проект. Не забывай только что code::blocks это не vs, так что подключать либы нужно напрямую, а не через pragma.
Я ж говорю, что уже компилирует нормально после выполнения всех действий,указанных тут http://www.threelas.com/2011/09/how-to-install-sdlgfx-in-codeblocks.html
Но сами функции библиотеки SDL_gfx мёртвые...При том , что SDL работает нормально и вырисовывет картинку и обрабатывает нажатие клавиш, а вот ротации , масштабирование и примитивы ни каким макаром не проявляются. :'(

Оффлайн gepar

  • Пользователь
  • Сообщений: 10150
  • Пол: Мужской
  • ▂ ▃ ▄ ▅ ▆ ▇ █
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #3 : 25 Март 2012, 03:50:23 »
Цитата: Гламурная киса
Я ж говорю, что уже компилирует нормально после выполнения всех действий,указанных тут http://www.threelas.com/2011/09/how-to-install-sdlgfx-in-codeblocks.html
Я по ссылкам просто с мобильного инета на выходных не хожу так что не смотрел что там и сразу написал почему чаще всего случается такая проблема.
Цитата: Гламурная киса
а вот ротации , масштабирование и примитивы ни каким макаром не проявляются.
Может поищи другую версия с другими версиями библиотек.

Оффлайн Mashin

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
    • Twitter
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #4 : 26 Март 2012, 12:13:43 »
Гламурная киса, покажи кусок кода в котором ты увеличиваешь изображение.

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #5 : 26 Март 2012, 13:22:17 »
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

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
    • Twitter
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #6 : 27 Март 2012, 18:50:55 »
Из документации:
Цитата
SDL_Surface *    zoomSurface (SDL_Surface *src, double zoomx, double zoomy, int smooth)

Returns:
The new, zoomed surface.

То есть эта функция возвращает указатель на новую поверхность, а не изменяет поверхность которую ты передаешь функции.

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #7 : 27 Март 2012, 19:15:18 »
А вот с этого момента пожалуйста поподробнее.
как мне объявить поверхность, на которую выплёскивать промасштабированную картинку.

Сейчас рендерится на сюрфэйс 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); ?
И как мне его объявить?
« Последнее редактирование: 27 Март 2012, 19:19:46 от Гламурная киса »

Оффлайн Mashin

  • Пользователь
  • Сообщений: 85
  • Пол: Мужской
    • Twitter
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #8 : 27 Март 2012, 19:53:05 »
Видимо как-то так (сам я с 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'у наверно надо будет изменить размер.

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #9 : 27 Март 2012, 22:48:23 »
Заработало, кое-как....
Только В-РОТ-МНЕ НОГИ ДО ЧЕГО ЖЕ ОНА ТОРМОЗНАЯ!!!
На двухядерном проце 2.2 GHz выдаёт около 8-ми фрэймов в секунду.(конечно это окончательно приближает графон  к уровню zx spectrum'a )

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

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

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

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

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #10 : 28 Март 2012, 22:26:49 »
Всё-таки пришлось написАть свою процедуру зума.
Работает шустрее...
Но,  почему-то вырисовывается и масштабированая картинка и виртуальный экран.
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

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #11 : 28 Март 2012, 22:47:47 »
Цитата: Гламурная киса
Кстати, почему-то перестаёт увеличивать через некоторое время выполнения программы.(и жрёт БОЛЕЕ ГИГА ОПЕРЫ !!! после чего вырубается)
конечно, утечка памяти же на лицо

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);

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #12 : 28 Март 2012, 23:47:22 »
конечно, утечка памяти же на лицо
SDL_FreeSurface(virtScreen);
нужен после
SDL_Flip(screen);
отлично...время освобождения памяти...дополнительные тормоза.
вообще, зум с поворотом довольно ресурсоемкая хрень, и не удивительно, что он тормозит.
попробуй найти простой зум
Дык с той библиотеки использую zoomSurface(screen,zoomX,zoomY,smooth[вкл\выкл]) - тут нет угла поворота в качестве передаваемых параметров, да и название самой функции не намекает на поворот.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #13 : 29 Март 2012, 00:19:38 »
Цитата: Гламурная киса
время освобождения памяти...дополнительные тормоза.
free() раз в кадр - лишние тормоза ? поучи матчасть

Цитата: Гламурная киса
тут нет угла поворота в качестве передаваемых параметров
а, ну да.
Цитата: Гламурная киса
да и название самой функции не намекает на поворот.
знаешь, программеры такие программеры, для зума могли ф-цию рот-зум использовать с поворотом на 0 градусов :)

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #14 : 29 Март 2012, 00:26:17 »
после добаления SDL_FreeSurface(virtScreen); начало хавать 6 метров оперы, но остались всё те же адские лаги.
В то время,как с моей процедурой зума поедает только 1.8 метра и гораздо быстрее передвигается.
Я не ставлю перед собой цель создать очень драйвовую игру (динамичнее своего "кровавого мяча" я вряд ли сделаю уже), но и не сильно тормозную.

Оффлайн Гламурная киса

  • Пользователь
  • Сообщений: 317
  • Пол: Мужской
  • иичко
    • Просмотр профиля
Re: как юзать SDL_rotozoom ?
« Ответ #15 : 31 Март 2012, 00:33:18 »
Эхе-хе-ехее-хееее..... :wall:

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