color(color),
model(model),
userdata(nullptr),
- function_ptr(nullptr),
+ function(std::nullopt),
is_done_finished(false) {}
bool Anims::is_done() {
}
bool result = is_done_impl();
if (result) {
- if (function_ptr) {
- function_ptr(userdata);
+ if (function.has_value()) {
+ function.value()(userdata);
}
is_done_finished = true;
}
void Anims::set_end_callback(Anims::FP fp, void *ud) {
userdata = ud;
- function_ptr = fp;
+ function = fp;
}
#define ROCK_PAPER_SCISSORS_DUEL_3D_ANIMS_H_
// standard library includes
+#include <functional>
#include <memory>
+#include <optional>
// local includes
#include "arrays.h"
using UPtr = std::unique_ptr<Anims>;
using SPtr = std::shared_ptr<Anims>;
- using FP = void (*)(void *);
+ using FP = std::function<void(void *)>;
Anims(Model *model, A3F pos, A4C color);
virtual ~Anims() {}
virtual void do_update(float dt) = 0;
virtual void do_draw() = 0;
- void set_end_callback(FP function_ptr, void *ud);
+ void set_end_callback(FP function, void *ud);
protected:
virtual bool is_done_impl() = 0;
A4C color;
Model *model;
void *userdata;
- FP function_ptr;
+ std::optional<FP> function;
bool is_done_finished;
};