0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
1

Система частиц в 2D

28.09.2014, 15:18. Показов 1599. Ответов 6
Метки нет (Все метки)

Всем привет!!!! подскажите пожалуйста в 2D как можно реализовать систему частиц? что то почитал много всего в интернете, там всё про 3D, в 2D подкрутить не получилось. Может кто -нибудь знает ресурсы посвященные этому вопросу ?
Спасибо за внимание и помощь!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2014, 15:18
Ответы с готовыми решениями:

Эффект разбрасывания частиц от курсора (С++, DirectX)
Здравствуйте уважаемые программисты! Прошу Вашей помощи. Используя C++ и DirectX нужно создать...

Системы частиц (требуется мнение экспертов)
Здравствуйте! Сразу следует упомянуть: я работаю с DirectX 11. Требуется помощь от знающих и,...

Примитивная система частиц?
День добрый :) подскажите пожалуйста, может есть какие не особо тяжкие для понимания новичку...

Эффективная система частиц
что лучше? точки, треугольники? где почитать? ( куча посредственных статей уже была найдена гуглом)...

6
80 / 80 / 19
Регистрация: 07.05.2009
Сообщений: 316
28.09.2014, 15:26 2
magic particles?
1
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
28.09.2014, 18:21  [ТС] 3
Спасибо за совет, но я не это имел ввиду, я хочу написать свой редактор системы частиц ( простенький) и не знаю с чего начать.... Может кто-нибудь знает какие нибудь ресурсы по данной тематике для начинающих!
0
80 / 80 / 19
Регистрация: 07.05.2009
Сообщений: 316
29.09.2014, 00:37 4
Лучший ответ Сообщение было отмечено Misha_prog как решение

Решение

Сделал простейшую систему частиц(без текстур):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include "QapLite.h"
 
class TParticle{
public:
  vec2d pos;
  vec2d v;
  real t;
public:
  TParticle()
  {
    pos=vec2d(0,0);
    v=vec2d(0,0);
    t=0.0;
  }
};
 
class TExplosion{
public:
  string name;
  bool auto_move;
  bool auto_draw;
  bool blend_add;
  vec2d pos;
  int tick;
  int max_tick;
  real particle_beg_size;
  real particle_end_size;
  QapColor particle_beg_color;
  QapColor particle_end_color;
  int particle_life_time;
  int particle_per_tick;
  real particle_min_speed;
  real particle_max_speed;
  real particle_pos_dist;
  real particle_pos_dist_var;
  vec2d particle_grav;
  bool undeadable;
  vector<TParticle> arr;
public:
  TExplosion()
  {
    name=string();
    auto_move=true;
    auto_draw=true;
    blend_add=true;
    pos=vec2d(0,0);
    tick=0;
    max_tick=64;
    particle_beg_size=8;
    particle_end_size=1;
    particle_beg_color=0xff00ff00;
    particle_end_color=0xff000000;
    particle_life_time=32;
    particle_per_tick=4;
    particle_min_speed=100.0/64.0;
    particle_max_speed=400.0/64.0;
    particle_pos_dist=4;
    particle_pos_dist_var=8;
    particle_grav=vec2d(0,0);
    undeadable=false;
    arr=vector<TParticle>();
  }
};
 
 
class TGame:public TD3DGameBoxBuilder{
public:
  vector<TExplosion> explosions;
public:
  TGame()
  {
    vec_add_back(explosions).undeadable=true;
    {
      auto&back=vec_add_back(explosions);
      back.undeadable=true;
      back.pos=vec2d(-200,0);
      back.particle_beg_color=0xff00aa00;
    }
    {
      auto&back=vec_add_back(explosions);
      back.undeadable=true;
      back.pos=vec2d(+200,0);
      back.particle_beg_color=0xff00aa00;
      back.particle_min_speed=40.0/64.0;
      back.particle_max_speed=90.0/64.0;
      back.particle_per_tick=2;
      back.particle_grav=vec2d(0,-0.2);
    }
  }
public:
  void render(TExplosion&ref)
  {
    if(!ref.auto_draw)return;
    QapDev::BatchScope Scope(qDev);
    auto&arr=ref.arr;
    for(int i=0;i<arr.size();i++)
    {
      auto&ex=arr[arr.size()-i-1];
      real t=1.0-ex.t/real(ref.particle_life_time);
      qDev.SetColor(QapColor::Mix(ref.particle_beg_color,ref.particle_end_color,t));
      qDev.DrawQuad(ex.pos,vec2d(1,1)*Lerp(ref.particle_beg_size,ref.particle_end_size,t));
    }
    qDev.SetBlendMode(QapDev::BlendType::BT_SUB);
  }
  void render(vector<TExplosion>&arr)
  {
    for(int i=0;i<arr.size();i++)
    {
      auto&ex=arr[i];
      render(ex);
    }
  }
  void update(vector<TExplosion>&arr)
  {
    clean_if(arr,[](TExplosion&ex){return !ex.undeadable&&(ex.tick>=ex.max_tick)&&ex.arr.empty();});
    for(int i=0;i<arr.size();i++)
    {
      auto&ex=arr[i];
      update(ex);
    }
  }
  void update(TExplosion&ref)
  {
    if(!ref.auto_move)return;
    ref.tick++;
    auto&arr=ref.arr;
    for(int i=0;i<arr.size();i++)
    {
      auto&ex=arr[i];
      ex.pos+=ex.v;
      ex.v+=ref.particle_grav;
      ex.t--;
    }
    clean_if(ref.arr,[](TParticle&ex){return ex.t<=0;});
    if(!ref.undeadable)if(ref.tick>=ref.max_tick)return;
    auto rnd=[]()->real{int n=1024*16;return real(rand()%n)/real(n);};
    auto rnd_ang=[&rnd]()->real{return rnd()*Pi2;};
    for(int i=0;i<ref.particle_per_tick;i++)
    {
      auto&back=vec_add_back(ref.arr);
      auto dist=ref.particle_pos_dist;
      auto dist_var=ref.particle_pos_dist_var;
      auto d=dist+dist_var*(-0.5+rnd());
      back.pos=ref.pos+Vec2dEx(rnd_ang(),d);
      auto ang=rnd_ang();
      auto mag=Lerp(ref.particle_min_speed,ref.particle_max_speed,rnd());
      back.v=Vec2dEx(ang,mag);
      back.t=ref.particle_life_time;
    }
  }
public:
  void DoMove()
  {
    if(win.Keyboard.Down[VK_ESCAPE])win.Close();
    update(explosions);
  }
  void DoDraw()
  {
    qDev.BindTex(0,nullptr);
    QapDev::BatchScope Scope(qDev);
    render(explosions);
  }
};
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
  GlobalEnv global_env(hInstance,hPrevInstance,lpCmdLine,nCmdShow);
  TGame builder;
  builder.DoNice();
}
Исходный код:
http://www.gamedev.ru/files/?id=100179

Норм?

Снимок экрана:
1
Миниатюры
Система частиц в 2D  
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
29.09.2014, 22:29  [ТС] 5
спасибо!!!! очень классно получилось у вас!!!!!Буду читать разбираться в коде!!!!
Огромное Спасибо!!!!
0
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
02.02.2015, 19:17 6
Цитата Сообщение от Adler Посмотреть сообщение
Сделал простейшую систему частиц(без текстур):
ааа я извиняюсь за некропостинг но все же .. Блин можете обьяснить алгоритм как происходит отрисовка частиц ( Не могу вкурить по этому коду . У меня в данный момент типа как дым работает( просто идет вверх и к верху чутку изменяется по оси Х ( если расматривать оси х у) но вот тоже пытаюсь как то взрыв слепить и никак не получается. Пытаюсь найти общие алгоритмы самых простых примитивных , но пока безуспешно . Пытался и сам делать .. фигли в разные стороны послать . Но у меня бок со скоростями. Получается каждаячастица летит со своей скоростью и выходит больше похоже на какой то туман над водой :%(
0
80 / 80 / 19
Регистрация: 07.05.2009
Сообщений: 316
02.02.2015, 19:53 7
Цитата Сообщение от petruchodd Посмотреть сообщение
Блин можете обьяснить алгоритм как происходит отрисовка частиц
тут в коде просто qDev.DrawQuad вызываеться для каждой частицы.

чтобы из тумана сделать взрыв надо:
уменьши размер частиц
увеличь их начальную скорость по модулю.
сделать чтобы все частицы вылетали из одной точки.
уменьшить время жизни частиц.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2015, 19:53

Unity3D 5: Система частиц
1)Бросил на динамический обьект систему частиц,как результат она &quot;стреляет&quot; в локальной системе...

Система частиц в Unity
Как сделать в Unity чтобы частицы появлялись и потом создавали заданный спрайт? Вот пример как...

Вокселы и система частиц
Может мне кто нибудь объяснить в чем разница вокселей и система частиц? Если создать дым или огонь...

Система частиц (эффекты для вашей игры)
Итак, не имея опыта в разработке такого решения я попытаюсь сейчас открыть сам процесс разработки с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.