Mercurial > malikania
diff client/main.cpp @ 33:d4f5f7231b84
Misc: switch to .hpp, dos2unix everything while here, #478
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 17 Jun 2016 13:12:35 +0200 |
parents | a1e80d991968 |
children | 9af360f34c7d |
line wrap: on
line diff
--- a/client/main.cpp Fri Jun 17 13:07:05 2016 +0200 +++ b/client/main.cpp Fri Jun 17 13:12:35 2016 +0200 @@ -1,210 +1,210 @@ -/* - * main.cpp -- main client file - * - * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <chrono> -#include <iostream> -#include <thread> - -#include <malikania/client-resources-loader.h> -#include <malikania/resources-locator.h> - -#include <malikania/js-animation.h> -#include <malikania/js-animator.h> -#include <malikania/js-client.h> -#include <malikania/js-client-target.h> -#include <malikania/js-color.h> -#include <malikania/js-font.h> -#include <malikania/js-image.h> -#include <malikania/js-line.h> -#include <malikania/js-point.h> -#include <malikania/js-rectangle.h> -#include <malikania/js-size.h> -#include <malikania/js-sprite.h> -#include <malikania/js-window.h> - -using namespace malikania; - -namespace { - -int usage() -{ - std::cerr << "usage: mlk-client directory\n"; - - return 1; -} - -duk::Context init() -{ - duk::Context ctx; - - /* TODO: Put Malikania global somewhere else */ - duk::putGlobal(ctx, "Malikania", duk::Object()); - - loadMalikaniaAnimation(ctx); - loadMalikaniaAnimator(ctx); - loadMalikaniaColor(ctx); - loadMalikaniaFont(ctx); - loadMalikaniaImage(ctx); - loadMalikaniaLine(ctx); - loadMalikaniaPoint(ctx); - loadMalikaniaRectangle(ctx); - loadMalikaniaSize(ctx); - loadMalikaniaSprite(ctx); - loadMalikaniaWindow(ctx); - loadMalikaniaClient(ctx); - loadMalikaniaClientTarget(ctx); - - return ctx; -} - -void start(duk::Context &ctx, std::shared_ptr<Client> client) -{ - duk::getGlobal<void>(ctx, "start"); - - if (duk::is<duk::Function>(ctx, -1)) { - duk::push(ctx, std::move(client)); - duk::pcall(ctx, 1); - duk::pop(ctx); - } else { - duk::pop(ctx); - } -} - -void update(duk::Context &ctx, std::shared_ptr<Client> client) -{ - duk::getGlobal<void>(ctx, "update"); - - if (duk::is<duk::Function>(ctx, -1)) { - duk::push(ctx, std::move(client)); - duk::pcall(ctx, 1); - duk::pop(ctx); - } else { - duk::pop(ctx); - client->update(); - } -} - -void draw(duk::Context &ctx, std::shared_ptr<Client> client) -{ - duk::getGlobal<void>(ctx, "draw"); - - if (duk::is<duk::Function>(ctx, -1)) { - duk::push(ctx, std::move(client)); - duk::pcall(ctx, 1); - duk::pop(ctx); - } else { - duk::pop(ctx); - client->draw(); - } -} - -int run(duk::Context &ctx) -{ - auto running = true; - auto client = std::make_shared<Client>(); - - client->setOnQuit([&] () { - running = false; - }); - client->setOnKeyDown([&] (unsigned key) { - duk::getGlobal<void>(ctx, "keyDown"); - - if (duk::is<duk::Function>(ctx, -1)) { - duk::push(ctx, static_cast<int>(key)); - duk::pcall(ctx, 1); - duk::pop(ctx); - } else { - duk::pop(ctx); - } - }); - client->setOnKeyDown([&] (unsigned key) { - duk::getGlobal<void>(ctx, "keyUp"); - - if (duk::is<duk::Function>(ctx, -1)) { - duk::push(ctx, static_cast<int>(key)); - duk::pcall(ctx, 1); - duk::pop(ctx); - } else { - duk::pop(ctx); - } - }); - - start(ctx, client); - - while (running) { - client->poll(); - - update(ctx, client); - draw(ctx, client); - - // TODO: remove this with an appropriate FPS calculation. - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - } - - return 0; -} - -int boot(const std::string &directory) -{ - std::string path = directory + "/client.js"; - duk::Context ctx = init(); - - /* Store the loader */ - ResourcesLocatorDirectory locator(directory); - ClientResourcesLoader loader(locator); - - duk::putGlobal(ctx, "\xff""\xff""loader", &loader); - - if (duk::pevalFile(ctx, path) != 0) { - duk::Exception info = duk::exception(ctx, -1); - - std::cerr << info.fileName << ":" << info.lineNumber << ": " << info.stack << std::endl; - - return 1; - } - - return run(ctx); -} - -} // !namespace - -int main(int argc, char **argv) -{ -#if 0 - -- argc; - ++ argv; - - if (argc < 1) { - return usage(); - } - - return boot(argv[0]); -#endif - Client client; - ElapsedTimer timer; - - while (timer.elapsed() < 5000) { - client.poll(); - client.update(); - client.draw(); - - std::this_thread::sleep_for(std::chrono::milliseconds(50)); - } - - return 0; -} +/* + * main.cpp -- main client file + * + * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <chrono> +#include <iostream> +#include <thread> + +#include <malikania/client-resources-loader.hpp> +#include <malikania/resources-locator.hpp> + +#include <malikania/js-animation.hpp> +#include <malikania/js-animator.hpp> +#include <malikania/js-client.hpp> +#include <malikania/js-client-target.hpp> +#include <malikania/js-color.hpp> +#include <malikania/js-font.hpp> +#include <malikania/js-image.hpp> +#include <malikania/js-line.hpp> +#include <malikania/js-point.hpp> +#include <malikania/js-rectangle.hpp> +#include <malikania/js-size.hpp> +#include <malikania/js-sprite.hpp> +#include <malikania/js-window.hpp> + +using namespace malikania; + +namespace { + +int usage() +{ + std::cerr << "usage: mlk-client directory\n"; + + return 1; +} + +duk::Context init() +{ + duk::Context ctx; + + /* TODO: Put Malikania global somewhere else */ + duk::putGlobal(ctx, "Malikania", duk::Object()); + + loadMalikaniaAnimation(ctx); + loadMalikaniaAnimator(ctx); + loadMalikaniaColor(ctx); + loadMalikaniaFont(ctx); + loadMalikaniaImage(ctx); + loadMalikaniaLine(ctx); + loadMalikaniaPoint(ctx); + loadMalikaniaRectangle(ctx); + loadMalikaniaSize(ctx); + loadMalikaniaSprite(ctx); + loadMalikaniaWindow(ctx); + loadMalikaniaClient(ctx); + loadMalikaniaClientTarget(ctx); + + return ctx; +} + +void start(duk::Context &ctx, std::shared_ptr<Client> client) +{ + duk::getGlobal<void>(ctx, "start"); + + if (duk::is<duk::Function>(ctx, -1)) { + duk::push(ctx, std::move(client)); + duk::pcall(ctx, 1); + duk::pop(ctx); + } else { + duk::pop(ctx); + } +} + +void update(duk::Context &ctx, std::shared_ptr<Client> client) +{ + duk::getGlobal<void>(ctx, "update"); + + if (duk::is<duk::Function>(ctx, -1)) { + duk::push(ctx, std::move(client)); + duk::pcall(ctx, 1); + duk::pop(ctx); + } else { + duk::pop(ctx); + client->update(); + } +} + +void draw(duk::Context &ctx, std::shared_ptr<Client> client) +{ + duk::getGlobal<void>(ctx, "draw"); + + if (duk::is<duk::Function>(ctx, -1)) { + duk::push(ctx, std::move(client)); + duk::pcall(ctx, 1); + duk::pop(ctx); + } else { + duk::pop(ctx); + client->draw(); + } +} + +int run(duk::Context &ctx) +{ + auto running = true; + auto client = std::make_shared<Client>(); + + client->setOnQuit([&] () { + running = false; + }); + client->setOnKeyDown([&] (unsigned key) { + duk::getGlobal<void>(ctx, "keyDown"); + + if (duk::is<duk::Function>(ctx, -1)) { + duk::push(ctx, static_cast<int>(key)); + duk::pcall(ctx, 1); + duk::pop(ctx); + } else { + duk::pop(ctx); + } + }); + client->setOnKeyDown([&] (unsigned key) { + duk::getGlobal<void>(ctx, "keyUp"); + + if (duk::is<duk::Function>(ctx, -1)) { + duk::push(ctx, static_cast<int>(key)); + duk::pcall(ctx, 1); + duk::pop(ctx); + } else { + duk::pop(ctx); + } + }); + + start(ctx, client); + + while (running) { + client->poll(); + + update(ctx, client); + draw(ctx, client); + + // TODO: remove this with an appropriate FPS calculation. + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + + return 0; +} + +int boot(const std::string &directory) +{ + std::string path = directory + "/client.js"; + duk::Context ctx = init(); + + /* Store the loader */ + ResourcesLocatorDirectory locator(directory); + ClientResourcesLoader loader(locator); + + duk::putGlobal(ctx, "\xff""\xff""loader", &loader); + + if (duk::pevalFile(ctx, path) != 0) { + duk::Exception info = duk::exception(ctx, -1); + + std::cerr << info.fileName << ":" << info.lineNumber << ": " << info.stack << std::endl; + + return 1; + } + + return run(ctx); +} + +} // !namespace + +int main(int argc, char **argv) +{ +#if 0 + -- argc; + ++ argv; + + if (argc < 1) { + return usage(); + } + + return boot(argv[0]); +#endif + Client client; + ElapsedTimer timer; + + while (timer.elapsed() < 5000) { + client.poll(); + client.update(); + client.draw(); + + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + + return 0; +}