Lua 如何从一个类的多个实例中获取值?
我正在做一个像Love2D中的流氓一样的爱好项目。我的方法是尽可能多地尝试和使用Lua和Love2D(0.10.1)API的本地功能,而不依赖像middleclass或HUMP这样的高级库,以便更多地了解该语言 在阅读了PiL关于OOP的章节并看到了其中的力量之后,我决定建立一个Mob类(使用元方法模拟类功能),它包含玩家、怪物和其他NPC(任何可以移动的东西)。到目前为止,它工作得很好,我可以轻松创建各种各样的实例来共享方法和其他东西。但是有很多事情我还不知道怎么做,其中之一就是阻碍了我的原型的进一步发展 设置与地图本身的冲突并不太糟糕。我的地图是充满整数的表格,0是最底层。游戏从每张桌子上画“.”和“#”以及“+”等等来表示各种无生命的物体。播放器1使用numpad移动,其位置通过将原始像素位置除以32来跟踪,以创建一个32x32“平铺”的网格。然后,内心的爱。按下(键),我有这样的线条:Lua 如何从一个类的多个实例中获取值?,lua,love2d,roguelike,Lua,Love2d,Roguelike,我正在做一个像Love2D中的流氓一样的爱好项目。我的方法是尽可能多地尝试和使用Lua和Love2D(0.10.1)API的本地功能,而不依赖像middleclass或HUMP这样的高级库,以便更多地了解该语言 在阅读了PiL关于OOP的章节并看到了其中的力量之后,我决定建立一个Mob类(使用元方法模拟类功能),它包含玩家、怪物和其他NPC(任何可以移动的东西)。到目前为止,它工作得很好,我可以轻松创建各种各样的实例来共享方法和其他东西。但是有很多事情我还不知道怎么做,其中之一就是阻碍了我的原型
if key == "kp8" and currentmap[player1.grid_y - 1][player1.grid_x] == 0 then
player1.grid_y = player1.grid_y - 1
依此类推,玩家可以按每个键的elseifs。这将防止他们在地图本身中不是打开的地砖的任何地方行走
但是,我正在尝试实现某种“碰撞检测”,以防止暴徒相互穿行,并在编写战斗规则时使用,这是比较棘手的。我有一个方法来计算怪物之间的距离,但我被告知这最终可能会导致舍入错误,而且它必须为我想要测试的每个怪物组合单独编写
我想知道的是:是否有一种已知的(最好是优雅的)方法可以让特定类的所有实例向表传递一些值?
我想做的是“询问”给定地图上的每个暴徒他们在哪里,让他们“报告”self.grid_x和self.grid_y到另一个地图层,该地图层仅用于跟踪暴徒(如果self.is_这里是真的,则为1,如果不是,则为0,或类似),该地图每回合都会更新。然后,我可以实现基于坐标相等的碰撞规则,或者可能是foo.is_here标志之类的
然而,我对如何进行只有模糊的想法。任何帮助都将不胜感激,包括(也许特别是)关于如何更好地完成我正在尝试的工作的反馈。谢谢 一个简单的想法是为字段的每个单元格存储“谁在这里”信息,并在每个对象的每次移动中更新此信息
function create_game_field()
-- initialize a table for storing "who is here" information
who_is_here = {}
for y = 1,24 do
who_is_here[y] = {}
for x = 1,38 do
who_is_here[y][x] = 0
end
end
end
function Mob:can_move(dx, dy)
local u = currentmap[self.y + dy][self.x + dx]
local v = who_is_here[self.y + dy][self.x + dx]
if u == 0 and v == 0 then
return true
else
end
end
function Mob:move(dx, dy)
-- update "who is here"
who_is_here[self.y][self.x] = 0
self.x, self.y = self.x + dx, self.y + dy
who_is_here[self.y][self.x] = 1
end
function Mob:who_is_there(dx, dy) -- look who is standing on adjacent cell
return who_is_here[self.y + dy][self.x + dx] -- return mob or nil
end
function Mob:roll_call()
who_is_here[self.y][self.x] = 1
end
用法示例:
-- player1 spawns in at (6,9) on the grid coords
player1 = Mob:spawn(6,9)
-- player1 added to who_is_here
player1:roll_call()
然后,在爱中。按下(键):
一个简单的想法是存储字段中每个单元格的“谁在这里”信息,并在每个对象的每次移动中更新此信息
function create_game_field()
-- initialize a table for storing "who is here" information
who_is_here = {}
for y = 1,24 do
who_is_here[y] = {}
for x = 1,38 do
who_is_here[y][x] = 0
end
end
end
function Mob:can_move(dx, dy)
local u = currentmap[self.y + dy][self.x + dx]
local v = who_is_here[self.y + dy][self.x + dx]
if u == 0 and v == 0 then
return true
else
end
end
function Mob:move(dx, dy)
-- update "who is here"
who_is_here[self.y][self.x] = 0
self.x, self.y = self.x + dx, self.y + dy
who_is_here[self.y][self.x] = 1
end
function Mob:who_is_there(dx, dy) -- look who is standing on adjacent cell
return who_is_here[self.y + dy][self.x + dx] -- return mob or nil
end
function Mob:roll_call()
who_is_here[self.y][self.x] = 1
end
用法示例:
-- player1 spawns in at (6,9) on the grid coords
player1 = Mob:spawn(6,9)
-- player1 added to who_is_here
player1:roll_call()
然后,在爱中。按下(键):
有几种方法可以获取所有实例数据,但其中一种更简单的方法可能是在创建实例时将它们全部添加到表中。如果为该实例添加整个表,则主表中的所有值都将更新,因为它的行为类似于指针的集合
function mob:new( x, y, type )
self.x = 100
self.y = 200
self.type = type
-- any other declarations you need
table.insert(allMobs, self)
return self
end
在这里,我们将所有mob插入表'allMobs'。一旦我们有了它,我们就可以简单地遍历并获得所有坐标
for i, v in ipairs(allMobs) do
local x, y = v.x, v.y
-- Do whatever you need with the coordinates. Add them to another table, compare
-- them to others, etc.
end
现在我们有一张桌子,上面有我们所有的暴徒,还有一种进入他们每个位置的方法。如果您有任何进一步的查询,请告诉我。有几种方法可以获取所有实例数据,但其中一种更简单的方法可能是在创建实例时将它们全部添加到表中。如果为该实例添加整个表,则主表中的所有值都将更新,因为它的行为类似于指针的集合
function mob:new( x, y, type )
self.x = 100
self.y = 200
self.type = type
-- any other declarations you need
table.insert(allMobs, self)
return self
end
在这里,我们将所有mob插入表'allMobs'。一旦我们有了它,我们就可以简单地遍历并获得所有坐标
for i, v in ipairs(allMobs) do
local x, y = v.x, v.y
-- Do whatever you need with the coordinates. Add them to another table, compare
-- them to others, etc.
end
现在我们有一张桌子,上面有我们所有的暴徒,还有一种进入他们每个位置的方法。如果您有任何进一步的询问,请告诉我。我想我会用这样的方法来确定顺序。感谢您提醒我存在
table.insert()
,我还没有仔细查看文档的这一部分呢!:)我想,我会用这样的方法来确定顺序。感谢您提醒我存在table.insert()
,我还没有仔细查看文档的这一部分呢!:)对逻辑进行故障排除后,我最终需要重写create\u game\u field()
以包含第二个for循环(使其成为矩阵),并使其成为零矩阵。然后我重写了Mob:can_move生成两个局部变量u和v,对应于currentmap检查和who_is_here检查,如果它们都为0,则返回true。Mob:move不需要任何重写,但是在love.keypressed(key)
中,我只是这样做的如果key==“kp8”和player1:can_move(0,-1),那么player1:move(0,-1)结束
,以清晰起见。我还需要一个功能来更新谁是谁在这里之前,暴徒移动。但它是有效的!对逻辑进行故障排除后,我最终需要重写create\u game\u field()
以包含第二个for循环(使其成为矩阵),并使其成为零矩阵。然后我重写了Mob:can_move生成两个局部变量u和v,对应于currentmap检查和who_is_here检查,如果它们都为0,则返回true。Mob:move不需要任何重写,但是在love.keypressed(key)
中,我只是这样做的如果key==“kp8”和player1:can_move(0,-1),那么player1:move(0,-1)结束
,以清晰起见。我还需要一个功能来更新谁是谁在这里之前,暴徒移动。但它是有效的!