-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathorb_collect_effect.cpp
More file actions
116 lines (104 loc) · 3.63 KB
/
Copy pathorb_collect_effect.cpp
File metadata and controls
116 lines (104 loc) · 3.63 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
#include "orb_collect_effect.h"
#include <cmath>
using namespace DirectX;
namespace
{
constexpr int FAST_PARTICLE_COUNT = 32;
constexpr int TRAIL_PARTICLE_COUNT = 18;
constexpr float PLAYER_SIDE_SPAWN_OFFSET = 0.45f;
constexpr float PI = 3.14159265f;
XMFLOAT3 GetInsideAcceleration(int face, float strength)
{
switch (face)
{
case 0: return { 0.0f, strength, 0.0f };
case 1: return { strength, 0.0f, 0.0f };
case 2: return { 0.0f, -strength, 0.0f };
case 3: return { -strength, 0.0f, 0.0f };
default: return { 0.0f, 0.0f, 0.0f };
}
}
}
OrbCollectEffect::OrbCollectEffect()
: ParticleManager("asset/texture/orb_collect_particle.png", 320),
m_RandomState(0x13579BDFu)
{
}
float OrbCollectEffect::Random01()
{
m_RandomState = m_RandomState * 1664525u + 1013904223u;
return static_cast<float>((m_RandomState >> 8) & 0x00FFFFFFu) / 16777215.0f;
}
float OrbCollectEffect::RandomRange(float minValue, float maxValue)
{
return minValue + (maxValue - minValue) * Random01();
}
void OrbCollectEffect::Spawn(const XMFLOAT3& position, int face)
{
// 大きさと回転が異なる発光を重ね、取得した瞬間を強調する。
for (int i = 0; i < 3; ++i)
{
Particle flash;
flash.position = position;
// 発光の中心も少しプレイヤー側へ寄せ、取得位置とのつながりを保つ。
flash.position.z -= PLAYER_SIDE_SPAWN_OFFSET * 0.5f;
flash.startSize = 2.2f - i * 0.5f;
flash.endSize = 0.08f;
flash.rotation = RandomRange(-40.0f, 40.0f);
flash.angularVelocity = (i % 2 == 0) ? 260.0f : -320.0f;
flash.lifetime = 0.18f + i * 0.07f;
Emit(flash);
}
// 高速の炎を大きく放射し、取得直後の勢いを作る。
for (int i = 0; i < FAST_PARTICLE_COUNT; ++i)
{
const float angle = (2.0f * PI * i / FAST_PARTICLE_COUNT) + RandomRange(-0.16f, 0.16f);
const float radialSpeed = RandomRange(2.5f, 5.5f);
Particle particle;
// 発生地点をプレイヤー側へ寄せ、Orb消滅後も手元で粒子が見えるようにする。
particle.position = {
position.x + RandomRange(-0.12f, 0.12f),
position.y + RandomRange(-0.12f, 0.12f),
position.z - PLAYER_SIDE_SPAWN_OFFSET + RandomRange(-0.12f, 0.12f)
};
particle.velocity = {
std::cos(angle) * radialSpeed,
std::sin(angle) * radialSpeed,
RandomRange(-6.0f, -3.0f)
};
particle.acceleration = GetInsideAcceleration(face, 0.9f);
particle.startSize = RandomRange(0.25f, 0.55f);
particle.endSize = 0.02f;
particle.rotation = RandomRange(-50.0f, 50.0f);
particle.angularVelocity = RandomRange(-420.0f, 420.0f);
particle.damping = 1.9f;
particle.lifetime = RandomRange(0.3f, 0.55f);
Emit(particle);
}
// 遅い小粒を長く残し、プレイヤーへ吸収される余韻を作る。
for (int i = 0; i < TRAIL_PARTICLE_COUNT; ++i)
{
const float angle = RandomRange(0.0f, 2.0f * PI);
const float radialSpeed = RandomRange(0.8f, 2.0f);
Particle particle;
// 余韻は高速粒子より少し手前から出し、プレイヤー付近の密度を高める。
particle.position = {
position.x + RandomRange(-0.18f, 0.18f),
position.y + RandomRange(-0.18f, 0.18f),
position.z - PLAYER_SIDE_SPAWN_OFFSET * 1.5f + RandomRange(-0.18f, 0.18f)
};
particle.velocity = {
std::cos(angle) * radialSpeed,
std::sin(angle) * radialSpeed,
RandomRange(-3.0f, -1.0f)
};
particle.acceleration = GetInsideAcceleration(face, 0.35f);
particle.startSize = RandomRange(0.15f, 0.32f);
particle.endSize = 0.01f;
particle.rotation = RandomRange(-45.0f, 45.0f);
particle.angularVelocity = RandomRange(-180.0f, 180.0f);
particle.damping = 0.9f;
particle.lifetime = RandomRange(0.55f, 0.9f);
Emit(particle);
}
}