我用LuaBind在C ++中用Lua代码包装什么代码? [英] What code do I wrap around Lua code in C++ with LuaBind?

查看:139
本文介绍了我用LuaBind在C ++中用Lua代码包装什么代码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我终于得到LuaBind配置为与我的C + +项目。我最近发现,Tiled地图编辑器有一个选项将文件导出为.lua,所以我想试试看。下面的代码是否可以用于我的C ++ RPG项目?

  return {
version =1.1,
luaversion =5.1,
orientation =orthogonal,
width = 24,
height = 20,
tilewidth =
tileheight = 16,
properties = {},
tilesets = {
{
name =PALLET TOWN,
firstgid = 1,
tilewidth = 16,
tileheight = 16,
spacing = 0,
margin = 0,
image =PALLET TOWN.bmp,
imagewidth = 384 ,
imageheight = 320,
properties = {},
tiles = {}
}
},
layers = {
{
type =tilelayer,
name =Tile Layer 1,
x = 0,
y = 0,
width = 24,
height = 20 ,
visible = true,
opacity = 1,
properties = {},
encoding =lua,
data = {
1,2 ,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
25 ,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,
73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96 ,
97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 ,120,
121,122,123,124,125,126,127,128,129,130​​,131,132,133,134,135,136,137,138,139,140,​​141,142 ,143,144,
145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165 ,166,167,168,
169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188 ,189,190,191,192,
193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211 ,212,213,214,215,216,
217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234 ,235,236,237,238,239,240,
241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257 ,258,259,260,261,262,263,264,
265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280 ,281,282,283,284,285,286,287,288,
289,290,291,292,293,294,295,296,297,298,299,300,301,302,303 ,304,305,306,307,308,309,310,311,312,
313,314,315,316,317,318,319,320,321,322,323,324,325,326 ,327,328,329,330,331,332,333,334,335,336,
337,338,339,340,341,342,343,344,345,346,347,348,349 ,350,351,352,353,354,355,356,357,358,359,360,
361,362,363,364,365,366,367,368,369,370,371,372 ,373,374,375,376,377,378,379,380,381,382,383,384,
385,386,387,388,389,390,391,392,393,394,395 ,396,397,398,399,400,401,402,403,404,405,406,407,408,
409,410,411,412,413,414,415,416,417,418 ,419,420,421,422,423,424,425,426,427,428,429,430,431,432,
433,434,435,436,437,438,439,440,441 ,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,
457,458,459,460,461,462,463,464 ,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480
}
}
} $ b b}


解决方案

警告:我的回答可能是nooby



首先,删除属于以下内容的 return 和{}回报。
现在把它放到你的程序可以找到的地方。



现在来到luabind部分(luabind对这种工作不是真正必要的,但我会使用它,因为它是一个很好的做法)。



让我们看看你的主程序使用这些值叫做 stage
,调用 load
从头开始:

  externC
{
#include< lua.h>
#include< lualib.h>
#include< lauxlib.h>
}
#include.\luabind\luabind.hpp
#include< iostream>

class Stage
{
public:
Stage();
Stage(string stage_name);
//阶段用于运行的方法
static void _load(< a input of input
或任何你希望传递信息的方式>,
intptr_t stage) ; / * static for luabind intptr_t设计为
以保持int形式的指针。* /
void load(< a input of input或者你想要传递信息的任何方式>);
〜Stage();

private:
//很多你想要的值。

}

在cpp文件中,开始游戏:

  void _load(<输入表
或任何你想要传输的方式信息>表,
intptr_t stage)
{
Stage * stage =(Stage *)stg; // intptr_t back to pointer
stage-> load(table);
}

void Stage:load(< a input of input
或任何你想传递信息的表>表)
{
< load infos into your variable>
}

Stage(string stage_name)
{

intptr_t stage =(intptr_t)* this;
//创建一个新的lua状态
lua_State * myLuaState = luaL_newstate();

//将LuaBind连接到这个lua状态
luabind :: open(myLuaState);
luaL_openlibs(myLuaState);

luabind :: module(myLuaState)[
luabind :: def(load,& _load)
];

luabind :: globals(myLuaState)[stage] = stage; //给指针指向lua

stringstream fileadd< < candidate address here> ;;
lual_dofile(myLuaState,fileadd);
lua_close(myLuaState); /我们不需要lua /

< start your game>
}

lua示例:

 <您的原始档案无返回> 
<将它放入表或某事>
- load是在您的阶段启动后的可调用文件cpp
- stage是传递给lua的指针
load(< table of information> stage)

这取决于你如何传递变量,但我认为这个方法应该可以正常工作, / p>

关于指针和luabind的更多信息


I finally got LuaBind configured to work with my C++ project. I recently found out that the Tiled map editor has an option to export the files as a .lua, so I wanted to try it out. What code would I wrap around the pasted code below to have it work with my C++ RPG project?

return {
  version = "1.1",
  luaversion = "5.1",
  orientation = "orthogonal",
  width = 24,
  height = 20,
  tilewidth = 16,
  tileheight = 16,
  properties = {},
  tilesets = {
    {
      name = "PALLET TOWN",
      firstgid = 1,
      tilewidth = 16,
      tileheight = 16,
      spacing = 0,
      margin = 0,
      image = "PALLET TOWN.bmp",
      imagewidth = 384,
      imageheight = 320,
      properties = {},
      tiles = {}
    }
  },
  layers = {
    {
      type = "tilelayer",
      name = "Tile Layer 1",
      x = 0,
      y = 0,
      width = 24,
      height = 20,
      visible = true,
      opacity = 1,
      properties = {},
      encoding = "lua",
      data = {
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
        25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
        49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,
        73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
        97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
        121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
        145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
        169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
        193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216,
        217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,
        241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264,
        265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
        289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312,
        313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336,
        337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360,
        361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384,
        385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408,
        409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432,
        433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456,
        457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480
      }
    }
  }
}

解决方案

Warning: My answer might be nooby since I'm the kind prefer more work and less complicates.

first, remove the return and {} that belong to the return. now put it to a place that your program can find it.

now come to the luabind part(luabind is not really necessary for this kind of job, but i will use it since it's a good practice for you).

let's see your main program that uses these values is called stage and there is a loader method called load. Start with the header:

extern "C"
{
    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
}
#include ".\luabind\luabind.hpp"
#include <iostream>

class Stage
{
    public:
        Stage();
        Stage(string stage_name);
        // the methods that stage use to run
        static void _load(<a table of input
           or whatever the way you want to transfer the information>,
                          intptr_t stage);/* static for luabind intptr_t is designed 
              to hold pointer in int form.*/
        void load(<a table of input or whatever the way you want to transfer the information>);
        ~Stage();

    private:
        //lot of values that you want.

}

And in the cpp file, you well want load in the start of the game:

    void _load(<a table of input
       or whatever the way you want to transfer the information> table,
       intptr_t stage)
    {
        Stage* stage = (Stage*)stg; // intptr_t back to pointer
        stage->load(table);
    }

    void Stage:load(<a table of input
       or whatever the way you want to transfer the information> table)
    {
        <load infos into your variable>
    }

    Stage(string stage_name)
    {

        intptr_t stage = (intptr_t)*this;
        // Create a new lua state
        lua_State *myLuaState = luaL_newstate();

        // Connect LuaBind to this lua state
        luabind::open(myLuaState);
        luaL_openlibs(myLuaState);

        luabind::module(myLuaState)[
        luabind::def("load", &_load) 
        ];

        luabind::globals(myLuaState)["stage"] = stage;// give the pointer to lua

        stringstream fileadd << <candidate address here>;
        lual_dofile(myLuaState, fileadd);
        lua_close(myLuaState);/we don't need lua anymore/

        <start your game>
     }

Example of lua:

    <your origin file without return>
    <put it into a table or something>
    -- load is a callable file after it's launched with your stage cpp 
    -- stage is the pointer that passed to lua
    load(<table of information>, stage) 

It's up to you how to pass the variables, but I think this method should works fine, just lots works?

More information about pointer and luabind

这篇关于我用LuaBind在C ++中用Lua代码包装什么代码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆