Пятница, 19 Сентября 2025, 16:24

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Результаты поиска
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
Поиск:

Все права сохранены. GcUp.ru © 2008-2025 Рейтинг