Example character level animations.
This commit is contained in:
@ -15,12 +15,27 @@ namespace Dawn {
|
||||
|
||||
template<typename T>
|
||||
struct SimpleAnimation : public Animation {
|
||||
protected:
|
||||
/**
|
||||
* Function for subclasses to be "notified" when the value has been
|
||||
* modified.
|
||||
*/
|
||||
virtual void onValueModified() {
|
||||
|
||||
}
|
||||
|
||||
public:
|
||||
easefunction_t *easing = &easeLinear;
|
||||
T *modifies;
|
||||
std::vector<struct SimpleKeyframe<T>> keyframes;
|
||||
|
||||
/**
|
||||
* Constructs a new Simple Animation instance.
|
||||
*
|
||||
* @param modifies Pointer to the value that will be modified.
|
||||
*/
|
||||
SimpleAnimation(T *modifies) {
|
||||
assertNotNull(modifies);
|
||||
this->modifies = modifies;
|
||||
}
|
||||
|
||||
@ -31,6 +46,8 @@ namespace Dawn {
|
||||
* @param value Value at this given time.
|
||||
*/
|
||||
void addKeyframe(float_t time, T value) {
|
||||
assertTrue(time >= 0);
|
||||
|
||||
struct SimpleKeyframe<T> keyframe;
|
||||
keyframe.time = time;
|
||||
keyframe.value = value;
|
||||
@ -83,6 +100,17 @@ namespace Dawn {
|
||||
this->addSequentialKeyframes(0, frameTime, start, end, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Immediately sets the value, bypassing keyframes and ticks. Useful for
|
||||
* setting an initial value.
|
||||
*
|
||||
* @param value Value to set.
|
||||
*/
|
||||
void setValue(T value) {
|
||||
*modifies = value;
|
||||
this->onValueModified();
|
||||
}
|
||||
|
||||
void tick(float_t delta) override {
|
||||
if(this->finished) return;
|
||||
|
||||
@ -106,6 +134,7 @@ namespace Dawn {
|
||||
if(keyframeCurrent != nullptr && keyframeNext == nullptr) {
|
||||
// "End of animation"
|
||||
*this->modifies = keyframeCurrent->value;
|
||||
this->onValueModified();
|
||||
} else if(keyframeNext != nullptr) {
|
||||
T oldValue;
|
||||
float_t oldTime;
|
||||
@ -127,6 +156,13 @@ namespace Dawn {
|
||||
*this->modifies = oldValue + (
|
||||
(keyframeNext->value - oldValue) * keyframeDelta
|
||||
);
|
||||
this->onValueModified();
|
||||
}
|
||||
|
||||
// First possible frame? I think this can be done cleaner
|
||||
if(this->time == 0 && keyframeCurrent->time == 0) {
|
||||
*this->modifies = keyframeCurrent->value;
|
||||
this->onValueModified();
|
||||
}
|
||||
|
||||
// Update time.
|
||||
|
51
src/dawn/display/animation/SimpleCallbackAnimation.hpp
Normal file
51
src/dawn/display/animation/SimpleCallbackAnimation.hpp
Normal file
@ -0,0 +1,51 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "SimpleAnimation.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
template<typename T, class I>
|
||||
struct SimpleCallbackAnimation : public SimpleAnimation<T> {
|
||||
protected:
|
||||
I *instance;
|
||||
void (I::*callback)(T arg);
|
||||
T value;
|
||||
|
||||
/**
|
||||
* Internally invoke the function that this animation is owning.
|
||||
*/
|
||||
void invoke() {
|
||||
assertNotNull(this->instance);
|
||||
((*this->instance).*(this->callback))(this->value);
|
||||
}
|
||||
|
||||
void onValueModified() override {
|
||||
SimpleAnimation::onValueModified();
|
||||
this->invoke();
|
||||
}
|
||||
|
||||
public:
|
||||
/**
|
||||
* Construct a new Simple Function Animation object
|
||||
*/
|
||||
SimpleCallbackAnimation() :
|
||||
SimpleAnimation(&value)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the callback for the animation to use.
|
||||
*
|
||||
* @param instance Instance of the object that has the callback.
|
||||
* @param callback Callback method to be invoked.
|
||||
*/
|
||||
void setCallback(I *instance, void (I::*callback)(T arg)) {
|
||||
assertNotNull(instance);
|
||||
this->instance = instance;
|
||||
this->callback = callback;
|
||||
}
|
||||
};
|
||||
}
|
@ -15,9 +15,17 @@ AnimationController::AnimationController(SceneItem *item) :
|
||||
|
||||
}
|
||||
|
||||
void AnimationController::addAnimation(Animation *animation) {
|
||||
assertNotNull(animation);
|
||||
this->animations.push_back(animation);
|
||||
}
|
||||
|
||||
void AnimationController::onSceneUpdate() {
|
||||
if(this->animation == nullptr) return;
|
||||
this->animation->tick(this->getGame()->timeManager.delta);
|
||||
auto it = this->animations.begin();
|
||||
while(it != this->animations.end()) {
|
||||
(*it)->tick(this->getGame()->timeManager.delta);
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
void AnimationController::onStart() {
|
||||
|
@ -10,13 +10,14 @@
|
||||
namespace Dawn {
|
||||
class AnimationController : public SceneItemComponent {
|
||||
private:
|
||||
std::vector<Animation*> animations;
|
||||
void onSceneUpdate();
|
||||
|
||||
public:
|
||||
Animation *animation = nullptr;
|
||||
|
||||
AnimationController(SceneItem *item);
|
||||
|
||||
void addAnimation(Animation *animation);
|
||||
|
||||
void onStart() override;
|
||||
void onDispose() override;
|
||||
};
|
||||
|
@ -10,5 +10,19 @@ using namespace Dawn;
|
||||
VisualNovelCharacter::VisualNovelCharacter(SceneItem *item) :
|
||||
SceneItemComponent(item)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void VisualNovelCharacter::setOpacity(float_t opacity) {
|
||||
auto interface = this->item->getComponent<SimpleTexturedShaderInterface>();
|
||||
assertNotNull(interface);
|
||||
auto color = interface->getColor();
|
||||
color.a = opacity;
|
||||
interface->setColor(color);
|
||||
}
|
||||
|
||||
float_t VisualNovelCharacter::getOpacity() {
|
||||
auto interface = this->item->getComponent<SimpleTexturedShaderInterface>();
|
||||
assertNotNull(interface);
|
||||
auto color = interface->getColor();
|
||||
return color.a;
|
||||
}
|
@ -5,10 +5,12 @@
|
||||
|
||||
#pragma once
|
||||
#include "scene/SceneItemComponent.hpp"
|
||||
#include "scene/components/display/shader/SimpleTexturedShaderInterface.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class VisualNovelCharacter : public SceneItemComponent {
|
||||
protected:
|
||||
SimpleTexturedShaderInterface *shaderInterface = nullptr;
|
||||
|
||||
public:
|
||||
std::string nameKey = "character.unknown";
|
||||
@ -20,5 +22,11 @@ namespace Dawn {
|
||||
* @param item Item that this component belongs to.
|
||||
*/
|
||||
VisualNovelCharacter(SceneItem *item);
|
||||
|
||||
SimpleTexturedShaderInterface * getShaderInterface();
|
||||
|
||||
void setOpacity(float_t opacity);
|
||||
|
||||
float_t getOpacity();
|
||||
};
|
||||
}
|
@ -6,9 +6,12 @@
|
||||
# Sources
|
||||
target_sources(${DAWN_TARGET_NAME}
|
||||
PRIVATE
|
||||
VisualNovelAnimationEvent.cpp
|
||||
VisualNovelFadeEvent.cpp
|
||||
VisualNovelPauseEvent.cpp
|
||||
VisualNovelTextboxEvent.cpp
|
||||
VisualNovelChangeSimpleBackgroundEvent.cpp
|
||||
)
|
||||
)
|
||||
|
||||
# Subdirs
|
||||
add_subdirectory(animation)
|
||||
add_subdirectory(characters)
|
||||
add_subdirectory(timing)
|
@ -19,7 +19,7 @@ VisualNovelFadeEvent::VisualNovelFadeEvent(
|
||||
this->duration = duration;
|
||||
this->simpleAnimation.easing = ease;
|
||||
}
|
||||
|
||||
|
||||
void VisualNovelFadeEvent::onStart(IVisualNovelEvent *previous) {
|
||||
VisualNovelSimpleAnimationEvent::onStart(previous);
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "VisualNovelSimpleAnimationEvent.hpp"
|
||||
#include "visualnovel/events/animation/VisualNovelSimpleAnimationEvent.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class VisualNovelFadeEvent : public VisualNovelSimpleAnimationEvent<float_t> {
|
||||
|
10
src/dawn/visualnovel/events/animation/CMakeLists.txt
Normal file
10
src/dawn/visualnovel/events/animation/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
||||
# Copyright (c) 2022 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
# Sources
|
||||
target_sources(${DAWN_TARGET_NAME}
|
||||
PRIVATE
|
||||
VisualNovelAnimationEvent.cpp
|
||||
)
|
@ -0,0 +1,24 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "VisualNovelAnimationEvent.hpp"
|
||||
#include "display/animation/SimpleCallbackAnimation.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
template<typename T, class I>
|
||||
class VisualNovelSimpleCallbackAnimationEvent :
|
||||
public VisualNovelAnimationEvent
|
||||
{
|
||||
public:
|
||||
struct SimpleCallbackAnimation<T, I> callbackAnimation;
|
||||
|
||||
VisualNovelSimpleCallbackAnimationEvent(VisualNovelManager *man) :
|
||||
VisualNovelAnimationEvent(man)
|
||||
{
|
||||
this->animation = &callbackAnimation;
|
||||
}
|
||||
};
|
||||
}
|
10
src/dawn/visualnovel/events/characters/CMakeLists.txt
Normal file
10
src/dawn/visualnovel/events/characters/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
||||
# Copyright (c) 2022 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
# Sources
|
||||
target_sources(${DAWN_TARGET_NAME}
|
||||
PRIVATE
|
||||
VisualNovelFadeCharacterEvent.cpp
|
||||
)
|
@ -0,0 +1,29 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#include "VisualNovelFadeCharacterEvent.hpp"
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
VisualNovelFadeCharacterEvent::VisualNovelFadeCharacterEvent(
|
||||
VisualNovelManager *man,
|
||||
VisualNovelCharacter *character,
|
||||
bool_t fadeIn,
|
||||
easefunction_t *ease,
|
||||
float_t duration
|
||||
) : VisualNovelSimpleCallbackAnimationEvent<float_t, VisualNovelCharacter>(man)
|
||||
{
|
||||
this->callbackAnimation.easing = ease;
|
||||
this->callbackAnimation.setCallback(
|
||||
character, &VisualNovelCharacter::setOpacity
|
||||
);
|
||||
if(fadeIn) {
|
||||
this->callbackAnimation.addKeyframe(0.0f, 0.0f);
|
||||
this->callbackAnimation.addKeyframe(duration, 1.0f);
|
||||
} else {
|
||||
this->callbackAnimation.addKeyframe(0.0f, 1.0f);
|
||||
this->callbackAnimation.addKeyframe(duration, 0.0f);
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "visualnovel/events/animation/VisualNovelSimpleCallbackAnimationEvent.hpp"
|
||||
#include "visualnovel/components/VisualNovelCharacter.hpp"
|
||||
#include "scene/components/display/Material.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class VisualNovelFadeCharacterEvent :
|
||||
public VisualNovelSimpleCallbackAnimationEvent<float_t,VisualNovelCharacter>
|
||||
{
|
||||
public:
|
||||
VisualNovelFadeCharacterEvent(
|
||||
VisualNovelManager *man,
|
||||
VisualNovelCharacter *character,
|
||||
bool_t fadeIn,
|
||||
easefunction_t *ease,
|
||||
float_t duration
|
||||
);
|
||||
};
|
||||
}
|
11
src/dawn/visualnovel/events/timing/CMakeLists.txt
Normal file
11
src/dawn/visualnovel/events/timing/CMakeLists.txt
Normal file
@ -0,0 +1,11 @@
|
||||
# Copyright (c) 2022 Dominic Masters
|
||||
#
|
||||
# This software is released under the MIT License.
|
||||
# https://opensource.org/licenses/MIT
|
||||
|
||||
# Sources
|
||||
target_sources(${DAWN_TARGET_NAME}
|
||||
PRIVATE
|
||||
VisualNovelBatchEvent.cpp
|
||||
VisualNovelPauseEvent.cpp
|
||||
)
|
66
src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.cpp
Normal file
66
src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.cpp
Normal file
@ -0,0 +1,66 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#include "VisualNovelBatchEvent.hpp"
|
||||
|
||||
using namespace Dawn;
|
||||
|
||||
VisualNovelBatchEvent::VisualNovelBatchEvent(
|
||||
VisualNovelManager *man,
|
||||
std::vector<IVisualNovelEvent*> events
|
||||
) : IVisualNovelEvent(man) {
|
||||
this->activeEvents = events;
|
||||
}
|
||||
|
||||
void VisualNovelBatchEvent::onStart(IVisualNovelEvent *previous) {
|
||||
auto it = this->activeEvents.begin();
|
||||
while(it != this->activeEvents.end()) {
|
||||
auto evt = *it;
|
||||
evt->start(previous);
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
bool_t VisualNovelBatchEvent::onUpdate() {
|
||||
bool_t result;
|
||||
auto it = this->activeEvents.begin();
|
||||
while(it != this->activeEvents.end()) {
|
||||
auto evt = *it;
|
||||
result = evt->update();
|
||||
if(result) {
|
||||
++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
auto subNext = evt->end();
|
||||
|
||||
// In future I may remove this and instead immediately queue the next thing.
|
||||
assertNull(subNext);
|
||||
|
||||
it = this->activeEvents.erase(it);
|
||||
this->inactiveEvents.push_back(evt);
|
||||
}
|
||||
return this->activeEvents.size() > 0;
|
||||
}
|
||||
|
||||
void VisualNovelBatchEvent::onEnd() {
|
||||
|
||||
}
|
||||
|
||||
VisualNovelBatchEvent::~VisualNovelBatchEvent() {
|
||||
auto itActive = this->activeEvents.begin();
|
||||
while(itActive != this->activeEvents.end()) {
|
||||
auto evt = *itActive;
|
||||
delete evt;
|
||||
++itActive;
|
||||
}
|
||||
|
||||
auto itInactive = this->inactiveEvents.begin();
|
||||
while(itInactive != this->inactiveEvents.end()) {
|
||||
auto evt = *itInactive;
|
||||
delete evt;
|
||||
++itInactive;
|
||||
}
|
||||
}
|
27
src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.hpp
Normal file
27
src/dawn/visualnovel/events/timing/VisualNovelBatchEvent.hpp
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2023 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
#pragma once
|
||||
#include "visualnovel/VisualNovelManager.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class VisualNovelBatchEvent : public IVisualNovelEvent {
|
||||
protected:
|
||||
std::vector<IVisualNovelEvent*> activeEvents;
|
||||
std::vector<IVisualNovelEvent*> inactiveEvents;
|
||||
|
||||
void onStart(IVisualNovelEvent *previous) override;
|
||||
bool_t onUpdate() override;
|
||||
void onEnd() override;
|
||||
|
||||
public:
|
||||
VisualNovelBatchEvent(
|
||||
VisualNovelManager *man,
|
||||
std::vector<IVisualNovelEvent*> events
|
||||
);
|
||||
|
||||
~VisualNovelBatchEvent();
|
||||
};
|
||||
}
|
@ -11,7 +11,7 @@
|
||||
#include "scene/components/audio/AudioListener.hpp"
|
||||
#include "visualnovel/VisualNovelManager.hpp"
|
||||
#include "visualnovel/events/VisualNovelTextboxEvent.hpp"
|
||||
#include "visualnovel/events/VisualNovelPauseEvent.hpp"
|
||||
#include "visualnovel/events/timing/VisualNovelPauseEvent.hpp"
|
||||
#include "visualnovel/events/VisualNovelFadeEvent.hpp"
|
||||
#include "visualnovel/events/VisualNovelCAllbackEvent.hpp"
|
||||
#include "visualnovel/events/VisualNovelChangeSimpleBackgroundEvent.hpp"
|
||||
|
@ -95,7 +95,7 @@ void AudioSource::onStart() {
|
||||
alGenBuffers((ALuint)AUDIO_SOURCE_BUFFER_COUNT, this->buffers);
|
||||
|
||||
// Set up the source positions
|
||||
glm::vec3 position = this->transform->getLocalPosition();
|
||||
glm::vec3 position = this->transform->getWorldPosition();
|
||||
alSource3f(this->source, AL_POSITION, position.x, position.y, position.z);
|
||||
alSource3f(this->source, AL_VELOCITY, 0, 0, 0);
|
||||
|
||||
|
@ -19,4 +19,8 @@ void SimpleTexturedShaderInterface::setTexture(Texture *texture) {
|
||||
|
||||
void SimpleTexturedShaderInterface::setColor(struct Color color) {
|
||||
this->getMaterial()->colorValues[this->getShader()->paramColor] = color;
|
||||
}
|
||||
|
||||
struct Color SimpleTexturedShaderInterface::getColor() {
|
||||
return this->getMaterial()->colorValues[this->getShader()->paramColor];
|
||||
}
|
@ -32,5 +32,12 @@ namespace Dawn {
|
||||
* @param color Color to be used.
|
||||
*/
|
||||
void setColor(struct Color color);
|
||||
|
||||
/**
|
||||
* Returns the current color from the shader.
|
||||
*
|
||||
* @return Current color.
|
||||
*/
|
||||
struct Color getColor();
|
||||
};
|
||||
}
|
@ -32,11 +32,11 @@ tool_texture(texture_test texture_test.png)
|
||||
tool_language(language_en ${DIR_GAME_ASSETS}/locale/en.csv)
|
||||
tool_language(language_jp ${DIR_GAME_ASSETS}/locale/jp.csv)
|
||||
|
||||
tool_tileset(tileset_death texture_death ${DIR_GAME_ASSETS}/characters/death/sheet.png 1 2)
|
||||
tool_tileset(tileset_death texture_death ${DIR_GAME_ASSETS}/characters/death/sheet.png 1 3)
|
||||
|
||||
tool_truetype(truetype_alice ${DIR_GAME_ASSETS}/font/Alice-Regular.ttf truetype_alice 2048 2048 120)
|
||||
|
||||
tool_audio(audio_test borrowed/sample.wav)
|
||||
tool_audio(audio_test borrowed/sample_long.wav)
|
||||
|
||||
add_dependencies(${DAWN_TARGET_NAME}
|
||||
language_en
|
||||
|
@ -17,6 +17,7 @@ namespace Dawn {
|
||||
public:
|
||||
VisualNovelCharacter *vnCharacter;
|
||||
SimpleTexturedShaderInterface *shaderInterface;
|
||||
AnimationController *animation;
|
||||
|
||||
static std::vector<Asset*> prefabAssets(AssetManager *assMan) {
|
||||
return std::vector<Asset*>{
|
||||
@ -25,7 +26,10 @@ namespace Dawn {
|
||||
};
|
||||
}
|
||||
|
||||
DeathPrefab(Scene *scene, sceneitemid_t id) : SceneItemPrefab(scene, id){}
|
||||
DeathPrefab(Scene *scene, sceneitemid_t id) : SceneItemPrefab(scene, id)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void prefabInit(AssetManager *man) override {
|
||||
auto textureAsset = man->get<TextureAsset>("texture_death");
|
||||
@ -34,17 +38,18 @@ namespace Dawn {
|
||||
auto meshRenderer = this->addComponent<MeshRenderer>();
|
||||
auto material = this->addComponent<Material>();
|
||||
auto meshHost = this->addComponent<MeshHost>();
|
||||
auto animation = this->addComponent<AnimationController>();
|
||||
|
||||
auto tiledSprite = this->addComponent<TiledSprite>();
|
||||
tiledSprite->setTilesetAndSize(&tilesetAsset->tileset);
|
||||
tiledSprite->setTile(0);
|
||||
|
||||
vnCharacter = this->addComponent<VisualNovelCharacter>();
|
||||
vnCharacter->nameKey = "character.death.name";
|
||||
|
||||
shaderInterface = this->addComponent<SimpleTexturedShaderInterface>();
|
||||
shaderInterface->setTexture(&textureAsset->texture);
|
||||
|
||||
vnCharacter = this->addComponent<VisualNovelCharacter>();
|
||||
vnCharacter->nameKey = "character.death.name";
|
||||
|
||||
animation = this->addComponent<AnimationController>();
|
||||
|
||||
auto tiledSprite = this->addComponent<TiledSprite>();
|
||||
tiledSprite->setTilesetAndSize(&tilesetAsset->tileset);
|
||||
tiledSprite->setTile(0);
|
||||
|
||||
this->transform.setLocalPosition(glm::vec3(0, 0, 0));
|
||||
}
|
||||
|
@ -9,34 +9,23 @@
|
||||
#include "prefabs/characters/DeathPrefab.hpp"
|
||||
#include "scene/components/audio/AudioListener.hpp"
|
||||
#include "scene/components/audio/AudioSource.hpp"
|
||||
#include "visualnovel/events/characters/VisualNovelFadeCharacterEvent.hpp"
|
||||
#include "visualnovel/events/timing/VisualNovelBatchEvent.hpp"
|
||||
|
||||
namespace Dawn {
|
||||
class Scene_1 : public PixelVNScene {
|
||||
protected:
|
||||
DeathPrefab *death;
|
||||
AudioSource *source;
|
||||
|
||||
void onFinished() {
|
||||
std::cout << "Finished" << std::endl;
|
||||
source->rewind();
|
||||
}
|
||||
DeathPrefab *death2;
|
||||
|
||||
void vnStage() override {
|
||||
PixelVNScene::vnStage();
|
||||
|
||||
this->death = DeathPrefab::create(this);
|
||||
// this->death->vnCharacter.setOpacity(0);
|
||||
this->death->vnCharacter->setOpacity(0);
|
||||
|
||||
auto sourceItem = this->createSceneItem();
|
||||
source = sourceItem->addComponent<AudioSource>();
|
||||
source->transform->setLocalPosition(glm::vec3(1, 0, 0));
|
||||
source->eventFinished.addListener(this, &Scene_1::onFinished);
|
||||
|
||||
auto audio = this->game->assetManager.get<AudioAsset>("audio_test");
|
||||
|
||||
source->setAudioData(audio);
|
||||
source->loop = true;
|
||||
source->state = AUDIO_SOURCE_STATE_PLAYING;
|
||||
this->death2 = DeathPrefab::create(this);
|
||||
this->death2->transform.setLocalPosition(glm::vec3(100, 0, 0));
|
||||
}
|
||||
|
||||
void onSceneEnded() {
|
||||
@ -51,12 +40,29 @@ namespace Dawn {
|
||||
|
||||
IVisualNovelEvent * getVNEvent() override {
|
||||
auto start = new VisualNovelPauseEvent(vnManager, 1.0f);
|
||||
|
||||
start
|
||||
// ->then(new VisualNovelTextboxEvent(vnManager, nullptr, "scene.1.1"))
|
||||
// ->then(new VisualNovelCallbackEvent<Scene_1>(vnManager, this, &Scene_1::onSceneEnded))
|
||||
->then(new VisualNovelBatchEvent(
|
||||
vnManager,
|
||||
std::vector<IVisualNovelEvent*>{
|
||||
new VisualNovelFadeCharacterEvent(
|
||||
vnManager,
|
||||
this->death->vnCharacter,
|
||||
true,
|
||||
&easeLinear,
|
||||
2.0f
|
||||
),
|
||||
new VisualNovelFadeCharacterEvent(
|
||||
vnManager,
|
||||
this->death2->vnCharacter,
|
||||
false,
|
||||
&easeLinear,
|
||||
2.0f
|
||||
)
|
||||
}
|
||||
))
|
||||
->then(new VisualNovelTextboxEvent(vnManager, nullptr, "scene.1.1"))
|
||||
->then(new VisualNovelCallbackEvent<Scene_1>(vnManager, this, &Scene_1::onSceneEnded))
|
||||
;
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user