关于移动手机的开发,目前网络上主要流行两种开发软件,一个是众所周知的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的垃圾回收装置会把它们回收,这就是为什么你产生再多的箱子动画也不会卡顿)
本文由 落格博客 原创撰写:落格博客 » 面对coronasdk的物理引擎
转载请保留出处和原文链接:https://www.logcg.com/archives/2846.html