电晕/Lua功能范围

电晕/Lua功能范围,lua,coronasdk,Lua,Coronasdk,我是科罗纳的新手。我不知道如何解决这个问题 我主要创建2个本地对象,玩家和敌人 玩家有一个叫做takeDamage的功能 当我试图呼叫player.takeDamage时,它看不到功能 我想这是因为main拥有这两个对象,而他们彼此不了解 我如何让敌人调用该函数,使其对玩家造成伤害 main.lua包含: -- Create player character local player = require("player"); player = player.new(); -- Create e

我是科罗纳的新手。我不知道如何解决这个问题

我主要创建2个本地对象,玩家和敌人

玩家有一个叫做takeDamage的功能

当我试图呼叫player.takeDamage时,它看不到功能

我想这是因为main拥有这两个对象,而他们彼此不了解

我如何让敌人调用该函数,使其对玩家造成伤害

main.lua包含:

-- Create player character
local player = require("player");
player = player.new();

-- Create enemy character
local enemy = require("enemy");
enemy = enemy.new();
我想我可以让球员全球化,但据我所知,这不是最好的做法


任何帮助都将不胜感激

如果可以安全地假设只有一个“玩家”实例,则可以将其设置为全局。否则,您必须按照以下思路进行操作:

-- 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 = require 'Player'
local player = Player.new()

理想情况下,你不希望玩家直接引用敌人或者敌人引用玩家。相反,您可以轮询游戏循环中的每个参与者,并根据结果更新游戏状态

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

--game loop - in a real game this isn't a busy while
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

    -- more game logic here

    render(player)
    render(enemy)
end
在真实的游戏中,状态变化将由触摸事件等驱动。我的忙循环(
,而true do
)说明了一般思路

您还必须利用您的想象力来处理缺少的实现


有很多方法可以模拟游戏。我不是说这是最好的。不过,它确实显示了一种解耦交互元素的方法。

感谢您回复Corbin。你在这里展示的模型更多的是针对回合制游戏,还是适用于其他游戏?我不确定这是否是我想要的,但我会考虑一下,看看是否能找到适合我尝试做的。@Kenny-它适用于回合或实时游戏。将我的
while
循环替换为事件-UI动作(旋转或实时)或帧事件(仅实时)。关键特性是一个控制器/代理/管理器,它协调可以交互的元素之间的操作,而不是通过直接引用链接这些元素。保持他们的独立可以让他们更容易对自己的行为和责任进行推理。谢谢Michal。这个游戏只有一个玩家。其他任何东西要么是可以交互的静态对象,要么是敌人。我知道你在做什么,给敌人一个玩家的参考。你认为这比让玩家全球化更好吗?感谢您澄清命名约定。我同意为了清晰起见,名字至少应该有不同的封顶。我个人会使用全局变量设计
player
。一个原因是它将在任何地方都可用,你不必像我写的那样设计复杂的方案。另一个原因是内存-你只有一个对玩家的引用,而不是N(敌人的数量)。最后一种方法是拥有一个
游戏状态
全局,其中将包含玩家和其他必要的游戏状态。我忘了提到敌人可能也需要彼此交互,所以我不确定全局选项是否合适。我们不希望所有实体都是全局的,是吗?当然不是:)但是,你可以在全局状态下保存所有敌人,比如
gameState.friends={}
。然后你可以用这种方式为每个敌人遍历它:
函数敌人:检查碰撞(),在ipairs(gameState.friends)中如果e~=self那么做--[[你在这里的处理]]结束
它不应该是
玩家:承受伤害
?分号表示它是一个实例方法。