| Другое > 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"...Тут типа псевдо-фильтр. |
| Навигация |
| Главная страница сообщений |