attempt to call method 'applyLinearImpulse' (a nil value)

I tried to make my character jump with applyLinearImpulse in two scene. On first, my character is jumping very high and leaves from the game screen. On Second this error happened: “attempt to call method ‘applyLinearImpulse’ (a nil value)”

I’m going to post de code from the two archives.

-- Bibliotecas local composer = require( "composer" ) local scene = composer.newScene() local physics = require "physics" local widget = require "widget" -- Algumas Configurações local w = display.contentWidth local h = display.contentHeight local sheetData = { width=83, height=121, numFrames=24} local sheetDataZombie= { width=83, height=100, numFrames=13} local sheetZombie = graphics.newImageSheet("zombie.png", sheetDataZombie) local sheet = graphics.newImageSheet("percy.png", sheetData) local screenW, screenH, halfW = display.actualContentWidth, display.actualContentHeight, display.contentCenterX function goToNextLevel() composer.gotoScene("lastLevel", "fade", 700) composer.removeScene("level1") end local function invertSequence() if toLeft == true then toLeft = false toRight = true elseif toRight == true then toLeft = true toRight = false end end -- Inicio do jogo function scene:create( event ) local sceneGroup = self.view physics.start() physics.setGravity(0, 9) local background = display.newImageRect( "game\_background.jpg", screenW, screenH ) background.anchorX = 0 background.anchorY = 0 background.x = 0 + display.screenOriginX background.y = 0 + display.screenOriginY borda1 = display.newRect(-700, 0, 20, 5000) borda1.alpha = 0 physics.addBody( borda1, "static" ) borda1 = display.newRect(1450, 0, 20, 5000) borda1.alpha = 0 physics.addBody( borda1, "static" ) local parede1 = display.newImageRect("grass.png", 5000, 100) parede1.x = 60 parede1.y = 1024 physics.addBody( parede1, "static" ) local parede2 = display.newImageRect("grass.png", 100, 60) parede2.x = 70 parede2.y = 760 physics.addBody( parede2, "static" ) local parede6 = display.newImageRect("grass.png", 100, 80) parede6.x = 870 parede6.y = 540 physics.addBody( parede6, "static" ) local porta = display.newImageRect("porta.png", 120, 150) porta.x = 450 porta.y = 900 porta.myName = "porta" physics.addBody( porta, "static", {radius = 10, isSensor = true}) local parede7 = display.newImageRect("grass.png", 100, 60) parede7.x = 450 parede7.y = 540 physics.addBody( parede7, "static" ) local sequenceDataPlayer = { { name = "idle", frames = {2} }, { name = "walkToRight", frames = {7, 8, 9, 7}, time = 333, loopCount = 0}, { name = "walkToLeft", frames = {13, 15, 14, 13}, time = 333, loopCount = 0}, { name = "jump", frames = {1} }, } local sequenceDataZombie = { {name = "idle", frames = {6}}, {name = "walkToRight", frames = {1, 2, 3, 4, 5, 6}, time = 333, loopCount = 0}, {name = "walkToLeft", frames = {8, 9, 10, 11, 12, 13}, time = 333, loopCount = 0}, } local player = display.newSprite(sheet, sequenceDataPlayer) player.x = -300 player.y = 950 player:setSequence("idle") player:play() physics.addBody( player, "dynamic", {radius = 45, friction = 3, bounce = 0.1}) player.isFixedRotation = true player.myName = "player" local zombie = display.newSprite(sheetZombie, sequenceDataZombie) zombie.x = 600 zombie.y = 950 physics.addBody(zombie, "dynamic", {radius = 45, density = 10, friction = 3, bounce = 0.1}) zombie.isFixedRotation = true zombie.myName = "zombie" toRight = true toLeft = false if toRight == true then zombie:setSequence("walkToRight") zombie:play() zombie.x = zombie.x + 10 timer.performWithDelay(3000, invertSequence) elseif toLeft == true then zombie:setSequence("walkToLeft") zombie:play() zombie.x = zombie.x - 10 timer.performWithDelay(3000, invertSequence) end local buttons = {} buttons[1] = display.newImage("seta.png") --direita buttons[1].x = 1000 buttons[1].y = 950 buttons[1].rotation = 90 buttons[1].myName = "right" buttons[1].alpha=0.5 buttons[2] = display.newImage("seta.png") --esquerda buttons[2].x = 800 buttons[2].y = 950 buttons[2].rotation = -90 buttons[2].myName = "left" buttons[2].alpha=0.5 buttons[3] = display.newImage("seta.png") --cima buttons[3].x = -300 buttons[3].y = 950 buttons[3].rotation= 0 buttons[3].myName = "up" buttons[3].alpha=0.5 local walkX = 0 local walkY = 0 local function touchFunction(e) local phase = event.phase local name = event.keyName if e.phase == "began" or e.phase == "moved" then if e.target.myName == "up" then player:setSequence("jump") player:applyLinearImpulse( 0, -100) elseif e.target.myName == "left" then player:setSequence("walkToLeft") player:play() walkX = -4 player.xScale = -1 elseif e.target.myName == "right" then player:setSequence("walkToRight") player:play() walkX = 4 player.xScale = -1 end else if e.target.myName == "right" then player:setSequence("idle") elseif e.target.myName == "left" then player:setSequence("idle") end walkY=0 walkX=0 end end local j=1 for j=1, #buttons do buttons[j]:addEventListener("touch", touchFunction) if j == 3 then buttons[j]:addEventListener("tap", touchFunction) end end local update = function(e) player.x = player.x + walkX player.y = player.y + walkY end porta.collision = goToNextLevel porta:addEventListener( "collision" ) Runtime:addEventListener("enterFrame", update) sceneGroup:insert(background) sceneGroup:insert(parede2) sceneGroup:insert(parede6) sceneGroup:insert(parede7) sceneGroup:insert(porta) end function scene:show( event ) local sceneGroup = self.view local phase = event.phase if phase == "will" then elseif phase == "did" then physics.start() end end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if event.phase == "will" then physics.stop() sceneGroup:remove(background) display.remove(parede1) sceneGroup:remove(parede2) sceneGroup:remove(parede6) sceneGroup:remove(parede7) sceneGroup:remove(porta) elseif phase == "did" then -- Called when the scene is now off screen end end function scene:destroy( event ) end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) ----------------------------------------------------------------------------------------- return scene

-- Bibliotecas local composer = require( "composer" ) local scene = composer.newScene() local physics = require "physics" local widget = require "widget" -- Algumas Configurações local w = display.contentWidth local h = display.contentHeight local sheetData = { width=83, height=121, numFrames=24} local sheet = graphics.newImageSheet("percy.png.", sheetData) local screenW, screenH, halfW = display.actualContentWidth, display.actualContentHeight, display.contentCenterX -- Inicio do jogo function scene:create( event ) physics.start() physics.setGravity(0, 9) local background = display.newImageRect( "game\_background3.jpg", screenW, screenH ) background.anchorX = 0 background.anchorY = 0 background.x = 0 + display.screenOriginX background.y = 0 + display.screenOriginY local parede1 = display.newImageRect("grass.png", 5000, 100) parede1.x = 60 parede1.y = 1024 physics.addBody( parede1, "static" ) borda1 = display.newRect(-700, 0, 20, 5000) borda1.alpha = 0 physics.addBody( borda1, "static" ) borda1 = display.newRect(1450, 0, 20, 5000) borda1.alpha = 0 physics.addBody( borda1, "static" ) local sequenceData = { { name = "idle", frames = {2} }, { name = "walkToRight", frames = {7, 9, 8, 7}, time = 333, loopCount = 0}, { name = "walkToLeft", frames = {13, 15, 14, 13}, time = 333, loopCount = 0}, { name = "jump", frames = {1} }, } local player = display.newSprite(sheet, sequenceData) player.x = -300 player.y = 900 player:setSequence("idle") player:play() physics.addBody( player, "dynamic", {radius = 25, friction = 3, bounce = 0.1}) player.isFixedRotation = true player.myName = "player" local buttons = {} buttons[1] = display.newImage("seta.png") --direita buttons[1].x = 1000 buttons[1].y = 950 buttons[1].rotation = 90 buttons[1].myName = "right" buttons[1].alpha=0.5 buttons[2] = display.newImage("seta.png") --esquerda buttons[2].x = 800 buttons[2].y = 950 buttons[2].rotation = -90 buttons[2].myName = "left" buttons[2].alpha=0.5 buttons[3] = display.newImage("seta.png") --cima buttons[3].x = -300 buttons[3].y = 950 buttons[3].rotation= 0 buttons[3].myName = "up" buttons[3].alpha=0.5 local walkX = 0 local walkY = 0 local function touchFunction(e) local phase = event.phase local name = event.keyName if e.phase == "began" or e.phase == "moved" then if e.target.myName == "up" then player:setSequence("jump") player:applyLinearImpulse( 0, -100) elseif e.target.myName == "left" then player:setSequence("walkToLeft") player:play() walkX = -4 player.xScale = -1 elseif e.target.myName == "right" then player:setSequence("walkToRight") player:play() walkX = 4 player.xScale = -1 end else if e.target.myName == "right" then player:setSequence("idle") elseif e.target.myName == "left" then player:setSequence("idle") end walkY=0 walkX=0 end end local j=1 for j=1, #buttons do buttons[j]:addEventListener("touch", touchFunction) if j == 3 then buttons[j]:addEventListener("tap", touchFunction) end end local update = function(e) player.x = player.x + walkX player.y = player.y + walkY end Runtime:addEventListener("enterFrame", update) end function scene:show( event ) local sceneGroup = self.view local phase = event.phase if phase == "will" then -- Called when the scene is still off screen and is about to move on screen elseif phase == "did" then -- Called when the scene is now on screen -- -- INSERT code here to make the scene come alive -- e.g. start timers, begin animation, play audio, etc. physics.start() end end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if event.phase == "will" then physics.stop() elseif phase == "did" then -- Called when the scene is now off screen end end function scene:destroy( event ) end --------------------------------------------------------------------------------- -- Listener setup scene:addEventListener( "create", scene ) scene:addEventListener( "show", scene ) scene:addEventListener( "hide", scene ) scene:addEventListener( "destroy", scene ) ----------------------------------------------------------------------------------------- return scene

With any force you want to take the object’s mass into account.  That way, if you later change the size of the object you will still get the same response to any force.

player:applyLinearImpulse( 0 \* player.mass, -100 \* player.mass )