Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

206 рядки
5.6 KiB

  1. //
  2. // Lol Engine — Lua tutorial
  3. //
  4. // Copyright © 2014—2015 Benjamin “Touky” Huet <huet.benjamin@gmail.com>
  5. //
  6. // Lol Engine is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #if HAVE_CONFIG_H
  13. # include "config.h"
  14. #endif
  15. #include <lol/engine.h>
  16. #include "loldebug.h"
  17. #include <cstdio>
  18. using namespace lol;
  19. //-----------------------------------------------------------------------------
  20. class DemoObject : public LuaObject
  21. {
  22. typedef Lolua::VarPtr<DemoObject> LuaDemoObjectPtr;
  23. public:
  24. DemoObject() : LuaObject() {}
  25. virtual ~DemoObject() {}
  26. static DemoObject* New(LuaState* l, int arg_nb)
  27. {
  28. UNUSED(l);
  29. UNUSED(arg_nb);
  30. return new DemoObject();
  31. }
  32. //-------------------------------------------------------------------------
  33. static int AddFive(LuaState* l)
  34. {
  35. LuaInt32 i; i.Get(l, 1);
  36. i += 5;
  37. return i.Return(l);
  38. }
  39. static int AddTenInstance(LuaState* l)
  40. {
  41. LuaStack stack(l);
  42. LuaDemoObjectPtr obj;
  43. LuaFloat f;
  44. stack >> obj >> f;
  45. f = obj->AddTenMethod(f);
  46. return f.Return(l);
  47. }
  48. float AddTenMethod(float f)
  49. {
  50. return (f + 10);
  51. }
  52. static int GetX(LuaState* l)
  53. {
  54. LuaStack stack(l);
  55. LuaDemoObjectPtr obj;
  56. LuaInt32 i;
  57. stack >> obj;
  58. i = obj->m_x;
  59. return stack << i;
  60. }
  61. static int SetX(LuaState* l)
  62. {
  63. LuaStack stack(l);
  64. LuaDemoObjectPtr obj;
  65. LuaInt32 i;
  66. stack >> obj >> i;
  67. obj->m_x = i;
  68. return 0;
  69. }
  70. //-------------------------------------------------------------------------
  71. static const LuaObjectLib* GetLib()
  72. {
  73. static const LuaObjectLib lib = LuaObjectLib(
  74. "LoluaDemo",
  75. { { "AddFive", &DemoObject::AddFive } },
  76. { { "AddTenInstance", &DemoObject::AddTenInstance } },
  77. { { "X", &DemoObject::GetX, &DemoObject::SetX } });
  78. return &lib;
  79. }
  80. int m_x = 0;
  81. };
  82. //-----------------------------------------------------------------------------
  83. static int GlobalAddString(LuaState* l)
  84. {
  85. LuaString s; s.Get(l, 1);
  86. s() += "_added";
  87. return s.Return(l);
  88. }
  89. //-----------------------------------------------------------------------------
  90. class LoluaDemoLoader : public LuaLoader
  91. {
  92. public:
  93. LoluaDemoLoader() : LuaLoader()
  94. {
  95. LuaState* l = GetLuaState();
  96. //Registering demo object
  97. LuaObjectDef::Register<DemoObject>(l);
  98. //Registering function
  99. LuaFunction add_string(l, "GlobalAddString", &GlobalAddString);
  100. }
  101. virtual ~LoluaDemoLoader()
  102. {
  103. }
  104. void TestStuff()
  105. {
  106. LuaState* l = GetLuaState();
  107. /*
  108. //create property
  109. lua_pushnumber(l, 5.0);
  110. lua_setfield(l, -2, "x");
  111. lua_getglobal(l, "vector");
  112. int table = lua_istable(l, -1);
  113. lua_getfield(l, -1, "x");
  114. Lolua::Var<float> var(l, -1);
  115. lua_pop(l, 2);
  116. vec3 t;
  117. */
  118. //table = lua_isuserdata(l, -1);
  119. //Var<T> var(m_lua_state, -1);
  120. //lua_pop(m_lua_state, 1);
  121. //lua_getfield (lua_State *L, int index, const char *k);
  122. //return var.V();
  123. }
  124. };
  125. //-----------------------------------------------------------------------------
  126. class LoluaDemo : public WorldEntity
  127. {
  128. public:
  129. LoluaDemo()
  130. {
  131. }
  132. virtual void TickGame(float seconds)
  133. {
  134. WorldEntity::TickGame(seconds);
  135. LoluaDemoLoader* demo_loader = new LoluaDemoLoader();
  136. //Execute script
  137. demo_loader->ExecLuaFile("14_lol_lua.lua");
  138. demo_loader->TestStuff();
  139. //Grab global test values
  140. float testvalue_num = demo_loader->GetVar<float>("testvalue_num");
  141. int32_t testvalue_int = demo_loader->GetVar<int32_t>("testvalue_int");
  142. uint32_t testvalue_uint = demo_loader->GetVar<uint32_t>("testvalue_uint");
  143. String testvalue_str = demo_loader->GetVar<String>("testvalue_str");
  144. //Grab string modified with function
  145. String function_return = demo_loader->GetVar<String>("function_return");
  146. //Grab global values modified with DemoObject
  147. int32_t loluademo_return = demo_loader->GetVar<int32_t>("loluademo_return");
  148. int32_t loluademo_getx = demo_loader->GetVar<int32_t>("loluademo_getx");
  149. float loluademo_inst_return = demo_loader->GetVar<float>("loluademo_inst_return");
  150. DemoObject* loluademo_inst = demo_loader->GetPtr<DemoObject>("loluademo_inst");
  151. msg::info("Lua Vars: \
  152. testvalue_num: %.2f, testvalue_int: %i, testvalue_uint: %i, testvalue_str: %s.\n",
  153. testvalue_num, testvalue_int, testvalue_uint, testvalue_str.C());
  154. msg::info("Lua Vars: \
  155. function_return: %s, loluademo_return: %i, loluademo_inst_return: %.f, loluademo_getx: %i, loluademo_inst->m_x: %i.\n",
  156. function_return.C(), loluademo_return, loluademo_inst_return, loluademo_getx, loluademo_inst->m_x);
  157. delete demo_loader;
  158. Ticker::Shutdown();
  159. }
  160. virtual void TickDraw(float seconds, Scene &scene)
  161. {
  162. WorldEntity::TickDraw(seconds, scene);
  163. }
  164. };
  165. //-----------------------------------------------------------------------------
  166. int main(int argc, char **argv)
  167. {
  168. System::Init(argc, argv);
  169. Application app("Tutorial 14: Lolua Demo", ivec2(800, 600), 60.0f);
  170. new LoluaDemo();
  171. app.Run();
  172. return EXIT_SUCCESS;
  173. }