Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua Corona SDK-发射射弹(处理每个实例)_Lua_Coronasdk_Physics - Fatal编程技术网

Lua Corona SDK-发射射弹(处理每个实例)

Lua Corona SDK-发射射弹(处理每个实例),lua,coronasdk,physics,Lua,Coronasdk,Physics,我目前正试图弄清楚如何使用Corona SDK拍摄射弹。然而,我不知道这样做的最佳方式。我猜您必须生成同一对象的实例并对其应用强制,但我不知道最好的方法,也不知道如何处理每个实例。我仍在学习Lua,只是需要一些如何做的指导,任何帮助都将不胜感激 我希望能够在屏幕顶部检查是否有子弹击中传感器对象(我没有实现这一点,但我知道如何实现),然后销毁击中传感器的子弹,但如何检查每个实例并单独销毁它们 这是我到目前为止的基本结构 display.setStatusBar( display.HiddenSta

我目前正试图弄清楚如何使用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 )

不确定这是您所追求的,但处理不断演变的多个对象的策略是:

  • 使用冲突处理程序创建项目符号显示对象
  • 在冲突处理程序中,如果需要删除对象,则使用
    removeSelf
    ;如中所述,其他变更可能需要延迟变更
  • 因此,在您的
    shoot
    函数中,您将在
    抛射:setLinearVelocity
    之后添加:

    projectile.collision = function (event) 
            ... 
            if remove then 
                 self:removeSelf()
            end
            ... 
        end
    projectile:addEventListener( "collision", projectile)
    
    这会将处理程序添加到每个项目符号中。您可以只为传感器添加一个处理程序,该处理程序与创建传感器后立即添加的代码类似,只是删除了
    事件。其他
    而不是
    self

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

    这是科罗纳工作人员在科罗纳论坛上提出的建议

    要清除击中传感器的每一颗子弹,你需要沿着这些线给弹丸一种“类型”的东西。请注意,您可以使用任何单词代替“type”,但这是我首选的方式

    projectile.type = 'bullet'
    
    然后,您需要向检测碰撞的传感器对象添加事件侦听器,在本例中,它是一个名为“墙”的对象。碰撞时,要删除碰撞中的其他对象(项目符号)。你可以这样做

    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”。

    感谢您的回复,不过我已经解决了这个问题!无论如何,谢谢,我将发布一个关于如何做的答案。这是在Corona论坛上向我解释的方法,Corona的一名工作人员对此进行了回答。他还检查了我的代码,我做了,他没有评论这是一个问题,这就是为什么我认为这是正确的解决方案。我已经更新了我的解决方案,注意到它是一种替代方法,并且您的解决方案也可以工作。调用一个以“other”对象为参数的函数并在该函数中删除它是否也是一种可行的方法,而不是使用计时器?如果其他人在另一个论坛上提供了答案,那么正确的做法是引用该论坛中的帖子(当然有它的URL)。这就是说,现在我脸上挂着鸡蛋,因为我刚刚检查了文件,文件上说需要延迟的是更改/创建而不是基本删除(见下一条评论)。来自Corona docs:如果由于冲突需要修改/创建对象,则冲突处理程序应设置一个标志或添加一个时间延迟,以便在下一个应用程序周期或以后发生更改,例如通过timer.performWithDelay()。碰撞期间对一个或两个对象的基本删除(display.remove()或object:removeSelf())不受此规则的约束。“非常感谢您的帮助!我将再次编辑我的解决方案。”