Improves InputWin to make chars more visible.

This commit is contained in:
falsycat 2021-08-31 12:30:32 +09:00
parent 82442ecf9d
commit 7688f38dab
2 changed files with 41 additions and 8 deletions

View File

@ -15,10 +15,12 @@ namespace gj {
class InputWindowElement : public iElement { class InputWindowElement : public iElement {
public: public:
struct Param { struct Param {
iAllocator* alloc;
UniqPtr<iInputMatcher> matcher; UniqPtr<iInputMatcher> matcher;
UniqPtr<iElementDriver> driver; UniqPtr<iElementDriver> driver;
Scoreboard* scoreboard = nullptr; Scoreboard* scoreboard;
Period period; Period period;
@ -35,13 +37,14 @@ class InputWindowElement : public iElement {
InputWindowElement(Param&& p) : InputWindowElement(Param&& p) :
iElement(p.period), iElement(p.period),
matcher_(std::move(p.matcher)), drv_(std::move(p.driver)), sb_(p.scoreboard), matcher_(std::move(p.matcher)), drv_(std::move(p.driver)), sb_(p.scoreboard),
text_(p.text), expects_(matcher_->expects()) { bg_(CreateEmptySquare_(p.alloc)), text_(p.text), expects_(matcher_->expects()) {
param_["posX"] = 0.; param_["posX"] = 0.;
param_["posY"] = 0.; param_["posY"] = 0.;
param_["baseX"] = .5; param_["baseX"] = .5;
} }
void Update(Frame& frame, double t) override { void Update(Frame& frame, double t) override {
/* consumes all input */
for (auto c : frame.input) { for (auto c : frame.input) {
if (matcher_->done()) break; if (matcher_->done()) break;
if (matcher_->Input(c)) { if (matcher_->Input(c)) {
@ -50,18 +53,40 @@ class InputWindowElement : public iElement {
} }
++sb_->input; ++sb_->input;
} }
/* executes the driver to update parameters and takes them with cast */
drv_->Update(param_, t); drv_->Update(param_, t);
const auto posX = (std::get<double>(param_["posX"])+1)/2; const auto posX = std::get<double>(param_["posX"]);
const auto posY = (std::get<double>(param_["posY"])+1)/2; const auto posY = std::get<double>(param_["posY"]);
const auto baseX = std::get<double>(param_["baseX"]); const auto baseX = std::get<double>(param_["baseX"]);
const uint32_t posXi = static_cast<int32_t>(posX * frame.w); const uint32_t posXi = static_cast<int32_t>((posX+1)/2 * frame.w);
const uint32_t posYi = static_cast<int32_t>(posY * frame.h); const uint32_t posYi = static_cast<int32_t>((posY+1)/2 * frame.h);
const uint32_t tbaseXi = static_cast<int32_t>(baseX * text_.width()); const uint32_t tbaseXi = static_cast<int32_t>(baseX * text_.width());
const uint32_t ebaseXi = static_cast<int32_t>(baseX * expects_.width()); const uint32_t ebaseXi = static_cast<int32_t>(baseX * expects_.width());
const double w = (4+std::max(text_.width(), expects_.width()))*1. / frame.w;
const double h = 4. / frame.h;
/* calculates geometry of background rect
* and sets alpha to negative to decrease colors of pixels surrounding the text */
auto M = mat3{
{w, 0, 0},
{0, h, 0},
{0, 0, 1},
};
M = ::linalg::mul(mat3{
{1, 0, 0},
{0, 1, 0},
{posX, posY, 1},
}, M);
bg_.SetMatrix(M);
bg_.SetAlpha(-.8f);
frame.Add(&bg_);
/* calculates geometry of foreground text */
text_.SetPosition(posXi-tbaseXi, posYi); text_.SetPosition(posXi-tbaseXi, posYi);
expects_.SetPosition(posXi-ebaseXi, posYi+1); expects_.SetPosition(posXi-ebaseXi, posYi+1);
frame.Add(&text_); frame.Add(&text_);
@ -85,10 +110,17 @@ class InputWindowElement : public iElement {
Scoreboard* sb_; Scoreboard* sb_;
Text text_; Texture bg_;
Text expects_; Text text_;
Text expects_;
iElementDriver::Param param_; iElementDriver::Param param_;
static Colorbuffer CreateEmptySquare_(iAllocator* alloc) {
auto buf = Colorbuffer(alloc, 1, 1);
buf.ptr()[0] = 1;
return std::move(buf);
}
}; };

View File

@ -29,6 +29,7 @@ class InputWindowElementFactory : public iElementFactory {
const std::string kana = std::get<std::string>(param.custom[1]); const std::string kana = std::get<std::string>(param.custom[1]);
InputWindowElement::Param p; InputWindowElement::Param p;
p.alloc = alloc_;
p.period = param.period; p.period = param.period;
p.scoreboard = sb_; p.scoreboard = sb_;
p.driver = std::move(param.driver); p.driver = std::move(param.driver);