面对coronasdk的物理引擎

关于移动手机的开发,目前网络上主要流行两种开发软件,一个是众所周知的unity(毕竟当年4399小游戏上面的网络版Minecraft由它开发,3d引擎没有任何软件能够超越它),另一个是比较小众化的cocos。cocos占据着2d游戏的主要位置,而unity却占据着3d游戏的主要位置。而我们讲的coronasdk与cocos一样为2d游戏引擎(coronasdk不被人所知主要是因为2010年以前收费,现在连unity都不收费它还收费,把许多开发者吓跑了。所以不如cocos知名度高),而cocos目前官方推荐的语言为js,我读过最好的一本关于java的书叫做《学习java从入门到放弃》,而coronasdk则是采用解释语言lua(其实以前cocos支持lua,但是那家公司把lua项目组给割了,非常非常遗憾)。所以,corona就好写的多了。

任何游戏都会有物理引擎,它比动画写出来效果要好。它能够主要控制一下属性:密度,摩擦系数,弹跳系数,是否受重力的影响等等。它的主要命令为:

local physics = require “physics” —引入物理引擎

physics.start() —启动物理引擎

physics.stop() —关闭物理引擎

physics.addBody() —添加物理对象

好了,我们现在看下面着一个bug

这是一个正常的情况,箱子自由落下,一切正常

 

看到“iang”下面的部分,一个神秘的物体在箱子底下,关键是还引擎(当时我一个人晚上打代码,以为闹鬼了,吓死我了)。

这是开始界面,不断有小箱子从天而降,间隔是300毫秒降一个,之后测试发现,只要快速点击点击屏幕就可以避免这个bug。再次测试的时候发现小箱子降落的越多,大箱子就会被垫的越高。反过来说,就是这个小箱子到的鬼。

那么现在就有两条路可以走了,一个是在转换页面的时候把所有产生的小箱子全部删除,第二个是让小小箱子全部删除(感觉在说一种东西)。那么缕清思路就好办了。

主要代码如下

main = function()

time1 = timer.performWithDelay(300,addcrate,0)

end

addcrate = function()

math.randomseed(os.time())

local seed = math.random(1,5)

choice = math.ceil(seed)

if choice == 1 then

crate = display.newImageRect(“crate1.png”,30,30)

crate.x = 120

crate.y = 5

crate.rotation = 15

physics.addBody(crate,{density = 1,friction = 0.3,bounce = 0})

elseif choice == 2 then

crate = display.newImageRect(“crate1.png”,30,30)

crate.x = 150

crate.y = 5

crate.rotation = 15

physics.addBody(crate,{density = 1,friction = 0.3,bounce = 0})

elseif choice == 3 then

crate = display.newImageRect(“crate1.png”,30,30)

crate.x = 180

crate.y = 5

crate.rotation = 15

physics.addBody(crate,{density = 1,friction = 0.3,bounce = 0})

elseif choice == 4 then

crate = display.newImageRect(“crate1.png”,30,30)

crate.x = 210

crate.y = 5

crate.rotation = 15

physics.addBody(crate,{density = 1,friction = 0.3,bounce = 0})

elseif choice == 5 then

crate = display.newImageRect(“crate1.png”,30,30)

crate.x = 240

crate.y = 5

crate.rotation = 15

physics.addBody(crate,{density = 1,friction = 0.3,bounce = 0})

end

num = num + 1

end

timer.performWithDelay(10,removeCrate,num)

之后corona就会报错

“crate” is a nil value

没办法,另寻出路。重新想一遍我们刚刚干了什么:启动了物理引擎,添加物理对象。所有的都带有物理两个字,意思说我们可以通过物理引擎来实现这一堆东西的消失。这样一切都好弄了。

function scene:exitScene()

–要做什麼事寫在這邊

audio.stop()

audio.dispose(backgroundMusic)

backgroundMusic = nil

background:removeSelf()

background = nil

crate1:removeSelf()

physics.stop()

local result = timer.pause(time1)

end

把下面的大箱子移走,再关闭物理引擎,小箱子就会迅速掉落出去。(正常的话小箱子的y坐标会无限的低,但是corona的垃圾回收装置会把它们回收,这就是为什么你产生再多的箱子动画也不会卡顿)

anyShare分享到:

发表评论

电子邮件地址不会被公开。 必填项已用*标注