Результаты поиска
| |
Alkosha | Дата: Воскресенье, 24 Августа 2014, 14:26 | Сообщение # 81 | Тема: как за раз удалить массив текстур SDL2 ? |
участник
Сейчас нет на сайте
| Цитата OpenGOO (  ) Texture texSpr[256]; texSpr[nomer_kadra].load(filename, renderer);
У меня несколько иначе. У меня в одном объекте класса заключён массив текстур, а не на каждый объект класса по текстуре.
И я вот что думаю. Если уничтожить объект, то и указатели на текстуры должны уничтожиться. Следовательно, и память должна освободиться ?
|
|
| |
Alkosha | Дата: Четверг, 28 Августа 2014, 09:55 | Сообщение # 82 | Тема: как за раз удалить массив текстур SDL2 ? |
участник
Сейчас нет на сайте
| C динамическим массивом и конструктором\деструктором разобрался.
Но вот как создать "в куче" массив определённого объекта ?
пробовал myObject *obj [255]= new myObject; (и так пробовал myObject *obj = new myObject[255];) Компилятор ругается (точное содержание его ругани не запомнил). Конструктор и деструктор в классе присутствует. Один объект создаётся\уничтожается корректно.
Заодно хотелось бы узнать, как этот массив потом дэстройнуть.
|
|
| |
Alkosha | Дата: Четверг, 28 Августа 2014, 19:06 | Сообщение # 83 | Тема: как за раз удалить массив текстур SDL2 ? |
участник
Сейчас нет на сайте
| Цитата Snake174 (  ) myObject *obj[ 255 ];
obj[0] = new myObject(...);
вот тут на второй строке пишет Цитата E:\TURBO\platform3\main.cpp|808|error: 'tileTex' does not name a type|
(tileTex - это то же, что и в вашем примере obj)
|
|
| |
Alkosha | Дата: Воскресенье, 31 Августа 2014, 10:24 | Сообщение # 84 | Тема: как за раз удалить массив текстур SDL2 ? |
участник
Сейчас нет на сайте
| Код class myTileTex { public: bool mirror=false; SDL_Rect rect; SDL_Texture * tex; myTileTex() { tex=nullptr; }; void load( char* filename ) { tex = IMG_LoadTexture(renderer, filename); SDL_QueryTexture(tex, NULL, NULL, &rect.w, &rect.h); } ~myTileTex() { if (tex) { SDL_DestroyTexture(tex); tex= nullptr; } } };
myTileTex *tileTex[ 255 ]; tileTex[0] = new myTileTex(); Добавлено (31.08.2014, 10:24) --------------------------------------------- Всё-таки вот такое объявление сработало. Код myTileTex *tileTex = new myTileTex[255];
Прога пашет норм, а вот по завершению, если выйти из неё - крашит.
ТайлТєкс взаимосвязан с классом лэйер. При загрузке Код layer1->SetTilePos(a,b,c); на лэйер (слой) добавляются тайлтэксы (картинки разного размера, так что тайлами их сложно назвать) Код class layer { int r=255,g=255,b=255; public: float far; int tilenum; SDL_Rect position[255]; int indextile[255]; layer() { tilenum=0; }
void RGB(int R,int G,int <img src="http://s12.ucoz.net/sm/1/cool.gif" border="0" align="absmiddle" alt="cool" /> { r=R;g=G;b=B; } void mirror() { tileTex[tilenum].mirror=true; }
void SetTilePos(int i,int x,int y) {
position[tilenum].x = x*32; // установка позиции тайлов position[tilenum].y = y*32;
indextile[tilenum]= i; tilenum++; }
void display(){
for(int i=0;i<tilenum; i++) {
SDL_Rect DestRb1; DestRb1.x = position[i].x-cum.x/far; DestRb1.y = position[i].y-cum.y;
DestRb1.w =(tileTex[indextile[i]].rect.w); DestRb1.h =(tileTex[indextile[i]].rect.h); if(DestRb1.x>0-DestRb1.w&&DestRb1.x<800){
int r1,g1,b1;
if(r>=256||g>=256||b>=256) { if(r>=256)int r1=r-255; else r1=0; if(g>=256)int g1=g-255; else g1=0; if(b>=256)int b1=b-255; else b1=0;
SDL_SetTextureColorMod(tileTex[indextile[i]].tex,r1,g1,b1); } else SDL_SetTextureColorMod(tileTex[indextile[i]].tex,0,0,0);
SDL_SetTextureBlendMode(tileTex[indextile[i]].tex,SDL_BLENDMODE_BLEND );
if(tileTex[i].mirror) { SDL_RendererFlip flip = SDL_FLIP_HORIZONTAL; SDL_RenderCopyEx(renderer, tileTex[indextile[i]].tex , NULL, &DestRb1, NULL, NULL, flip); }else SDL_RenderCopy(renderer, tileTex[indextile[i]].tex , NULL, &DestRb1);//маска
if(r>=256||g>=256||b>=256) { if(r>=256) r1=255; else r1=r; if(g>=256) g1=255; else g1=g; if(b>=256) b1=255; else b1=b; SDL_SetTextureColorMod(tileTex[indextile[i]].tex,r1,g1,b1); } else SDL_SetTextureColorMod(tileTex[indextile[i]].tex,r,g,b);
SDL_SetTextureBlendMode(tileTex[indextile[i]].tex,SDL_BLENDMODE_ADD );
if(tileTex[i].mirror) { SDL_RendererFlip flip = SDL_FLIP_HORIZONTAL; SDL_RenderCopyEx(renderer, tileTex[indextile[i]].tex , NULL, &DestRb1, NULL, NULL, flip); }else SDL_RenderCopy(renderer, tileTex[indextile[i]].tex, NULL, &DestRb1);
} } } ~layer() {
delete[] tileTex;
} };
layer *layer1= new layer; layer *layer2= new layer;
Код class myTileTex { public: bool mirror=false; SDL_Rect rect; SDL_Texture * tex; myTileTex() { tex=nullptr; }; void load( char* filename ) { tex = IMG_LoadTexture(renderer, filename); SDL_QueryTexture(tex, NULL, NULL, &rect.w, &rect.h); } ~myTileTex() { if (tex) { SDL_DestroyTexture(tex); tex= nullptr; } } };
myTileTex *tileTex = new myTileTex[255];
по завершению выполняю. Код delete [] layer1; delete [] layer2;
Прога стала крашить после того, как я сделал тайлтэкс и лэйер "в куче". До этого нормально завершало программу.
|
|
| |
Alkosha | Дата: Воскресенье, 31 Августа 2014, 19:00 | Сообщение # 85 | Тема: как за раз удалить массив текстур SDL2 ? |
участник
Сейчас нет на сайте
| Цитата -l33t-h4xx- (  ) ? А то layer1 удаляй tileTex, layer2 удаляй - в результате одна и та же память освобождается два раза.
Таки верное замечание. Данке шон.
|
|
| |
Alkosha | Дата: Среда, 10 Сентября 2014, 23:15 | Сообщение # 86 | Тема: Морфинг текстур на SDL2. Реально ? |
участник
Сейчас нет на сайте
| Можно ли с минимальной нагрузкой на CPU (то есть без попиксельного считывания текстуры, a-ля getpixel setpixel) морфить текстурки помимо вытягивания по вертикали\горизонтали ? В частности интересен вот этот эффект https://www.youtube.com/watch?v=tuLgJeXBB-A#t=53 https://www.youtube.com/watch?f....#t=2415
В принципе мысль есть. Нужно просто выстроить тайлы с горизонтальным сжатием по синусу (или косинусу) в полупериод. Сложно будет подгонять позиционирование каждого тайла.
Сообщение отредактировал Alkosha - Четверг, 11 Сентября 2014, 01:07 |
|
| |
Alkosha | Дата: Пятница, 12 Сентября 2014, 02:07 | Сообщение # 87 | Тема: Морфинг текстур на SDL2. Реально ? |
участник
Сейчас нет на сайте
| Так то да. В быдло-тоадс морфинга не происходит по сути, так как дендя аппаратно не способна на такие вещи, только строго "пререндеренные" тайлы из ПЗУ выводит (хотя в некоторых случаях умудряются даже векторную графику (игра "elite") заносить в область ОЗУ, а затем из неё видео-генератором выводить потайлово.) А это, между прочим, вполне интересная мысля. Ведь в моём случае можно поступить так же - отрендерить несколько кадров вращения. Кстати, на NES есть порт nebulus'a, только называется castelian. Графон там покруче спектрумовского (в виду наличия тайл\спрайт-генератора, и ПЗУ картриджа денди больше по килобайтам, чем встроенного ОЗУ тогдашнего спектрума. Это щас аматоры допаивают в спектрум по 4 мегабайта ОЗУ и видеоконтроллеры VGA-уровня).
По поводу шреддеров на оупенГЛ - в Шреддерах я нубец , это раз. И я даже не осилю настроить проект кодблокса на SDL2+openGL , это два.Добавлено (11.09.2014, 12:31) ---------------------------------------------
Цитата -l33t-h4xx- (  ) Если возможность использовать GPU не интересует GPU уже используется, так как в SDL2 есть хардварная поддержка 2д. Но шреддеров там всё ещё нет, увы. Всё сводится к одному - прикрутить параллельно openGLДобавлено (12.09.2014, 02:02) --------------------------------------------- Готово:
 Добавлено (12.09.2014, 02:07) --------------------------------------------- С платформами сложнее будет. Так как в данный момент "движок" (если мою парашу вообще можно так назвать) ориентирован исключительно на стандартный "платфоринг" типа Марио (только с возможностью перемещения вдоль по ступенькам).
|
|
| |
Alkosha | Дата: Суббота, 04 Октября 2014, 23:04 | Сообщение # 88 | Тема: Обнуляется один из элементов массива. |
участник
Сейчас нет на сайте
| Не пойму, почему обнуляется один из элементов массива, тогда как остальные элементы ведут себя адекватно. Может я дико туплю...
Код class myPers { int ft[4];//frametime ...
void attackready() { if(power<128)power++; dx=0; ft[4]++; cout <<ft[4]<<endl; attackf=true; if(ft[4]>20){frameNum=16;} else if(ft[4]>10)frameNum=15; else if (ft[4]>0)frameNum=14; } ... } myPers *pers = new myPers; Более ft[4] нигде не фигурирует.
Сообщение отредактировал Alkosha - Суббота, 04 Октября 2014, 23:06 |
|
| |
Alkosha | Дата: Воскресенье, 05 Октября 2014, 01:10 | Сообщение # 89 | Тема: Обнуляется один из элементов массива. |
участник
Сейчас нет на сайте
| Цитата Alkosha (  ) Может я дико туплю... Точно туплю.
Спасибо, выручили.
|
|
| |
Alkosha | Дата: Вторник, 07 Октября 2014, 10:15 | Сообщение # 90 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| Реально ли (если реально, то как) сделать функцию так, чтоб ей можно было передавать три аргумента, а так же можно было бы и два аргумента передавать, не указывая третий (при этом третий аргумент принимал бы дэфолтное значение, указанное внутри функции) ?
То есть чтобы можно было бы одну и ту же функцию и так вызывать: func(X,Y,Z); и вот так: func(X,Y); [чтоб компилятор не ругался на некорректное количество аргументов]
|
|
| |
Alkosha | Дата: Понедельник, 13 Октября 2014, 09:02 | Сообщение # 91 | Тема: Вопрос-Ответ (C++) |
участник
Сейчас нет на сайте
| А вот ещё один нубский вопрос. Есть два разных класса, и каждому из них необходимо получать результаты переменных друг друга.
То есть class MyClass1 { int a=228; int b;
b=B.b; } MyClass1 A;
class MyClass2 { int a; int b=1488;
a= A.a; } MyClass2 B;
В данном случае если класс А будет объявлен раньше, компилятор выдаст сообщение об ошибке, что не объявлен клас B в строчке присвоения переменной. И наоборот.
Сообщение отредактировал Alkosha - Понедельник, 13 Октября 2014, 09:02 |
|
| |
Alkosha | Дата: Понедельник, 20 Октября 2014, 09:29 | Сообщение # 92 | Тема: Как вычислить приращения по осям координат? |
участник
Сейчас нет на сайте
| Как расчитать dx и dy, зная начальные координаты объекта X1Y1 и конечные X2Y2 (куда этот объект должен переместиться) ? 
|
|
| |
Alkosha | Дата: Понедельник, 20 Октября 2014, 18:17 | Сообщение # 93 | Тема: Как вычислить приращения по осям координат? |
участник
Сейчас нет на сайте
| Цитата OpenGOO (  ) ты что вектор скорости хочешь найти?
Хотел найти переменные, которые нужны для инкремента\декремента текущего значения X и Y объекта таким образом, чтоб при каждом проходе в цикле он из пункта А в пункт B переместился по кратчайшему пути, то бишь по отрезку, изображённому выше.
float X,Y; // координаты объекта float X1,Y1; // координаты конечной позиции calculate() { ... // тут считаем dx, dy }
for (;;) { X+=dx; Y+=dy; ... }
|
|
| |
Alkosha | Дата: Понедельник, 20 Октября 2014, 20:34 | Сообщение # 94 | Тема: Как вычислить приращения по осям координат? |
участник
Сейчас нет на сайте
| Пасиба. Версия daun'a, на мой взгляд, менее замудрённая и безо всякой тригонометрии и проверок. Вроде бы пашет корректно.Добавлено (20.10.2014, 20:34) --------------------------------------------- правда там равнозамедленное движение... ну в принципе и так сойдёт.
|
|
| |
Alkosha | Дата: Вторник, 21 Октября 2014, 15:29 | Сообщение # 95 | Тема: Как вычислить приращения по осям координат? |
участник
Сейчас нет на сайте
| Чёто непонятная шляпа какая-то получается (впрочем, как и всегда).
По первому предложенному варианту Код { auto endpointx=pers->x+250, endpointy=pers->y-100; auto vx = endpointx - x; auto vy = endpointy - y; auto len = sqrt(vx*vx + vy*vy); if(len!=0){ vx = vx/len; vy = vy/len;
auto dx = vx * 20; auto dy = vy * 20; } else {dx=0; dy=0;}
если переменная speed = 10 - то объект движется строго прямо куда-то в бесконечность ( значительно дальше endpoint'ов), при speed = 15 - уже под скос вперёд\вниз. при 20 - вообще в диаметрально противоположном направлении.
Во втором варианте корректно движется только вперёд. Код int endpointx=pers->x+250, endpointy=pers->y-100; dx=(endpointx-x)/5; dy=(endpointy-y)/5; if(x>=endpointx-2&&x<=endpointx+2)trigger=RETURN;
Вот это срабатывает по триггеру в состоянии RETURN Код if(trigger==RETURN) { int endpointx=pers->x, endpointy=pers->y; dx=(endpointx-x)/5; dy=(endpointy-y)/5;
if(x>=endpointx-10&&x<=endpointx+10)trigger=IDLE; }
И именно когда срабатывает RETURN, то тоже непонятно куда назад улетает, хотя курс правильный. Вот только в состояние IDLE он переходит аж далеко-о-о за тем значением endpoint'a, при котором он должен вернутся.
А если в теле триггера RETURN указать endpoint, например, int endpointx=pers->x+350, endpointy=pers->y-150; То именно в ту точку он правильно переместится.
Это пока ещё не пробовал. Цитата Если просто перемещение объекта в заданную точку, самое простое и классическое.
Добавлено (21.10.2014, 15:23) --------------------------------------------- Код {в рабочем цикле} угол=-math.ArcTan2(x-цельX,y-цельY)/pi*180; // по углу легко поворачивать спрайт x=x+sin(угол*pi/180)*скорость; y=y-cos(угол*pi/180)*скорость;
Смущает тригонометрия в цикле. Может её как-то можно обойти для оптимизации ?
Добавлено (21.10.2014, 15:29) --------------------------------------------- Хотя тут достаточно единожды высчитать dx dy до следующего изменения конечной позиции. Но если конечная точка динамически будет менятся, и траэкторию нужно расчитать для целого массива объектов (предположим, будут куча самонаводящихся ракет на игрока), то лишняя тригонометрия будет давать о себе знать, наверное.
Хотя на нынешних гигагерцах может и не будет. Не знаю.
Сообщение отредактировал Alkosha - Вторник, 21 Октября 2014, 15:31 |
|
| |
Alkosha | Дата: Вторник, 21 Октября 2014, 18:08 | Сообщение # 96 | Тема: Как вычислить приращения по осям координат? |
участник
Сейчас нет на сайте
| Цитата MrNesh (  ) Один раз находим как надо менять x и y, а потом этот результат прибавлять
Это в случае если пункт назначения статический. В динамике нужно каждый раз обновлять.
|
|
| |
Alkosha | Дата: Четверг, 23 Октября 2014, 09:04 | Сообщение # 97 | Тема: 3д моделирование под Irrlicht engine |
участник
Сейчас нет на сайте
| Интересуют все тонкости создания 3д моделек для иррлихта. Если кто занимался подготовкой статических и анимированных моделек, а так же созданием локаций на иррлихт, расскажите вкратце making of, пожалуйста.
Планирую сделать сайдскроллер (леталку-стрелялку ). Наверное , можно обойтись и без bsp-уровней , достаточно только пару тройку нод перемещать относительно игрока в качестве бэкграунда (но и инфа по созданию bsp-локаций тоже будет интересной).
Сообщение отредактировал Alkosha - Четверг, 23 Октября 2014, 16:48 |
|
| |
Alkosha | Дата: Четверг, 23 Октября 2014, 21:35 | Сообщение # 98 | Тема: 3д моделирование под Irrlicht engine |
участник
Сейчас нет на сайте
| Цитата SEvg (  ) Редакторы все используют любые, от Блендера до Макса....
Помню делал одну модельку в 3д максе. Анимировал в 3ds - в ирке её искарёжило в кизяк. ровно, как и в блэндере. Причём статическая модель без анимашки нормально отображается. И там меш был разбит на сегменты. Может из-за этого ? Там каждый сегмент рандомно был повёрнут и отмасштабирован в самом движке.Добавлено (23.10.2014, 21:35) --------------------------------------------- В максе удобнее моделить меш, нежели в блэндре. Сколько бы я не пытался, всё к блэндеровскому интерфейсу не привыкну.
|
|
| |
Alkosha | Дата: Пятница, 24 Октября 2014, 00:11 | Сообщение # 99 | Тема: Как вычислить приращения по осям координат? |
участник
Сейчас нет на сайте
| Цитата OpenGOO (  ) Вот здесь ошибка. У тебя начальная точка там где находится pers, а вычитаешь какие то x и y.
Это X и Y того объекта, который должен добраться до оффсета относительно персонажа.Добавлено (24.10.2014, 00:11) ---------------------------------------------
Цитата OpenGOO (  ) У тебя начальная точка там где находится pers, Начальная точка там, где находится X Y, а не pers->X pers->Y
|
|
| |
Alkosha | Дата: Пятница, 24 Октября 2014, 16:18 | Сообщение # 100 | Тема: 3д моделирование под Irrlicht engine |
участник
Сейчас нет на сайте
| Цитата SEvg (  ) Используй х-формат
Точно не помню, но вроде бы даже с пандовской *.X , экспортированной из макса , иррка не в ладах. В смысле со скелеткой. Со статическим мэшем всё гут.
Добавлено (24.10.2014, 16:11) --------------------------------------------- И в b3d когда экспортил из макса - искарёжено в иррлихте и в блэндере, причём одинаково.
Добавлено (24.10.2014, 16:12) --------------------------------------------- может нужно какую-то промежуточную совфтину использовать для экспорта из максовсково формата, в блэндеровский ?
Добавлено (24.10.2014, 16:18) --------------------------------------------- Так же интересует, какой софт используете для текстурирования. И ещё, есть симметричные модели, каким образом сделать развёртку, чтоб рисовать текстуру нужно было только на одну половину ?
Сообщение отредактировал Alkosha - Пятница, 24 Октября 2014, 16:18 |
|
| |
|