This repository was archived by the owner on Dec 1, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathParticleManager.cs
109 lines (91 loc) · 4.84 KB
/
ParticleManager.cs
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
using OpenTK;
using StorybrewCommon.Scripting;
using StorybrewCommon.Storyboarding;
using System;
namespace StorybrewScripts
{
class ParticleManager : StoryboardObjectGenerator
{
SpritePools pool;
public override void Generate()
{
using (pool = new SpritePools(GetLayer("")))
{
Danmaku(44810, 65149, 5000);
Danmaku(44810, 65149, 5000, true);
Danmaku(109895, 126166, 5000);
Danmaku(109895, 126166, 5000, true);
FallingDownParticle(88200, 109895, true);
FallingDownParticle(131590, 151929);
FallingDownParticle(174980, 217370, true);
}
}
void Danmaku(int startTime, int endTime, int speed, bool reverse = false)
{
var basePosition = new Vector2(470, 165);
for (var i = 0; i < 4; i++)
{
var angle = (reverse ? -Math.PI / 2 : Math.PI / 2) * i;
for (var l = 0; l < 50; l++)
{
var endPosition = new Vector2(
(float)(basePosition.X + Math.Cos(angle) * 500),
(float)(basePosition.Y + Math.Sin(angle) * 500));
var loopCount = (endTime - startTime - l * 35) / speed;
var sprite = pool.Get(startTime + l * 100, startTime + speed * loopCount, "sb/p.png");
sprite.StartLoopGroup(startTime + l * 100, loopCount);
sprite.Move(0, speed, basePosition, endPosition);
sprite.Rotate(OsbEasing.In, 0, speed, angle, angle + (reverse ? 1 : -1));
sprite.ScaleVec(OsbEasing.In, speed / 6, speed, 10, 1, 10, 0);
sprite.Fade(OsbEasing.OutCubic, speed / 6, speed / 3, 0, 1);
sprite.Fade(speed, 1);
sprite.EndGroup();
angle += reverse ? -Math.PI / 50 : Math.PI / 50;
}
}
}
void FallingDownParticle(int startTime, int endTime, bool circles = false)
{
for (var i = 0; i < (circles ? 125 : 200); i++)
{
var speed = Random(5000, 10000);
var particleFade = Random(0.1, 0.8);
var startPos = new Vector2(Random(-107, 747), -10);
var rotation = Random(-Math.PI / 2, Math.PI / 2);
var realStart = startTime + i * 40 > startTime + speed / 10 ? startTime + i * 50 - speed : startTime + i * 50;
var sprite = pool.Get(realStart < startTime ? startTime : realStart, startTime + ((endTime - realStart) / speed + 1) * speed,
"sb/p.png", OsbOrigin.Centre, new Vector2(startPos.X, 0), true, i);
sprite.StartLoopGroup(realStart, (endTime - realStart) / speed + 1);
sprite.MoveY(0, speed, startPos.Y, 490);
int scale = Random(5, 10);
sprite.ScaleVec(0, speed / 2, scale, scale, scale, -scale);
sprite.ScaleVec(speed / 2, speed, scale, -scale, scale, scale);
sprite.Rotate(0, speed / 2, -rotation, rotation);
sprite.Rotate(speed / 2, speed, rotation, rotation * 2);
sprite.EndGroup();
sprite.Fade(startTime, startTime + speed / 10, 0, particleFade);
sprite.Fade(endTime, endTime + speed / 10, particleFade, 0);
if (circles)
{
var circleSpeed = Random(5000, 10000);
var fade = Random(0.1, 0.8);
var posStart = new Vector2(Random(-107, 747), -10);
var rot = Random(-Math.PI / 2, Math.PI / 2);
var start = startTime + i * 50 > startTime + circleSpeed / 10 ? startTime + i * 50 - circleSpeed : startTime + i * 50;
var circle = pool.Get(start < startTime ? startTime : start, startTime + ((endTime - start) / circleSpeed + 1) * circleSpeed,
"sb/c.png", OsbOrigin.Centre, new Vector2(posStart.X, 0), true, i);
circle.StartLoopGroup(start, (endTime - start) / circleSpeed + 1);
circle.MoveY(0, circleSpeed, posStart.Y, 490);
double cScale = Random(0.025f, 0.05f);
circle.ScaleVec(0, circleSpeed / 2, cScale, cScale, cScale, -cScale);
circle.ScaleVec(circleSpeed / 2, circleSpeed, cScale, -cScale, cScale, cScale);
circle.Rotate(0, circleSpeed / 2, -rot, rot);
circle.Rotate(circleSpeed / 2, circleSpeed, rot, rot * 2);
circle.EndGroup();
circle.Fade(startTime, startTime + circleSpeed / 10, 0, fade);
circle.Fade(endTime, endTime + circleSpeed / 10, fade, 0);
}
}
}
}
}