-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathParticleSystem.cpp
More file actions
118 lines (109 loc) · 2.84 KB
/
ParticleSystem.cpp
File metadata and controls
118 lines (109 loc) · 2.84 KB
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
#include "stdafx.h"
#include "ParticleSystem.h"
#include "image.h"
ParticleSystem::ParticleSystem(image* particleImage, int num, int frameTerm)
{
_particleImage = particleImage;
_num = num;
_minDuration = 1000;
_maxDuration = 1000;
_minSpeed = 1.0f;
_maxSpeed = 1.0f;
_isLoop = true;
_isStop = false;
_gravity = 0;
_frameTerm = frameTerm;
for (int i = 0; i < _num; i++) {
_particle.push_back(Particle());
_particle[i].isEmission = false;
_particle[i].curFrame = 0;
}
}
ParticleSystem::~ParticleSystem()
{
}
void ParticleSystem::Emission(int idx)
{
if (_particle[idx].isEmission == false) {
if (_minAngle == 0 && _maxAngle == 0) {
_particle[idx].angle = RND->getFloat(PI2);
}
else {
_particle[idx].angle = RND->getFromFloatTo(_minAngle, _maxAngle);
}
//_particle[idx].img = _particleImage;
_particle[idx].x = this->_x;
_particle[idx].y = this->_y;
_particle[idx].isEmission = true;
_particle[idx].speedX = cosf(_particle[idx].angle) * RND->getFromFloatTo(_minSpeed, _maxSpeed);
_particle[idx].speedY = -sinf(_particle[idx].angle) * RND->getFromFloatTo(_minSpeed, _maxSpeed);
if (this->_minDuration == this->_maxDuration)
_particle[idx].duration = this->_minDuration;
else
_particle[idx].duration = RND->getFromIntTo(_minDuration, _maxDuration);
_particle[idx].activeTime = 0;
_emissionNum = idx + 1;
if (_emissionNum == _num && _isLoop == true) {
_emissionNum = 0;
}
}
}
void ParticleSystem::EmissionAll()
{
for (int i = 0; i < _num; i++) {
Emission(i);
}
}
void ParticleSystem::Update()
{
_x = gameObject->transform->position.x;
_y = gameObject->transform->position.y;
if (_isStop == false) {
_deltaTime += 10;
if (_deltaTime >= _interval && _interval != 0) {
_deltaTime = 0;
if (_emissionNum != _num)
Emission(_emissionNum);
}
else if (_interval == 0) {
if (_emissionNum != _num)
EmissionAll();
}
}
for (int i = 0; i < _num; i++) {
if (_particle[i].isEmission == false) continue;
_particle[i].activeTime += 10;
_particle[i].frameTick++;
if (_particle[i].frameTick == _frameTerm) {
_particle[i].frameTick = 0;
_particle[i].curFrame++;
if (_particle[i].curFrame == _particleImage->getMaxFrameX())
_particle[i].curFrame = 0;
}
if (_particle[i].activeTime >= _particle[i].duration) {
_particle[i].isEmission = false;
}
_particle[i].x += _particle[i].speedX;
_particle[i].y += _particle[i].speedY;
_particle[i].speedY += _gravity;
}
}
void ParticleSystem::Render()
{
for (int i = 0; i < _num; i++) {
if (_particle[i].isEmission == false) continue;
_particleImage->frameRender(_backBuffer->getMemDC(), _particle[i].x, _particle[i].y, _particle[i].curFrame, 0);
}
}
void ParticleSystem::Play()
{
_isStop = false;
_emissionNum = 0;
for (int i = 0; i < _num; i++) {
_particle[i].isEmission = false;
}
}
void ParticleSystem::Stop()
{
_isStop = true;
}