2016-11-04 4 views
1

私はlove2dを使ってゲームをしています。私は私のコードを投稿し、私は何をしようとしている説明しますので、技術的な文言でわからない:ルア、これは可能ですか?

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

私は何をしようとしている在庫システムとアイテムのデータベースを作成しています。

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] 

誰かがこのように私はそれを研究することができて何コーディング原則を私に伝えることができます:私はそうはのようなので、私はアイテムを追加することができます上記のコードでアイテムデータベースを作ることができるようにしたいですか?

私は今、私はitem.stat.damageを行うことができます実現[1] = 10:という名前の配列の利便性を持つ代わりにitem[1,"damage"] = 10

編集を言いながら、私は基本的に私は上記のようにアクセスできる行列を作りたいですしかし、私はそれぞれのための配列をセットアップする必要があります、より簡単な方法はありますか?

+0

テーブルのような行列の方法でそのコードにアクセスすることができますがLuaの唯一のデータ構造です。それは最も簡単な方法です。それ以外のものは非効率的です。 – warspyking

答えて

1

単にテーブルを使用します。

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

player.xplayer["x"]ため、単純にシンタックスシュガーであるので、以下の行が等価であること:を念頭に置いて

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

、あなたがあなたのゲームデータを構築することができ例えば、次のようになります。

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アイテムやプレーヤーを作成し、必要なすべてのフィールドを自動的に設定する関数を定義することは、おそらく良い考えです。

最終的には、実際のclasses and objectsを使用することができます(たとえば、オブジェクトにメソッドを定義する場合など)。

EDIT:

ここでは、アイテムやプレイヤーを作成するための機能create_itemcreate_playerと上記の例です。これらの関数にはnamed parametersを使用していますので、関数パラメータの順序を覚えておく必要はありません(関数を呼び出すときは中括弧に注意してください)。あなたはいつもあなたのコードを短くすることができ

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

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] } } 

あなたは

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) 
関連する問題