Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184

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

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

Студворк — интернет-сервис помощи студентам
Всем привет!!!! подскажите пожалуйста в 2D как можно реализовать систему частиц? что то почитал много всего в интернете, там всё про 3D, в 2D подкрутить не получилось. Может кто -нибудь знает ресурсы посвященные этому вопросу ?
Спасибо за внимание и помощь!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.09.2014, 15:18
Ответы с готовыми решениями:

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

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

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

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

Норм?

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

чтобы из тумана сделать взрыв надо:
уменьши размер частиц
увеличь их начальную скорость по модулю.
сделать чтобы все частицы вылетали из одной точки.
уменьшить время жизни частиц.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2015, 19:53
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru