Пятница, 22 Ноября 2024, 12:20

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Система частиц. Помогите исправить...Пожалуйста
AlkoshaДата: Пятница, 20 Июня 2014, 13:50 | Сообщение # 1
участник
Сейчас нет на сайте
Пока хочу реализовать для начала эффект дождя.

Сперва инициализирую
начальное направление частиц, а так же спрайт (в дальнейшем ещё добавлю переменные для размеров эмиттера и плотности испускания частиц)
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
  • Страница 1 из 1
  • 1
Поиск:

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