| 
| 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 |  |  |  |  |