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