new
an anonymous user
·
C++
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <functional>
struct ITool {
virtual ~ITool() = default;
virtual void processPick(int x, int y) = 0;
virtual void update(int i){};
};
struct ToolManager {
ITool* getActiveTool() {
if(m_tool_builders.find(m_active_tool_name) == m_tool_builders.end())
return nullptr;
return m_tool_builders[m_active_tool_name];
}
std::string m_active_tool_name = "";
std::map<std::string, ITool*> m_tool_builders;
};
ToolManager g_toolManager;
struct ToolCollectInRadius : public ITool {
void processPick(int x, int y) override {
std::cout << "From ToolCollectInRadius\n";
collectItems();
std::cout << '\t'; for(int i : m_items) std::cout << i << ','; std::cout << '\n';
}
void update(int i) override {
m_radius += i;
}
virtual void collectItems() {
for(int i = 0; i < m_radius; ++i)
m_items.push_back(i);
std::cout << "\tadded items in radius " << m_radius << '\n';
}
float m_radius = 0;
std::vector<int> m_items;
};
struct ToolAllign : public ToolCollectInRadius {
void processPick(int x, int y) override {
std::cout << "From ToolAllign\n";
collectItems();
std::cout << "\talign " << m_items.size() << " items \n";
}
};
struct ToolInstancer : public ITool {
void processPick(int x, int y) override {
std::cout << "From ToolInstancer\n";
for(auto& item : items) std::cout << "\tspawn item: " << item << '\n';
}
void update(int i) override {
items.push_back(std::to_string(i));
}
std::vector<std::string> items;
};
void processClick(int x, int y) {
if (auto active_tool = g_toolManager.getActiveTool())
active_tool->processPick(x, y);
}
void update_tool(int i) {
if (auto active_tool = g_toolManager.getActiveTool())
active_tool->update(i);
}
int main() {
g_toolManager.m_tool_builders["collect_in_radius"] = new ToolCollectInRadius();
g_toolManager.m_tool_builders["allign"] = new ToolAllign();
g_toolManager.m_tool_builders["instancer"] = new ToolInstancer();
g_toolManager.m_active_tool_name = "collect_in_radius";
update_tool(8);
processClick(10, 10);
g_toolManager.m_active_tool_name = "allign";
update_tool(15);
processClick(10, 10);
g_toolManager.m_active_tool_name = "instancer";
update_tool(10);
processClick(10, 10);
g_toolManager.m_active_tool_name = "collect_in_radius";
processClick(10, 10);
g_toolManager.m_active_tool_name = "instancer";
update_tool(100);
processClick(10, 10); }
Output
Embed on website
To embed this program on your website, copy the following code and paste it into your website's HTML:
Comments
This comment belongs to a banned user and is only visible to admins.
This comment belongs to a deleted user and is only visible to admins.