Corona/Lua功能作用域
2012-2-14 21:35:7
收藏:0
阅读:88
评论:2
我是 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用户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
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
如果可以安全地假设只有一个“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
)是一个好习惯。后来不清楚您是指模块还是实例。安全的方法是将模块称为Player
和Enemy
,代码看起来像这样:Player = require 'Player' local player = Player.new()