2016-11-04 10 views
1

Ich arbeite an einem Spiel mit love2d und ich habe nicht ganz in lua programmiert. Nicht sicher auf technischen Wortlaut so werde ich meinen Code zu schreiben und erklären, was ich zu tun habe versucht:Lua, ist das möglich?

item = {} 
item.stat = {} 
player.x = 100 
player.y = 100 
-- 
item[0].stat.damage = 10 

Was ich versuche, ein Inventar-System und eine Element-Datenbank zu tun ist, machen. Ich möchte in der Lage, die Artikeldatenbank mit dem Code zu machen oben, so dass ich wie so ein Element hinzufügen könnte:

item[1].stat.damage = 10 
item[1].stat.speed = 10 
item[2].stat.damage = 20 
item[2].stat.speed = 5 
-- 
player.inventory[0] = item[1] 
player.inventory[1] = item[2] 

kann mir jemand sagen, was Codierung Prinzip kann dies, so kann ich es erforschen? Ich mag im Grunde um eine Matrix machen, dass ich wie oben zugreifen kann, während die Bequemlichkeit des genannten Arrays mit anstatt zu sagen item[1,"damage"] = 10

Edit:

Ich weiß jetzt, ich kann item.stat.damage tun [1] 10 = aber ich muss für jeden einen Array einrichten, gibt es einen einfacheren Weg?

+0

Tabellen sind Lua nur Datenstruktur. Es ist der einfachste Weg. Alles andere ist ineffizient. – warspyking

Antwort

1

einfach Tabellen verwenden:

player = {} 
player.x = 100 
print(player.x) -- prints 100 

Beachten Sie, dass player.x ist einfach syntaktischer Zucker für player["x"], so dass die folgenden Zeilen sind äquivalent:

print(player.x)  -- prints 100 
print(player["x"]) -- also prints 100 

Mit dem im Verstand, könnten Sie Ihre Spieldaten konstruieren wie dieses zum Beispiel:

item = {} 
item[1] = {} 
item[1].stat = {} 
item[1].stat.damage = 10 
item[1].stat.speed = 10 
item[2] = {} 
item[2].stat = {} 
item[2].stat.damage = 20 
item[2].stat.speed = 5 

player = {} 
player.x = 100 
player.y = 100 
player.inventory = {} 
player.inventory[1] = item[1] 
player.inventory[2] = item[2] 

print(player.inventory[2].stat.damage)   -- prints 20 
print(player["inventory"][2]["stat"]["damage"]) -- equivalent, also prints 20 

I Es ist wahrscheinlich eine gute Idee, Funktionen zu definieren, die Objekte oder Player erstellen und automatisch alle erforderlichen Felder festlegen.

Eventuell möchten Sie vielleicht die tatsächliche classes and objects verwenden (zum Beispiel, wenn Sie Methoden für Ihre Objekte definieren möchten).

EDIT:

Hier ist das Beispiel von oben mit Funktionen create_item, create_player Artikel oder Spieler zu erstellen. Ich habe named parameters für diese Funktionen verwendet, so dass man sich nicht an die Reihenfolge der Funktionsparameter erinnern muss (beachten Sie die geschweiften Klammern beim Aufruf der Funktionen).

function create_item(arg) 
    local item = {} 
    item.stat = {} 
    item.stat.damage = arg.damage 
    item.stat.speed = arg.speed 
    return item 
end 

function create_player(arg) 
    local player = {} 
    player.x = arg.x 
    player.y = arg.y 
    player.inventory = {} 
    return player 
end 

item = {} 
item[1] = create_item{damage=10, speed=10} 
item[2] = create_item{damage=20, speed=5} 

player = create_player{x=100, y=100} 
player.inventory[1] = item[1] 
player.inventory[2] = item[2] 

print(player.inventory[2].stat.damage)   -- prints 20 
print(player["inventory"][2]["stat"]["damage"]) -- equivalent, also prints 20 
0

Sie können jederzeit Ihr Code verkürzen:

item = { 
    stat = {}, 
    [0] = { stat = { damage = 10 } }, 
    [1] = { stat = { damage = 10, speed = 10 } }, 
    [2] = { stat = { damage = 20, speed = 5 } }, 
} 
player = { x = 100, y = 100, inventory = { [0] = item[1], [1] = item[2] } } 

Sie diesen Code in Matrix Art und Weise zugreifen können, wie

function item:getstat(index, param) 
    return self[index] and self[index].stat and self[index].stat[param]; 
end 

function item:setstat(index, param, value) 
    local t1 = self[index] 
    if (t1 == nil) then 
     t1 = {} 
     self[index] = t1 
    end 
    local t2 = t1.stat 
    if (t2 == nil) then 
     t2 = {} 
     t1.stat = t2 
    end 
    t2[param] = value 
end 


print(item:getstat(0, "damage")) 
item:setstat(1, "speed", 20)