[update] Implemented a background transition for selecting songs.

This commit is contained in:
falsycat 2019-10-13 00:00:00 +00:00
parent 1a289a6dda
commit 7e41c98cd3
3 changed files with 44 additions and 15 deletions

View File

@ -9,7 +9,7 @@
"play-offset": 1000,
"play-loop": 2000,
"bg-inner-color": [0.8, 0.8, 0.8, 1],
"bg-outer-color": [0.8, 0.8, 0.8, 1]
"bg-outer-color": [0.1, 0.1, 0.1, 1]
}
}
]

View File

@ -120,14 +120,14 @@ private class FirstSetupState : AbstractSceneState {
public:
this(SelectScene owner) {
super(owner);
stage_appear_state_ = new StageAppearState(owner);
stage_appear_state_ = new SongAppearState(owner);
}
enum AnimeFrames = 30;
enum BgInnerColor = vec4(0.8, 0.6, 0.6, 1);
enum BgInnerColor = vec4(0.4, 0.2, 0.2, 1);
enum BgOuterColor = vec4(-0.4, -0.4, -0.4, 1);
enum CubeRotationSpeed = vec3(0, PI/10, 0);
enum CubeRotationSpeed = vec3(0, PI/5, 0);
enum CubeInterval = 0.06;
void Initialize() {
@ -154,7 +154,7 @@ private class FirstSetupState : AbstractSceneState {
}
private:
StageAppearState stage_appear_state_;
SongAppearState stage_appear_state_;
Animation anime_;
@ -163,7 +163,7 @@ private class FirstSetupState : AbstractSceneState {
Easing!float cube_interval_ease_;
}
private class StageAppearState : AbstractSceneState {
private class SongAppearState : AbstractSceneState {
public:
this(SelectScene owner) {
super(owner);
@ -177,7 +177,16 @@ private class StageAppearState : AbstractSceneState {
anime_ = Animation(AnimeFrames);
cube_interval_ease_ = Easing!float(owner.lobby_.cube_interval, 0.005);
auto lobby = owner.lobby_;
cube_rota_speed_ease_ = Easing!vec3(
FirstSetupState.CubeRotationSpeed, CubeRotationSpeed);
cube_interval_ease_ = Easing!float(lobby.cube_interval, 0.005);
with (owner.songs_[song_index_].preview) {
bg_inner_ease_ = Easing!vec4(lobby.background.inner_color, bg_inner_color);
bg_outer_ease_ = Easing!vec4(lobby.background.outer_color, bg_outer_color);
}
sfSound_setBuffer(owner.sound_, owner.soundres_.spotlight);
sfSound_play(owner.sound_);
@ -185,9 +194,11 @@ private class StageAppearState : AbstractSceneState {
override UpdateResult Update(KeyInput input) {
const ratio = anime_.Update();
owner.lobby_.cube_matrix.rotation += CubeRotationSpeed +
(FirstSetupState.CubeRotationSpeed - CubeRotationSpeed) * (1-ratio);
owner.lobby_.cube_matrix.rotation += cube_rota_speed_ease_.Calculate(ratio);
owner.lobby_.cube_interval = cube_interval_ease_.Calculate(ratio);
owner.lobby_.background.inner_color = bg_inner_ease_.Calculate(ratio);
owner.lobby_.background.outer_color = bg_outer_ease_.Calculate(ratio);
return CreateResult(this);
}
@ -196,5 +207,9 @@ private class StageAppearState : AbstractSceneState {
Animation anime_;
Easing!vec3 cube_rota_speed_ease_;
Easing!float cube_interval_ease_;
Easing!vec4 bg_inner_ease_;
Easing!vec4 bg_outer_ease_;
}

View File

@ -6,8 +6,7 @@ import std.array,
std.exception,
std.json,
std.path,
std.string,
std.typecons;
std.string;
import derelict.sfml2.audio,
derelict.sfml2.system;
@ -26,9 +25,9 @@ class Song {
size_t play_offset;
///
Nullable!vec4 bg_inner_color;
vec4 bg_inner_color = vec4(0, 0, 0, 0);
///
Nullable!vec4 bg_outer_color;
vec4 bg_outer_color = vec4(0, 0, 0, 0);
}
///
@ -51,7 +50,13 @@ class Song {
music_ = sfMusic_createFromFile(music_path.toStringz).enforce;
script_path_ = buildPath(basepath, json["script"].str);
// TODO: update preview config
with (preview_) {
const preview_json = json["preview"];
play_offset = preview_json["play-offset"].integer;
bg_inner_color = GetVectorFromJson!4(preview_json["bg-inner-color"]);
bg_outer_color = GetVectorFromJson!4(preview_json["bg-outer-color"]);
}
}
~this() {
sfMusic_destroy(music_);
@ -83,6 +88,15 @@ class Song {
static float GetNumericAsFloatFromJson(in JSONValue json) {
return json.type == JSONType.float_? json.floating: json.integer;
}
static Vector!(float, dim) GetVectorFromJson(size_t dim)(in JSONValue json) {
(json.array.length == dim).enforce;
Vector!(float, dim) v;
static foreach (i; 0..dim) {
v.vector[i] = GetNumericAsFloatFromJson(json.array[i]);
}
return v;
}
string name_;