Corona SDK - 射击弹丸(处理每个实例)

时间:2014-10-19 14:08:34

标签: lua corona physics

我目前正在努力研究如何使用Corona SDK拍摄射弹。但是,我不知道这样做的最佳方式。我猜你必须生成同一个对象的实例并对它们施加压力,但我不知道最好的方法或者我应该如何处理每个实例。我还在学习Lua,只需要一些如何做的指导,任何帮助都将受到赞赏。

我希望能够在屏幕顶部检查是否有任何子弹击中传感器对象(我还没有实现这个但我知道如何),然后销毁撞击传感器的子弹但是如何检查每个实例并单独销毁它们?

这是我到目前为止的基本结构。

display.setStatusBar( display.HiddenStatusBar )
local physics = require( 'physics' )
physics.start()


local speed = -500
local contentW, contentH = display.contentWidth, display.contentHeight


-- Background
local bg = display.newRect( 0, 0, contentW, contentH )
bg.anchorX = 0
bg.anchorY = 0
bg:setFillColor( 0, 1, 1 )


-- Ground
local ground = display.newRect( 0, contentH - 50, contentW, 50 )
ground.anchorX = 0
ground.anchorY = 0
ground:setFillColor( 0, 0.8, 0 )


-- Hero
local hero = display.newRect( contentW / 2, contentH / 2, 40, 40 )
hero:setFillColor( 1, 0, 0 )


function shoot( event )
    if ( event.phase == 'began' ) then
        local projectile = display.newRect( hero.x, hero.y, 10, 30 )
        physics.addBody( projectile, 'dynamic' )
        projectile.gravityScale = 0
        projectile.isBullet = true
        projectile:setLinearVelocity( 0, -600 )
    end 
end 

Runtime:addEventListener( 'touch', shoot )

2 个答案:

答案 0 :(得分:0)

不确定这是你所追求的,但处理不断变化的多个对象的策略可以在以后因碰撞而删除:

  1. 使用碰撞处理程序
  2. 创建项目符号显示对象
  3. 在碰撞处理程序中,如果需要删除对象,则使用removeSelf;其他更改可能需要延迟更改,如Modifying Objects中所述。
  4. 因此,在shoot之后添加projectile:setLinearVelocity函数:

    projectile.collision = function (event) 
            ... 
            if remove then 
                 self:removeSelf()
            end
            ... 
        end
    projectile:addEventListener( "collision", projectile)
    

    这会为每个项目符号添加处理程序。您可以为传感器添加一个处理程序,它将是您在创建传感器后立即执行的类似代码,除了您删除event.other而不是self

    sensor.collision = function (event) 
            ... 
            if remove then 
                 event.other:removeSelf()
            end
            ... 
        end
    sensor:addEventListener( "collision", sensor)
    

答案 1 :(得分:0)

Corona工作人员在Corona论坛上提出了这一点。

要移除撞击传感器的每颗子弹,您需要给射弹一个类型'这些方面的东西。请注意,您可以使用任何单词而不是'键入',但这是我的首选方式。

projectile.type = 'bullet'

然后,您需要向检测到碰撞的传感器对象添加一个事件监听器,在这种情况下,它是一个名为' wall'的对象。在碰撞时,您想要移除碰撞中的另一个物体(子弹)。你可以这样做。

local function wallCollision( event )
    if event.phase == 'began' then
        if event.other.type == 'bullet' then
            display.remove( event.other )
            event.other = nil
        end
    end
end

wall:addEventListener( 'collision', wallCollision )

' event.other'目标是碰​​撞事件中涉及的另一个对象,在这种情况下,' bullet'。