2009-05-08 31 views
10

Tôi là người dẫn đầu cho Bitfighter và đang thêm các chương trình theo kịch bản người dùng bằng Lua. Tôi đang làm việc với C++ và Lua sử dụng Lunar để dán chúng lại với nhau.Làm cách nào để chuyển danh sách các đối tượng từ C++ sang Lua?

Tôi đang cố gắng làm điều gì đó mà tôi cho là khá đơn giản: Tôi có đối tượng C++ trong Lua (bot trong đoạn mã bên dưới), và tôi gọi phương thức trên đó (findItems) khiến C++ tìm kiếm khu vực xung quanh robot và trả về một danh sách các đối tượng mà nó tìm thấy (TestItems và những đối tượng khác không được hiển thị ở đây). Câu hỏi của tôi chỉ đơn giản là làm thế nào để tôi lắp ráp và trả về danh sách các mặt hàng được tìm thấy trong C + +, và sau đó lặp qua chúng trong Lua?

Về cơ bản, tôi muốn để điền vào các < < < < Tạo danh sách các mục, trả lại cho lua >>>> khối dưới đây, và thực hiện bất kỳ điều chỉnh tôi có thể cần trong mã Lua chính nó, bao gồm dưới đây mà .

Tôi đã cố giữ mã đơn giản nhưng đầy đủ. Hy vọng không có quá nhiều ở đây! Cảm ơn!

C++ header nộp

class TestItem : public LuaObject 
{ 

public: 
    TestItem();  // C++ constructor 

    ///// Lua Interface 

    TestItem(lua_State *L) { } ;    // Lua constructor 

    static const char className[]; 
    static Lunar<TestItem>::RegType methods[]; 

    S32 getClassID(lua_State *L) { return returnInt(L, TestItemType); } 
}; 


class LuaRobot : public Robot 
{ 
    LuaRobot();  // C++ constructor 

    ///// Lua Interface 

    LuaRobot(lua_State *L) { } ;    // Lua constructor 

    static const char className[]; 
    static Lunar<LuaRobot>::RegType methods[]; 

    S32 findItems(lua_State *L); 
} 

tập C++ cpp

const char LuaRobot::className[] = "Robot";  // Class name in Lua 
// Define the methods we will expose to Lua 
Lunar<LuaRobot>::RegType LuaRobot::methods[] = 
{ 
    method(LuaRobot, findItems), 
    {0,0} // End method list 
}; 


S32 LuaRobot::findItems(lua_State *L) 
{ 
    range = getIntFromStack(L, 1); // Pop range from the stack 
    thisRobot->findObjects(fillVector, range); // Put items in fillVector 

    <<<< Create list of items, return it to lua >>>> 

    for(int i=0; i < fillVector.size(); i++) 
     do something(fillVector[i]); // Do... what, exactly? 

    return something; 
} 


///// 
const char TestItem::className[] = "TestItem";  // Class name in Lua 

// Define the methods we will expose to Lua 
Lunar<TestItem>::RegType TestItem::methods[] = 
{ 
    // Standard gameItem methods 
    method(TestItem, getClassID), 
    {0,0} // End method list 
}; 

Lua Mã

bot = LuaRobot(Robot) -- This is a reference to our bot 

range = 10 
items = bot:findItems(range) 

for i, v in ipairs(items) do 
    print("Item Type: " .. v:getClassID()) 
end 
+0

Bạn đang tìm cách để có được âm lịch để tạo một bảng với các chỉ mục chạy từ 1 đến fillVector.size().Trong Lua đơn giản, điều đó sẽ được thực hiện bằng cách tạo một bảng và thêm các phần tử. Tôi không biết đủ về âm lịch để đưa ra lời khuyên cụ thể trong khuôn khổ đó. – RBerteig

+0

Vâng, đó là hoàn toàn đúng, và đó là nơi tôi đang mắc kẹt. Tôi có thể thêm nhiều mục số vào một bảng nhưng không biết cách thêm nhiều mục userdata. – Watusimoto

+0

bot = LuaRobot (Robot) - Đây là một tham chiếu đến bot của chúng tôi --- XIN, làm thế nào bạn làm điều đó, làm thế nào để bạn có được một tham chiếu đến C++ tạo robot của bạn ?? Tôi đã thử tạo một phương thức getCurrent (luastate *) âm lịch :: push (this) nhưng nó không hoạt động .. Tôi cầu xin bạn .. – Icebone1000

Trả lời

7

Vì vậy, bạn cần phải điền một vector và p ush đến Lua. Một số mã ví dụ sau. Ứng dụng là số std :: danh sách.

typedef std::list<std::string> Applications; 

Tôi tạo một bảng và điền nó với dữ liệu trong danh sách của tôi.

int ReturnArray(lua_State* L) { 
    lua_createtable(L, applications.size(), 0); 
    int newTable = lua_gettop(L); 
    int index = 1; 
    Applications::const_iterator iter = applications.begin(); 
    while(iter != applications.end()) { 
     lua_pushstring(L, (*iter).c_str()); 
     lua_rawseti(L, newTable, index); 
     ++iter; 
     ++index; 
    } 
    return 1; 
} 

Điều này để lại cho tôi một mảng trong ngăn xếp. Nếu nó được trả lại cho Lua, sau đó tôi có thể viết như sau:

for k,v in ipairs(ReturnArray()) do 
    print(v) 
end 

Tất nhiên cho đến nay, điều này chỉ được cho tôi một mảng Lua của chuỗi. Để có được một mảng của Lua đối tượng chúng tôi chỉ tinh chỉnh phương pháp của bạn một chút:

S32 LuaRobot::findItems(lua_State *L) 
{ 
    range = getIntFromStack(L, 1); // Pop range from the stack 
    thisRobot->findObjects(fillVector, range); // Put items in fillVector 

    // <<<< Create list of items, return it to lua >>>> 

    lua_createtable(L, fillVector.size(), 0); 
    int newTable = lua_gettop(L); 
    for(int i=0; i < fillVector.size(); i++) { 
     TestItem* item = fillVector[i]; 
     item->push(L); // put an object, not a string, in Lua array 
     lua_rawseti(L, newTable, i + 1); 
    } 
    return 1; 
} 
1

này hoạt động hoàn hảo. Để làm rõ để những người đang đọc này, phương pháp

item->push(L) 

void push(lua_State *L) { Lunar<TestItem>::push(L, this); } 

Bằng cách đóng gói này trong một phương pháp, nó có thể làm cho findItems thuyết bất khả tri đến những gì nó tìm.

Cảm ơn sự giúp đỡ của bạn!

+1

Wow - có thể là một người dùng hoàn toàn khác trên một máy tính khác với cùng tên người dùng! Ai biết? – Watusimoto

Các vấn đề liên quan