Corona/Lua功能作用域

我是 Corona 的新手。我不确定如何解决这个问题。

在主函数中,我创建了两个本地对象 player 和 enemy。

Player 有一个名为 takeDamage 的函数。

当我从 enemy 中尝试调用 player. takeDamage 时,它无法看到该函数。

我猜这是因为 main 拥有两个对象,它们彼此不知道。

如何让敌人调用该函数,以便它可以给玩家造成伤害?

main.lua 包含:

-- 创建玩家角色
local player = require("player");
player = player.new();

-- 创建敌人角色
local enemy = require("enemy");
enemy = enemy.new();

我认为我可以将 player 设为全局变量,但据我所知,那不是最佳实践。

非常感谢您的帮助。

原文链接 https://stackoverflow.com/questions/9284498

点赞
stackoverflow用户221509
stackoverflow用户221509

如果可以安全地假设只有一个“player”实例,那么您可以将其设为全局变量。否则,您需要像这样做:

-- main.lua
local player = require 'player'.new()
local enemy = require 'enemy'.new()
enemy:setPlayer(player)

-- enemy.lua
...
function enemy:setPlayer(player)
  self.player = player
end

在敌人代码中稍后使用 self.player 来引用玩家。请注意,这将消耗内存,因为玩家引用将被复制到每个敌人实例中。

顺便说一句,我不认为将模块和实例称为相同的名称(即 player)是一个好习惯。后来不清楚您是指模块还是实例。安全的方法是将模块称为 PlayerEnemy,代码看起来像这样:

Player = require 'Player'
local player = Player.new()
2012-02-14 23:04:12
stackoverflow用户7625
stackoverflow用户7625

理想情况下,你不希望玩家直接引用敌人,也不希望敌人直接引用玩家。相反,你可以轮询每个参与者,并基于结果更新游戏状态。

local player = make_player()
local enemy = make_enemy()

--游戏循环——在真实游戏中,这不是一个繁忙的循环
while true do

    local move = player.move()
    local result = validate_move(move)
    if result.is_valid then
        update_position(player, result)
    end

    move = enemy.move()
    result = validate_move(move)
    if result.is_valid then
        update_position(enemy, result)
    end

    local attack = player.attack()
    local attack_result = validate_attack(attack)
    if attack_result.hit then
        update_health(enemy, attack_result)
    end

    -- 更多的游戏逻辑在这里

    render(player)
    render(enemy)
end

在真实游戏中,状态转换将由[事件驱动](http://developer.anscamobile.com/content/application-programming-guide-event-handling) - 触摸事件,[绘制事件](http://developer.anscamobile.com/content/application-programming-guide-graphics-and-drawing#Drawing_Cycle)等。我的繁忙循环(`while true do`)说明了一般想法。

你还必须自己想象缺失实现。

有很多方法来建模一个游戏。我并不是建议这是最好的方法。不过,它确实展示了一种解耦交互元素的方式。

2012-02-15 05:44:41