Результаты поиска
| |
Alkosha | Дата: Среда, 02 Июля 2014, 20:45 | Сообщение # 181 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| Спасибо, сей подход прекрасно сработал.
|
|
| |
Alkosha | Дата: Вторник, 01 Июля 2014, 22:08 | Сообщение # 182 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| Изначально итерация индекса стрингов j происходила до вызова метода priemResursov(), но когда я j++ перенёс в этот самый priemResursov(), while перестал перескакивать. Теперь картинки грузит как и положено... но, теперь застопорился на установке координат этих картинок. Как теперь из стрингов убрать запятые(либо иные разделительные знаки) и разделить на отдельные числа... похоже, плохая затея со стрингами. Нужно наверное посимвольно считывать, и тут же на ходу интерпретировать. Но пока не знаю как.
Сообщение отредактировал Alkosha - Вторник, 01 Июля 2014, 22:09 |
|
| |
Alkosha | Дата: Понедельник, 30 Июня 2014, 22:35 | Сообщение # 183 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| глобальное объявление j тоже не помогло. Добавлено (30.06.2014, 22:27) --------------------------------------------- Решил глянуть, что же всё-таки пихается в priemResursov()
Код void priemResursov() { while(input[j]!="endres") { //tileTex[atoi(input[j+1].c_str())].load((char*)input[j+2].c_str()); j+=2; cout<<atoi(input[j+1].c_str())<<" : "<<(char*)input[j+2].c_str()<<"\n"; } }
Результат: Добавлено (30.06.2014, 22:31) ---------------------------------------------
Цитата goldsphere ( ) первое что бросается в глаза, ты не предпринимаешь никаких действий, если файла такого нету, т.е считать ты его не смог, а что-то делать с пустой информацией пытаешься. это второстепенное. Ибо до перехода в функцию deshifrator() все считанные строки отображаются в консоли.
Добавлено (30.06.2014, 22:35) --------------------------------------------- ага.... только щас дошло по скриншотам. Что в этом цикле он шпарит дальше, чем я расчитывал. Код for( j=0;j<i;j++) { if(input[j]=="res") { priemResursov(); } }
то есть поначалу он всё как и положено делает, затем не выходит из тела while(input[j]!="endres") продолжает шпарить до какого-то неведомого предела.
|
|
| |
Alkosha | Дата: Понедельник, 30 Июня 2014, 14:55 | Сообщение # 184 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| Компилит нормально. Но во время выполнения программы крашит.
Код class myLoadStageFromFile { private: ifstream file;
string input[256]; int i=0;
public: void open() { file.open("maps//level1.lvl", ios::in); if (file) { while (!file.eof()) { file>>input[i]; i++; } file.close();
for(int j=0;j<i;j++) { cout<<input[j]<<"\n"; }
deshifrator(); } }
private: int j=0; void priemResursov() { while(input[j]!="endres") { tileTex[atoi(input[j].c_str())].load((char*)input[j+1].c_str()); j+=2; } } void deshifrator() { for(int j=0;j<i;j++) { if(input[j]=="res") { j++; priemResursov(); } } } };
Причём этот участок выполняется Код while (!file.eof()) { file>>input[i]; i++; } file.close();
for(int j=0;j<i;j++) { cout<<input[j]<<"\n"; }
А вот структура файла *.lvl Цитата res 0 img//home2.png 1 img//ground1.png 2 img//zabor1.png 3 img//home1.png 4 img//bus.png 5 img//platform1.png 6 img//tree.png 7 img//gorka.png 8 img//ground2.png 9 img//truba.png 10 img//junk.png endres
Если функцию tileTex[int].load(char*) напрямую выполнить (безо всяких считываний из файла), то всё ок.
Добавлено (30.06.2014, 13:43) --------------------------------------------- Кстати, а в каждом элементе string-массива может ли быть символ конца строки в этом случае (\n)? Если да, то как его избежать. Ведь заношу инфу в стринги таким образом. file>>input[i];
Добавлено (30.06.2014, 14:55) --------------------------------------------- а не, всё-таки энд-лайна нет в стрингах. input[i].length() показывает в консольке ровно то же кол-во символов, сколько и видно их в той же самой консольке невооружённым глазом.
Сообщение отредактировал Alkosha - Понедельник, 30 Июня 2014, 22:19 |
|
| |
Alkosha | Дата: Воскресенье, 29 Июня 2014, 23:28 | Сообщение # 185 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| хмм.... странный эррор. Цитата E:\TURBO\platform3\main.cpp|547|error: invalid conversion from 'const char*' to 'char*' [-fpermissive]|
но мой стринг не как константа объявлен
Сообщение отредактировал Alkosha - Воскресенье, 29 Июня 2014, 23:32 |
|
| |
Alkosha | Дата: Воскресенье, 29 Июня 2014, 23:05 | Сообщение # 186 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| Цитата в качестве аргумента которой передаётся указатель типа char*
|
|
| |
Alkosha | Дата: Воскресенье, 29 Июня 2014, 22:03 | Сообщение # 187 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| Есть функция, в качестве аргумента которой передаётся указатель типа char* ("путь к файлу") Но у меня в проге этот путь к файлу хранится в string'e. Как его преобразовать в нужный вид ?
|
|
| |
Alkosha | Дата: Пятница, 27 Июня 2014, 15:54 | Сообщение # 188 | Тема: Массив картинок Builder Ц++ |
участник
Сейчас нет на сайте
| Данке шон
|
|
| |
Alkosha | Дата: Четверг, 26 Июня 2014, 21:46 | Сообщение # 189 | Тема: Массив картинок Builder Ц++ |
участник
Сейчас нет на сайте
| Вот думаю каким образом их рисовать. На форме нужно создать область, где эти самые картинки будут видны (чтоб не мазались по всей форме).
Цитата goldsphere ( ) . Скорей всего при размещении картинки на экране надо записывать в массив текстовую или числовую информацию о типе объекта и его координаты.
Такое уже сделано. Но внутри самой исполнительной программы, а не в файле. Над чтением с файла только начал шаманить.Добавлено (26.06.2014, 21:46) --------------------------------------------- Кстать... а как создать имэйдж ?
Объявляю массив так. TImage *pngI[256] ;
затем по открытию файла pngI[0]= new TImage(); pngI[0]->LoadFromFile(filename);
выбивает эррор Цитата [BCC32 Error] Unit1.cpp(59): E2285 Could not find a match for 'TImage::TImage()'
|
|
| |
Alkosha | Дата: Среда, 25 Июня 2014, 22:53 | Сообщение # 190 | Тема: Массив картинок Builder Ц++ |
участник
Сейчас нет на сайте
| Пытаюсь сделать редактор уровней, выбрал ГУЙ Builder'a XE (так как в оном, в отличии от борландовского, есть поддержка png-имэйджей) Сделал листбокс, в который добавляются файлы картинок через диалог открытия файлов. Теперь бы эти картинки разместить в виде массива на виртуальном игровом поле. И вот теперь не знаю как лучше. Мне кажется для каждой размещённой картинки создавать TImage достаточно ресурсоёмко. Каким образом оптимальнее всего разместить картинки на поле ?
Сообщение отредактировал Alkosha - Среда, 25 Июня 2014, 22:57 |
|
| |
Alkosha | Дата: Понедельник, 23 Июня 2014, 14:58 | Сообщение # 191 | Тема: Физика 2д платформера. |
участник
Сейчас нет на сайте
| Цитата Saitei ( ) тык <- там есть ответ
Ну дык, если ячейки как в Марио раскидать, то у меня всё в порядке.
В первой части марио броуз (клон которого рассматривается в варианте по SFML) не было наклонных поверхностей, а у меня как раз запара именно с наклонными поверхностями. Я имею ввиду нет интерполяции перехода от ячейки к ячейке, когда поднимается вверх, и когда спускается, больше планирует за счёт свободного падения (как это визуально выглядит, можно глянуть в том примере, который я скинул)Добавлено (23.06.2014, 14:58) --------------------------------------------- Вот в диззи фантастик эдвэнче тоже по двумерному массиву определялась коллизия, и там тоже заметно эти ячейки, тем не менее, там он гораздо плавнее двигался по склонам.
Сообщение отредактировал Alkosha - Понедельник, 23 Июня 2014, 14:56 |
|
| |
Alkosha | Дата: Понедельник, 23 Июня 2014, 13:59 | Сообщение # 192 | Тема: Физика 2д платформера. |
участник
Сейчас нет на сайте
| Цитата RomanNVKZ ( ) Кстати, на чем пишешь?
Очевидо, что на Бейсике.
|
|
| |
Alkosha | Дата: Суббота, 21 Июня 2014, 20:00 | Сообщение # 193 | Тема: Градиент |
участник
Сейчас нет на сайте
| Допустим, на вход функции поступают параметры для цветовых переходов от одного цвета до другого.
Вот к примеру color1={r1,g1,b1}; color2={r2,g2,b2} тут цикл for=0 to len // где len - ширина градиента. затем линиями line(x1,y1,x2,y2) с цветовыми переходами от color1 до color2. Как определить для каждого шага в цикле цвет перехода?
Сообщение отредактировал Alkosha - Суббота, 21 Июня 2014, 20:01 |
|
| |
Alkosha | Дата: Пятница, 20 Июня 2014, 22:07 | Сообщение # 194 | Тема: Физика 2д платформера. |
участник
Сейчас нет на сайте
| Сейчас он немного отличается от того, что было в первом посте. И класс физики тож чуток изменился, вроде.
Код class Physix { public:
void wallcollis() { int centery=pers.y/32; int centerx=pers.x/32; // стена слева if(collisMap.bitmap[centery][centerx-1]=='B'&&collisMap.bitmap[centery-1][centerx-1]=='B') { if (pers.dx<0) {
pers.dx=0;
} }
// стена справа if(collisMap.bitmap[centery][centerx+1]=='B'&&collisMap.bitmap[centery-1][centerx+1]=='B') { if (pers.dx>0) {
pers.dx=0;
} } if(pers.onGround)pers.x+=pers.dx;
//сверху if(collisMap.bitmap[centery-1][centerx]=='B') { if (pers.dy<0) {
pers.dy=0;
} }
}
void gravitation() { int centery=pers.y/32; int centerx=pers.x/32; if (!pers.onGround) { pers.dy=pers.dy+1; pers.x+=pers.dx; } pers.y+=pers.dy; pers.onGround=false; if(collisMap.bitmap[centery+1][centerx]=='B') {pers.onGround=true; if (pers.dy>=0) {pers.y=centery*32; pers.dy=0;
} } if(collisMap.bitmap[centery][centerx]=='B') {pers.onGround=true; pers.y=centery*32-1; if (pers.dy>0) { pers.dy=0;
} }
}
}; Physix phys;
Нынешнее состояние моего горе-платформера. СдёрниДобавлено (20.06.2014, 22:07) --------------------------------------------- Всё равно по наклонным поверхностям он рахитно передвигается.
|
|
| |
Alkosha | Дата: Пятница, 20 Июня 2014, 13:50 | Сообщение # 195 | Тема: Система частиц. Помогите исправить...Пожалуйста |
участник
Сейчас нет на сайте
| Пока хочу реализовать для начала эффект дождя.
Сперва инициализирую начальное направление частиц, а так же спрайт (в дальнейшем ещё добавлю переменные для размеров эмиттера и плотности испускания частиц) rain.init("img//kaplya.png",-3,3,3,30);
Затем в цикле обновление координат вызываю функцию rain.update()
Мною задумывалось так, если флаг rain.enable= труЪ, то эмиттер испускает частицы. else эмиттер прекращает испускать частицы, но если хотя бы одна частица "жива" то апдейтить её координаты. Но тут короче криво условие сделано. Та и вообще в целом весь подход мне кажется не совсем корректным, точнее совсем не корректным.
Код class myParticles { public: bool enable=false;
struct partic { int starty, startx ;
float x; float y; float dx,dy; int timeToDie; };
private: static const int maxnum=200; SDL_Rect rect; partic partics[maxnum]; float maxSpeedy, minSpeedy, minSpeedx, maxSpeedx;
public: SDL_Texture * particTex;
void init(char* tex,float minx, float maxx, float miny,float maxy) { maxSpeedy=maxy; minSpeedy=miny; minSpeedx=minx; maxSpeedx=maxx; loadTex(tex); for(int i=0;i<maxnum;i++) { partics[i].startx=rand()%800; partics[i].starty=-10; partics[i].x= partics[i].startx; partics[i].y=partics[i].starty; partics[i].dx=rand()%(int)(maxSpeedx-minSpeedx)+minSpeedx; partics[i].dy=rand()%(int)(maxSpeedy-minSpeedy)+minSpeedy; partics[i].timeToDie=rand()%20+20; } }
void loadTex( char* filename ) { particTex = IMG_LoadTexture(renderer, filename); SDL_QueryTexture(particTex, NULL, NULL, &rect.w, &rect.h); }
void update() {
for(int i=0;i<maxnum;i++) { if(enable)partics[i].timeToDie--; if(partics[i].timeToDie<=0&&!enable)partics[i]={0};
if(partics[i].timeToDie<=0&&enable) { partics[i].startx=rand()%800; partics[i].starty=-10; partics[i].x=partics[i].startx; partics[i].y=partics[i].starty; partics[i].dx=rand()%(int)(maxSpeedx-minSpeedx)+minSpeedx; partics[i].dy=rand()%(int)(maxSpeedy-minSpeedy)+minSpeedy; partics[i].timeToDie=rand()%20+20; } if(partics[i].timeToDie>0||enable){ partics[i].y+=partics[i].dy; partics[i].x+=partics[i].dx; }
} }
void display() { SDL_RenderSetScale(renderer,1,1); SDL_SetTextureBlendMode(particTex, SDL_BLENDMODE_ADD); for(int i=0;i<maxnum;i++) {
SDL_Rect DestRs; DestRs.x=partics[i].x; DestRs.y=partics[i].y; DestRs.w=rect.w; DestRs.h=rect.h; SDL_RenderCopy(renderer, particTex , &rect, &DestRs);
}
} }; myParticles rain;
Добавлено (20.06.2014, 13:09) --------------------------------------------- Искал в гугле чё-нить по частицам, так там такие программиздские ухищрения. Есть даже примеры и на шейдерах и на распараллеливании.
Мне бы чё-нить попроще. Типа того г*вн*-кода, написанного мною.
Добавлено (20.06.2014, 13:50) --------------------------------------------- Изначально у меня вообще была проверка "умершей"частицы не по "timeToDie!!!!" а по границам, за которые попапдает частица. Но тогда вообще было так, если !enable, то "дождь" резко исчезал. Я вот уже подумываю, что надо было так и оставить и при !enable попросту альфа-канал всех частиц разом постепенно уменьшать от 255-ти до 0-ля.
Сообщение отредактировал Alkosha - Пятница, 20 Июня 2014, 13:52 |
|
| |
Alkosha | Дата: Среда, 11 Июня 2014, 14:45 | Сообщение # 196 | Тема: Физика 2д платформера. |
участник
Сейчас нет на сайте
| Платформер у меня обрабатывается по битмапе, в смысле столкновения персонажа с граундом.
Вот пока как-то кривовато это дело происходит, а именно выталкивание персонажа из под "земли".
То после прыжка с высокой платформы он на половину застряёт в ячейках, и вдоль них может ходить и так же можно продолжать прыгать на том же уровне, то как раз впритык ячейке состыковка... ай, короче. Кажись я непонятно пояснил. Рабочая программа прилагается, дабы глянуть поведение персонажа (управление ADW)
Вот класс физики. Собственно запара в функции gravitation().
Код class Physix { public:
void wallcollis() { int centery=pers.y/32; int centerx=pers.x/32; // стена слева if(collisMap.bitmap[centery][centerx-1]=='B'&&collisMap.bitmap[centery-1][centerx-1]=='B') { if (pers.dx<0) {
pers.dx=0;
} } // стена справа if(collisMap.bitmap[centery][centerx+1]=='B'&&collisMap.bitmap[centery-1][centerx+1]=='B') { if (pers.dx>0) {
pers.dx=0;
} } if(pers.onGround)pers.x+=pers.dx; }
void gravitation() { int centery=pers.y/32; int centerx=pers.x/32; if (!pers.onGround) { pers.dy=pers.dy+0.9; pers.x+=pers.dx; } pers.y+=pers.dy; pers.onGround=false;
if(collisMap.bitmap[centery+1][centerx]=='B') {pers.onGround=true;
if (pers.dy>0) { pers.dy=0;
} }
if(collisMap.bitmap[centery][centerx]=='B') {pers.onGround=true; pers.y-=8; if (pers.dy>0) { pers.dy=0; } }
}
}; Physix phys;
Добавлено (11.06.2014, 14:44) --------------------------------------------- Где dx dy - ускорения по соответствущим осям. onGround - флаг нахождения на земле. bitmap[][] - двумерный массив char'ов , где символ "B" обозначает земную твердь. ну в общем и всё.
Добавлено (11.06.2014, 14:45) --------------------------------------------- Подозрение на погрешности при переводе float'a в int
Сообщение отредактировал Alkosha - Среда, 11 Июня 2014, 14:54 |
|
| |
Alkosha | Дата: Воскресенье, 08 Июня 2014, 12:53 | Сообщение # 197 | Тема: Ошибка в компоновщика C::B |
участник
Сейчас нет на сайте
| Не, ну это конкретная шляпенция. Удалял антивирусник. Пробовал без него - тоже нет доступа к собираемому файлу. Более того, теперь и на с++ builder такой же бадыль.
Хотя где-то пол-года назад ничего такого не было ни в c::b , ни в билдере , ни в dev-CPP.
И в службах не могу вычислить, какая из них задерживает файл.
Сообщение отредактировал Alkosha - Воскресенье, 08 Июня 2014, 13:10 |
|
| |
Alkosha | Дата: Воскресенье, 25 Мая 2014, 10:40 | Сообщение # 198 | Тема: Ошибка в компоновщика C::B |
участник
Сейчас нет на сайте
| Цитата froex ( ) Открой диспетчер задач и найди там свой процесс.
Цитата Alkosha ( ) Та и в процессах программа не сидит. Добавлено (25.05.2014, 10:40) --------------------------------------------- Вот тут чуваки тоже столкнулись с подобной шляпенцией. cannot open output file, permission denied
Но там они вроде как до антивиря др.Вэба докопались. У меня eset smart security 4. Я его на момент компиляции и запуска программы пробовал отключить, всё равно через раз нет доступа к собираемому *.exe Причем тоже как и у тех челов, через некоторое время можно снова компилировать проект не выходя из кодблокса.
Какая-то служба винды наверное лочит.
|
|
| |
Alkosha | Дата: Воскресенье, 18 Мая 2014, 10:12 | Сообщение # 199 | Тема: Ошибка в компоновщика C::B |
участник
Сейчас нет на сайте
| Цитата Ты закрываешь программу перед тем, как перекомпилировать?
Ессно. Причём как и по закрытию на виндоузный крестик в углу, так и по "press any key". Та и в процессах программа не сидит.
|
|
| |
Alkosha | Дата: Суббота, 17 Мая 2014, 17:29 | Сообщение # 200 | Тема: Ошибка в компоновщика C::B |
участник
Сейчас нет на сайте
| Скачал SDL 2.3 для mingw. Установил кодблокс 13.12 с mingw в комплекте. В билд-опшонс -> компилер указал путь к инклудам (D:\engines\SDL2-devel-2.0.3-mingw\SDL2-2.0.3\i686-w64-mingw32\include) и во вкладке линкер путь к либам (D:\engines\SDL2-devel-2.0.3-mingw\SDL2-2.0.3\i686-w64-mingw32\lib)
В линкер-сеттингс поле озэр линкер опшонс : -lmingw32 -lSDL2main -lSDL2
Иногда компилируется и стартует программа, даже спрайтики удалось вывести. А иногда происходит ошибка в ld.exe (компоновщик):
Код ||=== Build: Debug in Platform20 (compiler: GNU GCC Compiler) ===| ld.exe||cannot open output file Platform20.exe Permission denied| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Приходится по нескольку раз перезапускать кодблокс. Чтение-запись на диск разрешены, орудую под правами администратора. Другие проекты компилируются и стартуют как и положено. А с этим SDL2 какая-то аномалия.Добавлено (17.05.2014, 17:29) --------------------------------------------- Ах да. ОС - Windows 7 x86
Сообщение отредактировал Alkosha - Суббота, 17 Мая 2014, 17:27 |
|
| |
|