刚开始玩真棒日冕sdk。
我开始制作一款简单的射击游戏。
我有以下代码:
-- Global Variables
local shot = audio.loadSound('shot.mp3')
local bg = display.newImage('bg.png')
local shoot = {}
local Main = {}
local Init = {}
local bullets = display.newGroup()
function update()
if(bullets.numChildren ~= 0) then
for i = 1, bullets.numChildren do
bullets[i].y = bullets[i].y - 8
-- Destroy Offstage Bullets
if(bullets[i].y < (-bullets[i].height-5)) then
-- bullets[i]:removeSelf()
bullets:remove(bullets[i])
display.remove(bullets[i])
return
end
end
end
end
-- Initialisation functions
function Init ()
display.setStatusBar(display.HiddenStatusBar)
local movieclip = require('movieclip')
local physics = require('physics')
physics.start()
physics.setGravity(0, 0)
end
function shoot:tap(e)
for i = 1, 15 do
local bullet = display.newImage('bullet.png')
bullet.x = 150
bullet.y = 470
bullet.name = 'bullet'
physics.addBody(bullet)
bullets.insert(bullets, bullet)
end
audio.play(shot)
end
-- Main routine
function Main ()
Init()
bg:addEventListener('tap', shoot)
Runtime:addEventListener('enterFrame', update)
end
Main()
现在它'有效';但当子弹进入屏幕时,整个“游戏”速度变慢,我可以清楚地看到每个子弹被移除,这会减慢游戏速度。
也许我做得不对;还试过:removeSelf()函数;相同的结果。
答案 0 :(得分:3)
我遇到了同样的问题......为此得到了解决方案:
您正在使用for循环删除对象: 如果你删除for循环中的对象说:你删除了索引1处的对象,那么对象2移动到对象1 ...所以当它循环到对象时它不会检查对象2(bcoz它移动到对象1的位置而你正在检查对象3)
for j = 1, buttonGroup.numChildren do
buttonGroup[1]:removeSelf(); --this removes all childrens
end
for j = 1, buttonGroup.numChildren do
buttonGroup[j]:removeSelf(); --this removes alternative childrens
end
我希望它有用
答案 1 :(得分:0)
我为我的游戏中的对象移除进行了很长时间的战斗,该游戏使用了许多标签视图。我发现的解决方案是在需要删除的所有对象上使用“= nil”,“:removeSelf()”和“.alpha = 0”。如果它们都被添加到同一个组中,并且其中没有其他内容,那么也可以使用它,但并不总是因为各种原因而在幕后如何设置组。
看起来你所做的就是删除“子弹”的内容,但这只是一个参考,所以你说每个子弹被删除,它实际上只是从数组中删除 - 对象本身仍然存在并且需要为了防止内存泄漏和应用程序速度变慢而被取消(你可能会发现每个子弹都会减慢应用程序的速度,对吗?)
删除后添加此条件,您应该设置:
if(not(bullet == nil)) then
bullet.alpha = 0;
bullet:removeSelf();
bullet = nil;
end
答案 2 :(得分:0)
更容易创建像这样的表
local bulletCache = {}
然后在你的子弹创建代码中添加
table.insert(bulletCache, myBulletObject)
然后在您的退出代码中和/或您的销毁代码说
for i = 1, #bulletCache do
--[[
--Below is not needed but just to keep your code consitant
pcall(function()
bullet.alpha = 0
end)
--]]
pcall(function()
bullet:removeSelf()
end)
pcall(function()
bullet = nil
end)
end
答案 3 :(得分:0)
首先,永远不要尝试在GameLoop中执行任何类型的循环。它确实会降低游戏的fps,因为它通常需要更多的内存。
现在,你似乎只想在从屏幕上消失之后销毁子弹,而你也在使用物理,那你为什么不利用它呢?
以下是您应遵循的步骤。 (如果您发现任何疑问或疑问,请问我)
1.在屏幕上方稍微画一条静态物理线。假设y是-20。
local _yLimit = -20
local _limitLine = display.newLine(0,_yLimit,display.contentWidth,_yLimit)
_limitLine.anchorX = 0
_limitLine.anchorY = 0
2.将所有项目符号添加为物理对象。
3.在子弹的底部中心施力,而不是转换它。 [假设子弹具有矩形物理形状,否则决定形状的平衡点]。
4.检查与“碰撞”事件监听器的冲突。
5.在碰撞时销毁子弹
这很简单:)
如果您对此仍有疑问,请与我联系。