Lua 创建多个碰撞。
2013-5-9 2:51:32
收藏:0
阅读:90
评论:1
我正在尝试创建一个打砖块游戏,其中的砖块可以被击中两次才会消失。
我尝试过:
--FOR STRONGER DEFENDERS
for i = 1, len do
for j = 1, level_W do
if(level[i][j] == 2) then
local strong = display.newImage('images/strongdefender.png')
strong.name = 'strong'
strong.x = def_W * j - offset
strong.y = def_H * i
physics.addBody(strong, {density = 1, friction = 0, bounce = 0})
strong.bodyType = 'static'
strongs.insert(strongs, strong)
end
end
end
for i = 1, len do
for j = 1, level_W do
if(level[i][j] == 2) then
local defender = display.newImage('images/defender.png')
defender.name = 'defender'
defender.x = def_W * j - offset
defender.y = def_H * i
physics.addBody(defender, {density = 1, friction = 0, bounce = 0})
defender.bodyType = 'static'
end
end
end
level 是一个填充着 0 和 2 的表格。2 是防御者图像会出现的位置。
我的碰撞事件如下:
function onCollision(e)
if(e.other.name == 'defender' or e.other.name == 'strong' and (ball.x + ball.width * 0.5) < (e.other.x + e.other.width * 0.5)) then
xSpeed = -5
elseif(e.other.name == 'defender' or e.other.name == 'strong' and (ball.x + ball.width * 0.5) >= (e.other.x + e.other.width * 0.5)) then
xSpeed = 5
end
if(e.other.name == 'defender') then
audio.play(defencePop)
ySpeed = ySpeed * -1
e.other:removeSelf()
e.other = nil
defenders.numChildren = defenders.numChildren - 1
--SORT SCORE
score = score + 1
scoreNum.text = score * points
scoreNum:setReferencePoint(display.CenterLeftReferencePoint)
scoreNum.x = 54
elseif(e.other.name == 'strong') then
audio.play(defencePop)
ySpeed = ySpeed * -1
e.other:removeSelf()
e.other = nil
defenders.numChildren = defenders.numChildren - 1
--SORT SCORE
score = score + 1
scoreNum.text = score * points
scoreNum:setReferencePoint(display.CenterLeftReferencePoint)
scoreNum.x = 54
end
--defenders.numChildren < 0
if(strongs.numChildren < 0) then
bgAlert('win')
gameStatus = 'win'
end
end -- removeDefender
当球与防御者碰撞时,它们都会消失。如何使它们一个一个地消失?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
我建议你只把强防守放在屏幕上,并为它们添加事件侦听器。当强防守发生碰撞时,就会创建一个较弱的砖块。这个想法是在碰撞发生时移除对象并添加一个新对象。
首先,你需要展示强对象并将它们添加到物理世界中。你还需要为对象添加本地碰撞事件侦听器。
for i = 1, len do for j = 1, level_W do if(level[i][j] == 2) then local strong = display.newImage('images/strongdefender.png') strong.name = 'strong' strong.x = def_W * j - offset strong.y = def_H * i physics.addBody(strong, {density = 1, friction = 0, bounce = 0}) strong.bodyType = 'static' strong.collision = onBrickCollision -- onStrongCollision 是碰撞处理器函数的名称。 strong:addEventListener("collision" , strong) -- 添加碰撞侦听器。 strongs.insert(strongs, strong) end end end事件侦听器如下:
function onBrickCollision(self , event) if event.phase == "began" and event.other.name == "ball" then if (ball.x + ball.width * 0.5) < (self.x + self.width * 0.5) then xSpeed = -5 else xSpeed = 5 end if self.name == "strong" then audio.play(defencePop) ySpeed = ySpeed * -1 -- 在强物体的位置创建防守者并将其添加到物理世界中。 local defender = display.newImage('images/defender.png') defender.name = 'defender' 将其位置设置为被球撞击的对象的位置。 defender.x = self.x defender.y = self.y physics.addBody(defender, {density = 1, friction = 0, bounce = 0}) defender.bodyType = 'static' defender.collision = onBrickCollision defender:addEventListener("collision", defender) -- 移除强砖块。 self:removeSelf() self = nil -- 重新排序得分。 score = score + 1 scoreNum.text = score * points scoreNum:setReferencePoint(display.CenterLeftReferencePoint) scoreNum.x = 54 elseif self.name == "defender" then audio.play(defencePop) ySpeed = ySpeed * -1 self:removeSelf() self = nil defenders.numChildren = defenders.numChildren - 1 -- 重新排序得分。 score = score + 1 scoreNum.text = score * points scoreNum:setReferencePoint(display.CenterLeftReferencePoint) scoreNum.x = 54 end end希望这段代码很容易理解 :)
如果你有任何问题,请随时问我。