Skip to content

Commit

Permalink
remember next free offset value (fix #222, fix #214)
Browse files Browse the repository at this point in the history
  • Loading branch information
HJfod committed Feb 20, 2024
1 parent 3da9a8b commit 7050d06
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 64 deletions.
7 changes: 2 additions & 5 deletions src/features/NextFreeOffset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class $modify(SetGroupIDLayer) {
return false;

auto nextFreeMenu = m_mainLayer->getChildByID("next-free-menu");
auto nextFreeOffset = NextFreeOffsetInput::create();
auto nextFreeOffset = NextFreeOffsetInput<GroupIDAllocator>::create();
nextFreeOffset->setID("next-free-offset-input"_spr);
nextFreeMenu->addChild(nextFreeOffset);
nextFreeMenu->updateLayout();
Expand All @@ -50,10 +50,7 @@ class $modify(SetGroupIDLayer) {

$override
void onNextGroupID1(CCObject* sender) {
auto input = static_cast<NextFreeOffsetInput*>(
m_mainLayer->getChildByID("next-free-menu")->getChildByID("next-free-offset-input"_spr)
);
auto _ = addFakeObjects<GroupIDAllocator>(input);
auto _ = NextFreeOffsetInput<GroupIDAllocator>::addFakeObjects();
SetGroupIDLayer::onNextGroupID1(sender);
}
};
29 changes: 0 additions & 29 deletions src/utils/NextFreeOffsetInput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,32 +20,3 @@ void cocos2d::ccArrayEnsureExtraCapacity(ccArray *arr, unsigned int extra)
}
}
#endif

bool NextFreeOffsetInput::init() {
if (!CCNode::init())
return false;

this->setAnchorPoint({ .5f, .5f });
this->setContentSize({ 40, 30 });

auto label = CCLabelBMFont::create("Offset", "goldFont.fnt");
label->setScale(.35f);
this->addChildAtPosition(label, Anchor::Top, ccp(0, -5));

m_input = TextInput::create(60.f, "Off");
m_input->setCommonFilter(CommonFilter::Uint);
m_input->setScale(.5f);
this->addChildAtPosition(m_input, Anchor::Bottom, ccp(0, 10));

return true;
}

NextFreeOffsetInput* NextFreeOffsetInput::create() {
auto ret = new NextFreeOffsetInput();
if (ret && ret->init()) {
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);
return nullptr;
}
84 changes: 54 additions & 30 deletions src/utils/NextFreeOffsetInput.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,6 @@ concept NextFreeAllocator = requires(std::span<GameObject*> const& objs, C::Valu
{ C::MAX_VALUE } -> std::convertible_to<typename C::ValueType>;
};

class NextFreeOffsetInput : public CCNode {
protected:
TextInput* m_input;

bool init();

public:
static NextFreeOffsetInput* create();

template <NextFreeAllocator Allocator>
Allocator::ValueType getValue() const {
if (auto value = numFromString<typename Allocator::ValueType>(m_input->getString())) {
return clamp(value.unwrap(), Allocator::MIN_VALUE, Allocator::MAX_VALUE);
}
else {
return Allocator::MIN_VALUE;
}
}
};

// Nån kanske vill veta varför några kommentarer här är på svenska.
// Det är eftersom jag har en svenskkurs just nu och ville använda denna möjligheten
// för att öva mig datavetenskaps vokabulär och att tala detta språket allmänt
Expand Down Expand Up @@ -114,15 +94,59 @@ class FakeObjectsForNextFree final {
};

template <NextFreeAllocator Allocator>
FakeObjectsForNextFree<Allocator> addFakeObjects(NextFreeOffsetInput* input) {
// Det krävs inte offsettera om vi har ingen input
if (!input) {
return FakeObjectsForNextFree<Allocator>();
class NextFreeOffsetInput : public CCNode {
protected:
TextInput* m_input;
// Bevara värdet mellan öppningar
static inline typename Allocator::ValueType s_cachedValue = Allocator::MIN_VALUE;

bool init() {
if (!CCNode::init())
return false;

this->setAnchorPoint({ .5f, .5f });
this->setContentSize({ 40, 30 });

auto label = CCLabelBMFont::create("Offset", "goldFont.fnt");
label->setScale(.35f);
this->addChildAtPosition(label, Anchor::Top, ccp(0, -5));

m_input = TextInput::create(60.f, "Off");
m_input->setCommonFilter(CommonFilter::Uint);
m_input->setScale(.5f);
// Minns värdet
if (s_cachedValue != Allocator::MIN_VALUE) {
m_input->setString(numToString(s_cachedValue));
}
m_input->setCallback([](auto str) {
if (auto value = numFromString<typename Allocator::ValueType>(str)) {
s_cachedValue = clamp(value.unwrap(), Allocator::MIN_VALUE, Allocator::MAX_VALUE);
}
else {
s_cachedValue = Allocator::MIN_VALUE;
}
});
this->addChildAtPosition(m_input, Anchor::Bottom, ccp(0, 10));

return true;
}
auto upTo = input->template getValue<Allocator>();
// Det krävs inte offsettera om vi räknar upp till det minsta
if (upTo == Allocator::MIN_VALUE) {
return FakeObjectsForNextFree<Allocator>();

public:
static NextFreeOffsetInput* create() {
auto ret = new NextFreeOffsetInput();
if (ret && ret->init()) {
ret->autorelease();
return ret;
}
CC_SAFE_DELETE(ret);
return nullptr;
}
return FakeObjectsForNextFree<Allocator>(upTo);
}

static FakeObjectsForNextFree<Allocator> addFakeObjects() {
// Det krävs inte offsettera om vi räknar upp till det minsta
if (s_cachedValue == Allocator::MIN_VALUE) {
return FakeObjectsForNextFree<Allocator>();
}
return FakeObjectsForNextFree<Allocator>(s_cachedValue);
}
};

0 comments on commit 7050d06

Please sign in to comment.