есть исходник 2д платформера под библиотеку SFML. Хочу этот самый алгоритм заюзать, только под управлением движка irrlicht. В первую очередь компилятор ругался на переменную типа String. ни #include "windows.h" ни #include <string.h> не помогло, потому я заменил String на char*
Далее переменную типа FloatRect объявил так: rect<s32> rectan присвоил ей значение следующим образом: rectan=rect<s32>(7*32,9*32,40,50);
сейчас ругается на строчку rectan.left += dx * time; ,
E:\TURBO\platform\main.cpp|75|error: 'class irr::core::rect<int>' has no member named 'left'|
но ведь структуре rect<s32> присутствует поле left
Код
#include <SFML/Graphics.hpp>
using namespace sf; float offsetX=0, offsetY=0; const int H = 12; const int W = 40;
String TileMap[H] = {
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", "B B B", "B B B", "B B B", "B B B", "B 0000 BBBB B", "B B B", "BBB B B", "B BB BB B", "B BB B", "B B BB BB B", "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",
PLAYER(Texture &image) { sprite.setTexture(image); rect = FloatRect(7*32,9*32,40,50);
dx=dy=0.1; currentFrame = 0; }
void update(float time) {
rect.left += dx * time; Collision(0);
if (!onGround) dy=dy+0.0005*time; rect.top += dy*time; onGround=false; Collision(1);
currentFrame += 0.005*time; if (currentFrame > 6) currentFrame -=6 ;
if (dx>0) sprite.setTextureRect(IntRect(40*int(currentFrame),244,40,50)); if (dx<0) sprite.setTextureRect(IntRect(40*int(currentFrame)+40,244,-40,50));
if (!onGround) dy=dy+0.0005*time; rect.top += dy*time; onGround=false; Collision(1);
currentFrame += 0.005*time; if (currentFrame > 6) currentFrame -=6 ;
if (dx>0) sprite.setTextureRect(IntRect(40*int(currentFrame),244,40,50)); if (dx<0) sprite.setTextureRect(IntRect(40*int(currentFrame)+40,244,-40,50));
class MyEventReceiver : public IEventReceiver { public: // наш собственный обработчик событий virtual bool OnEvent(const SEvent& event) { // просто запоминаем состояние любой клавиши - нажата/отжата if (event.EventType == EET_KEY_INPUT_EVENT) KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown;
return false; }
// метод возвращающий состояние для запрошенной клавиши virtual bool IsKeyDown(EKEY_CODE keyCode) const { return KeyIsDown[keyCode]; }
//конструктор, в цикле сбрасываем статус для всех клавиш MyEventReceiver() { for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i) KeyIsDown[i] = false; }
private: // массив для хранения статусов клавиш bool KeyIsDown[KEY_KEY_CODES_COUNT]; };
public : void gravity() { if(flrf==false) { gg.y-=0.5; } }
};
MYphys phys;
class sky { public:void rain(){ if(rainflag==true){ rainflag = false;
ps = smgr->addParticleSystemSceneNode(false); IParticleEmitter* em1 = ps->createBoxEmitter( aabbox3d< f32 >(0,00,00,resw,1,1), // размер эмиттера(куба) vector3df(0.5f,-2.0f,0.0f), // начальное направление 50,100, // частота испускания (мин,макс) SColor(0,255,255,255), // самый темный цвет SColor(0,255,255,255), // самый яркий цвет 400,800,30, // време жизни (мин,макс), угол dimension2df(32.f,32.f), // минимальный размер частиц dimension2df(96.f,32.f)); // максимальный размер частиц
ps->setEmitter(em1); // отдаем эмиттер системе //em->drop(); // а лично нам он не нужен
Добавлено (21.02.2014, 21:07) --------------------------------------------- Там гибрид из того, что я начинал ранее, потом забил. Вот нашёл чё-то на SFML , хочу перевести свой платформер.
Использовать Irrlicht Для 2Д игр - кощунство. Это библиотека для разработки рейл-тайм 3Д приложений, 2Д там достаточно рудиментарно.
Цитата
В первую очередь компилятор ругался на переменную типа String. ни #include "windows.h" ни #include <string.h> не помогло, потому я заменил String на char*
Ничего удивительного, String это тип, описанный в SFML и без его подключения не будет описан.
Цитата
Далее переменную типа FloatRect объявил так: rect<s32> rectan присвоил ей значение следующим образом: rectan=rect<s32>(7*32,9*32,40,50);
сейчас ругается на строчку rectan.left += dx * time; ,
E:\TURBO\platform\main.cpp|75|error: 'class irr::core::rect<int>' has no member named 'left'|
но ведь структуре rect<s32> присутствует поле left
Тип FloatRect опять же принадлежит SFML, у типа rect<T> из Irrlicht нет никакого поля "left", у него есть поле "position" (или как-то так), которое возвращает двухмерный вектор с положением прямоугольника.
Вывод - не занимайся ерундой, а просто продолжай делать на SFML. Irrlicht не для 2Д был написан.
Update: Чет я, конечно, слоупок... ну ладно, я здесь давно не появлялся, мне можно =D
Сообщение отредактировал JunkerKun - Пятница, 14 Марта 2014, 23:31
Это библиотека для разработки рейл-тайм 3Д приложений, 2Д там достаточно рудиментарно.
за счёт того, что спрайты (точнее текстурки, натянутые на параллеллепипед с размерами x*y*0) находятся в трёхмерном пространстве и в зависимости от ракурса камеры можно сделать эффект параллакс-скроллинга. Ну и по ходу можно влепить ещё чёнить трёхмерного в 2д мир. набросок
ЦитатаJunkerKun ()
Тип FloatRect опять же принадлежит SFML, у типа rect<T> из Irrlicht нет никакого поля "left", у него есть поле "position" (или как-то так), которое возвращает двухмерный вектор с положением прямоугольника.
Эт я уже заметил
ЦитатаJunkerKun ()
Вывод - не занимайся ерундой, а просто продолжай делать на SFML. Irrlicht не для 2Д был написан.
С радостью бы... Но, во-первых, не могу толком настроить код::блокс на эту либу. Делал как тута. компилит нормально, но линкует как-то не так, ибо при запуске экзешника ругается на libgcc_s_dw2-1.dll (версия кодблокса 10.05). Во-вторых, я собираюсь динамически менять цветовую гамму на слоях бэкграунда \ спрайтах. Например, в рэтро-приставках это делалось изменением набора цветов палитры видеоконтроллера. В Irrlicht'e попробую через шейдеры (правда малость геморно).
SFML , как я понял, некое подобие SDL. То есть подобной функции там нет, это значит, что придётся попиксельно считывать картинку и по определённому условию задавать цвет пикселя, выводя на экран. Иными словами, ЦП будет адово нагружен.
Сообщение отредактировал Alkosha - Суббота, 15 Марта 2014, 19:40
Это можно сделать и в 2Д просто высчитывая координаты бэкграунда как координаты_камеры/2 (хотя по факту лучше по формуле перспективы, которую можно найти на той же википедии)
Цитата
Но, во-первых, не могу толком настроить код::блокс на эту либу. Делал как тута. компилит нормально, но линкует как-то не так, ибо при запуске экзешника ругается на libgcc_s_dw2-1.dll (версия кодблокса 10.05).
Ну это уже не из-за либы, согласись
Цитата
Во-вторых, я собираюсь динамически менять цветовую гамму на слоях бэкграунда \ спрайтах. Например, в рэтро-приставках это делалось изменением набора цветов палитры видеоконтроллера. В Irrlicht'e попробую через шейдеры (правда малость геморно).
Можно изменить цвет спрайта. То же самое, что и blend_mode в Game Maker. Или таки использовать шейдеры, которые таки есть в SFML.
Цитата
То есть подобной функции там нет, это значит, что придётся попиксельно считывать картинку и по определённому условию задавать цвет пикселя, выводя на экран.
Бред, ибо см. выше про шейдеры и функцию смешения цветов.
Это можно сделать и в 2Д просто высчитывая координаты бэкграунда как координаты_камеры/2 (хотя по факту лучше по формуле перспективы, которую можно найти на той же википедии)
Та не.. Я имел ввиду не плоскостной параллакс. А примерно такой (хотя тут такой эффект достигнут за счёт скроллинга отдельных строк с разной итерацией)
ЦитатаJunkerKun ()
Ну это уже не из-за либы, согласись
Ну дык, это скорее всего из-за версии mingw, или хз из-за чего. Факт в том, что банально застопорился на настройке компилятора.
ЦитатаJunkerKun ()
Бред, ибо см. выше про шейдеры и функцию смешения цветов.
Я особо не вникал, как устроен SFML, просто лишь предположил, что он схож по принципу с SDL. Ни о каких шейдерах на нём я не был в курсе.
Добавлено (15.03.2014, 21:07) --------------------------------------------- Даже русскоязычного комьюнити на эту SFML похоже, что нету...
Даже русскоязычного комьюнити на эту SFML похоже, что нету...
А зачем тебе обязательно русскоязычное коммьюнити? Англоязычных мануалов как правило хватает. Если нет знаний языка, то всегда есть переводчик, а если попросить объяснить попроще, то просьбу выполнят. Люди там достаточно отзывчивые.
Сообщение отредактировал JunkerKun - Суббота, 15 Марта 2014, 21:55
Ладно, в таком случае как проапгрейдить версию компилятора GCC в код-блоксе ?
Добавлено (17.03.2014, 12:48) --------------------------------------------- А, не. Тут указывается, что для конкретной версии gcc нужна конкретная версия SFML.... попробую исходники пересобрать, авось прокатит
Добавлено (17.03.2014, 14:07) --------------------------------------------- Только как создать в кодблоксе проект для компиляции smlf ? выбрать console aplication , а затем добавить в этот проект add files все cpp hpp файлы во всех подкаталогах исходника ?
Сообщение отредактировал Alkosha - Понедельник, 17 Марта 2014, 14:07
If you dynamically link the C runtime on Windows, you may need to put the following DLL files in your project directory: - libgcc_s_dw2-1.dll - libstdc++-6.dll
я так и поступил, скачал эти две ДЛЛ-ки, поместил в каталог с экзэшником... теперь стартует , и... "вындавс пытается найти способ устранения ошибки" (что-то в этом роде). Причём та же ситуация и на прекомпилированных экзэмплах, поставляемых в комплекте с движком. Быть может это от того, что сама вындавс -- 7-ка. В общем хз.
Теперь-то вы понимаете почему я решил всё-таки перевести исходник под ту либу, которая и компилится, и запускается безупречно ?
Сообщение отредактировал Alkosha - Вторник, 18 Марта 2014, 13:40
DLL самого иррлихта в чем скомпилирована? Обычно идет 2 версии: GCC и Visual Studio. Если к exe, скомпилированному в GCC, поместить дллку студии, то программа вылетает. И наоборот. Так же возможно, что косяк в коде. Например обращение к нулевому указателю и т.п. Если рассматривать екземплы, то все они требуют папки с ресурсами. Возможно, что она лежит не там, где нужно.
Сообщение отредактировал Storm54 - Вторник, 18 Марта 2014, 20:30
DLL самого иррлихта в чем скомпилирована? Обычно идет 2 версии: GCC и Visual Studio. Если к exe, скомпилированному в GCC, поместить дллку студии, то программа вылетает. И наоборот.
)
Так дело в том, что с иррлихтом у меня как раз таки нет проблем... Проблема именно с SFML.
Добавлено (19.03.2014, 00:45) --------------------------------------------- Либы SFML тоже для компилятора mingw gcc качал.
Если рассматривать екземплы, то все они требуют папки с ресурсами. Возможно, что она лежит не там, где нужно.
Не смотря на то, что я ацкий ламер, про такие вещи я осведомлён. Тем паче для примера типа "хыллоу ворлд", где рисуется векторная фигура закрашенного кружочка, никаких ресурсов не требуется, ибо это процедурная графика.
Сообщение отредактировал Alkosha - Среда, 19 Марта 2014, 00:58
Добавлено (21.03.2014, 00:52) --------------------------------------------- Ну вот всё последовательно как и тут делал. И версия код-блокса такая же, и версия SFML. И у того штриха тоже 7-ка...
А дебаггер на что? Запусти дебаггер, он тебе и покажет строку кода и ошибку, которая случилась при его выполнении. Если не показывает, значит проблема именно с ДЛЛ. Либо ДЛЛ не от GCC либо ты что-то не залинковал.
There are multiple variants of gcc for Windows, which are incompatible with each other (different exception management, threading model, etc.). Make sure that you pick up the right package according to the version that you use. If you don't know, check which of the libgcc_s_sjlj-1.dll or libgcc_s_dw2-1.dll file you have in your MinGW/bin folder. If you're using the version of MinGW shipped with Code::Blocks, you probably have a SJLJ version. If you feel like your version of gcc can't work with the precompiled SFML libraries, don't hesitate to recompile SFML, it's not complicated.
Брал отсюда в самой верхней таблице с боковой надписью "виндовс" 5-ая строка сверху, в первом столбце (GCC 4.7 MinGW (DW2) - 32 bits) видовс у меня 32-ух разрядная. http://www.sfml-dev.org/download/sfml/2.0/
Сообщение отредактировал Alkosha - Понедельник, 24 Марта 2014, 15:25
Брал отсюда в самой верхней таблице с боковой надписью "виндовс" 5-ая строка сверху, в первом столбце (GCC 4.7 MinGW (DW2) - 32 bits) видовс у меня 32-ух разрядная.
Ну так и проверь версию MinGW. Наверняка у тебя стоит SJLJ, а ДЛЛ под DW2 компилена. Черным по белому написано, что если у тебя версия, поставляемая с Блоксом, то это почти наверняка SJLJ
Цитата
Машинного кода ведь ?
Блокс имеет замечательный отладчик, позволяющий собственно, выполнять код построчно. И отладчик не выдает машинный код, будучи запущенным из IDE, чем Блокс и является.
Сообщение отредактировал JunkerKun - Вторник, 25 Марта 2014, 02:24