Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有调用Lua OOP函数?_C++_Lua_Allegro5_Metatable_Luabridge - Fatal编程技术网

C++ 没有调用Lua OOP函数?

C++ 没有调用Lua OOP函数?,c++,lua,allegro5,metatable,luabridge,C++,Lua,Allegro5,Metatable,Luabridge,我用Lua和LuaBridge搭配Allegro 5。我决定将所有图形对象移植到Lua,但遇到了一些问题: 一次调用的字符类 Character = {sprite; AI} function Character:new() o = o or {} -- works! setmetatable(o, self) -- works! self.__index = self -- works! return o -- works! end function Character:

我用Lua和LuaBridge搭配Allegro 5。我决定将所有图形对象移植到Lua,但遇到了一些问题:

一次调用的字符类

Character = {sprite; AI}

function Character:new()
  o = o or {} -- works!
  setmetatable(o, self) -- works!
  self.__index = self  -- works!
  return o -- works!
end

function Character:LoadSprite(filename)
  self.sprite = self.sprite or Bitmap() -- works!
  self.sprite:LoadFile(filename) -- works!
  self.sprite.x = 0 -- works!
  self.sprite.y = 0 --works!
end

function Character:SetX(xx)
  self.sprite.x = xx -- maybe? cannot tell if it works or not.
end

function Character:AddBehavior(fname, cname)
    self.AI = self.AI or Pattern()
    self.AI:AddBehavior(fname, cname)
end

function Character:Draw()
  self.sprite:Draw() -- works!
 end

Foo = Character:new()
Lua从主程序调用其函数的脚本:

function CoreInit() --called at initialization
  Foo:LoadSprite("Image.png") -- works!
end

function CoreLogic() --called during logic cycle
  Foo:SetX(50)  -- does NOT work!
end

function CoreDraw() --called during drawing/rendering cycle
  Foo:Draw()  --works perfectly!
end
因此,基本上,脚本使用适当的坐标和图像初始化角色,并绘制它,但是要么没有调用逻辑(它在逻辑循环中),要么更改X坐标的函数出了问题

任务管理器还建议每个周期内存在30 kb的内存泄漏,在C++中有图像对象时不会发生。 下面是位图结构的一个片段,它是通过LuaBridge导出到Lua的,以备需要:

void Bitmap::Register(lua_State*lua) {
  luabridge::getGlobalNamespace(lua)
    .beginClass<Bitmap>("Bitmap")
    .addConstructor <void (*) (void)> ()
    .addStaticData("scale", &Bitmap::scale)
    .addFunction("LoadFile", &Bitmap::LoadFile)
    .addFunction("Draw", &Bitmap::Draw)
    .addData("x", &Bitmap::x)
    .addData("y", &Bitmap::y)
    .addData("w", &Bitmap::w)
    .addData("h", &Bitmap::h)
  .endClass();
}


void Bitmap::LoadFile(string file) {
  name = file;
  bitmap = al_load_bitmap(file.c_str());
  w = al_get_bitmap_width(bitmap);
  h = al_get_bitmap_height(bitmap);
}

void Bitmap::Draw() {
  if (scale > 1)
    al_draw_scaled_bitmap(bitmap, 0, 0, w, h, x * scale , y * scale, w * scale, h * scale, 0);
  else
    al_draw_bitmap(bitmap, x, y, 0);
}

Bitmap::Bitmap() :  velocity(1) {
   bitmap = NULL; 

}
Bitmap::~Bitmap() {
  name = "";
  if (!bitmap) 
    al_destroy_bitmap(bitmap);
}
在CoreLogic函数中,它将调用Foo.AI:DoBehavior(),这完全没有做任何事情,并导致内存泄漏。

Foo.AI:DoBehavior()
从文件中读取一个块,为其内容、字节码转换形式、函数环境和在此文件顶层创建的任何可能的临时值保留内存。预计它将在此处丢失内存,而不是泄漏。Lua不会立即释放内存。实际上,它甚至根本不会返回到系统中

偶尔垃圾收集器会运行并查找不再使用的字符串/表/函数/任何其他内容。Lua在其自己的内部索引中将此内存标记为空闲,并在下次需要空闲内存时使用它,但从系统中看到的Lua内存消耗将永远不会减少

如果您怀疑程序的某些部分可能会在自动GC调用之间生成太多不必要的垃圾,您可能希望通过
collectgarbage
或C API强制执行GC步骤。

Foo.AI:DoBehavior()
从文件中读取块,为其内容、字节码转换形式保留内存,函数环境以及在此文件顶层创建的任何可能的临时值。预计它将在此处丢失内存,而不是泄漏。Lua不会立即释放内存。实际上,它甚至根本不会返回到系统中

偶尔垃圾收集器会运行并查找不再使用的字符串/表/函数/任何其他内容。Lua在其自己的内部索引中将此内存标记为空闲,并在下次需要空闲内存时使用它,但从系统中看到的Lua内存消耗将永远不会减少


如果您怀疑程序的某些部分可能会在自动GC调用之间生成太多不必要的垃圾,那么您可能希望通过
collectgarbage
或C API强制执行GC步骤。

在多做一些工作之后,我就能够解决这个问题;本质上,它返回到模式表的构造函数以及AI对象是如何在字符中初始化的。我不得不将构造函数从:

Pattern = {complete; timer; command; Files; Commands; itr; num}

function Pattern:new()
  o = o or {}
  o.Files = {}
  o.Commands = {}
  o.complete = false
  o.timer = 0
  o.itr = 1
  o.num = 1
  setmetatable(o, self)
  self.__index = self
  return o
end
致:

这是:

Character = {sprite; AI}

function Character:new()
  o = o or {} 
  setmetatable(o, self) 
  self.__index = self 
  return o 
end
致:


现在,对Foo.AI:DoBehavior()的调用按预期进行,没有使用额外的内存。这段代码是我第一次尝试在Lua中实现OOP,这可能是我从现在开始要做的事情。

在多做了一些工作之后,我能够解决这个问题;本质上,它返回到模式表的构造函数以及AI对象是如何在字符中初始化的。我不得不将构造函数从:

Pattern = {complete; timer; command; Files; Commands; itr; num}

function Pattern:new()
  o = o or {}
  o.Files = {}
  o.Commands = {}
  o.complete = false
  o.timer = 0
  o.itr = 1
  o.num = 1
  setmetatable(o, self)
  self.__index = self
  return o
end
致:

这是:

Character = {sprite; AI}

function Character:new()
  o = o or {} 
  setmetatable(o, self) 
  self.__index = self 
  return o 
end
致:


现在,对Foo.AI:DoBehavior()的调用按预期进行,没有使用额外的内存。这段代码是我第一次尝试在Lua中实现OOP,从现在开始我可能会这样做。

内存泄漏和循环是什么意思?Lua是垃圾收集的。在您的情况下,每次调用
Bitmap()
都会创建“对象”,而不一定会销毁。如果将对象放在闭包中,则引用将被保留,因此C++绑定对象的释放将被进一步延迟。基本上,每次调用Celeloic函数(当前FPS为30)时,程序的内存占用增加了30 kb。我设法解决了AI表的一个问题。我马上发布代码。内存泄漏和循环是什么意思?Lua是垃圾收集的。在您的情况下,每次调用
Bitmap()
都会创建“对象”,而不一定会销毁。如果将对象放在闭包中,则引用将被保留,因此C++绑定对象的释放将被进一步延迟。基本上,每次调用Celeloic函数(当前FPS为30)时,程序的内存占用增加了30 kb。我设法解决了AI表的一个问题。我会马上发布代码。
Character = {}

function Character:new()
  local o = {sprite; AI = Pattern:new()}
  setmetatable(o, self)
  self.__index = self
  return o
end