попытка вызвать метод applyForce - PullRequest
0 голосов
/ 30 августа 2018

Я делаю боковой скроллер, и когда я начинаю свою игру, я могу коснуться экрана, чтобы удержать моего пингвина в воздухе, но когда я терплю неудачу и сталкиваюсь с ледяным блоком, и нажимаю play после перехода к restart.lua, я получаю ошибка при попытке вызвать метод applyForce вот мой код

local function activatePengs(self,event)

    self:applyForce(0, -45, self.x, self.y)

    print("run")

end

local function touchScreen(event)

    print("touch")

    if event.phase == "began" then

        peng.enterFrame = activatePengs
        Runtime:addEventListener("enterFrame", peng)

    end

    if event.phase == "ended" then

        Runtime:removeEventListener("enterFrame", peng)

    end

end


local function onCollision(event)

    if event.phase == "began" then

        print "collide"

        composer.gotoScene( "restart",{ time=800, effect="crossFade" } )

    end

end

-- now comes four required functions for Composer:

function scene:create( event )

    local sceneGroup = self.view

    bg1 = display.newImageRect(sceneGroup, "bg.png", 800, 1000)

    bg2 = display.newImage(sceneGroup, "ice2.png",140,210)

    bg3 = display.newImage(sceneGroup, "ice2.png",540,210)

    bg4 = display.newImage(sceneGroup, "ice2.png",940,210)

    bg5 = display.newImage(sceneGroup, "ice2.png",1340,210)

    bg6 = display.newImage(sceneGroup, "ice2.png",1740,210)

    bg7 = display.newImage(sceneGroup, "ice1.png",140,420)

    bg8 = display.newImage(sceneGroup, "ice1.png",540,420)

    bg9 = display.newImage(sceneGroup, "ice1.png",940,420)

    bg10 = display.newImage(sceneGroup, "ice1.png",1340,420)

    bg11 = display.newImage(sceneGroup, "ice1.png",1740,420)

    peng = display.newImage(sceneGroup, "peng.png", 80, 201)
    physics.addBody(peng, "dynamic", {density=.18, bounce=0.1, friction=.5, radius=55})
    ...
end

1 Ответ

0 голосов
/ 31 августа 2018

Вероятно, ошибка возникает из-за того, что пингвин не является физическим объектом при вызове функции. Я думаю, что удаление слушателя enterFrame перед переходом к следующей сцене должно решить вашу проблему.

Я добавил некоторые улучшения в ваш код (не тестировался):

local applyForceToPenguin = false 

local function enterFrame( self, event )

    if applyForceToPenguin then

        self:applyForce( 0, -45, self.x, self.y )

        print("run")

    end

end

local function touchScreen(event)

    print("touch")

    if event.phase == "began" then applyForceToPenguin = true end

    if event.phase == "ended" then applyForceToPenguin = false end

end


local function onCollision(event)

    if event.phase == "began" then

        print "collide"

        applyForceToPenguin = false

        composer.gotoScene( "restart",{ time=800, effect="crossFade" } )

    end

end

-- now comes four required functions for Composer:

function scene:create( event )

    local sceneGroup = self.view

    bg1  = display.newImageRect( sceneGroup, "bg.png", 800, 1000 )
    bg2  = display.newImage( sceneGroup, "ice2.png", 140, 210 )
    bg3  = display.newImage( sceneGroup, "ice2.png", 540, 210 )
    bg4  = display.newImage( sceneGroup, "ice2.png", 940, 210 )
    bg5  = display.newImage( sceneGroup, "ice2.png", 1340, 210 )
    bg6  = display.newImage( sceneGroup, "ice2.png", 1740, 210 )
    bg7  = display.newImage( sceneGroup, "ice1.png", 140, 420 )
    bg8  = display.newImage( sceneGroup, "ice1.png", 540, 420 )
    bg9  = display.newImage( sceneGroup, "ice1.png", 940, 420 )
    bg10 = display.newImage( sceneGroup, "ice1.png", 1340, 420 )
    bg11 = display.newImage( sceneGroup, "ice1.png", 1740, 420 )

    peng = display.newImage( sceneGroup, "peng.png", 80, 201)
    physics.addBody( peng, "dynamic", { density=.18, bounce=0.1, friction=.5, radius=55 } )
    Runtime:addEventListener( "enterFrame", enterFrame )
    ...
end

function scene:destroy()

    Runtime:removeEventListener( "enterFrame", enterFrame )

end

function scene:hide( event )
    local sceneGroup = self.view
    local phase = event.phase

    if phase == "will" then
        -- Code here runs when the scene is still off screen (but is about to come on screen)

    elseif phase == "did" then
        -- Code here runs when the scene is entirely on screen
        applyForceToPenguin = false
    end    

end

scene:addEventListener( "hide", scene )
scene:addEventListener( "destroy", scene )

Хорошего дня:)

...