StarExplorer Error

Hello everyone, I am doing the StarExplorer tutorial now but I am getting an error that I can’t figure out.  The problem begins after I enter the code to move the ship.  The code before the ship movement (shooting the lasters, for examples) works perfectly fine.

According to the Demo I should be able to run the code without errors after I enter in the ship movement code:

“Let’s check the result of our code. Save your modified main.lua file, relaunch the Simulator, and experiment with touching and dragging the ship around.”

However, this is the error message that I receive:

"Corona Runtime Error

main.lua:156: attempt to perform arithmetic on field ‘touchOffsetX’ (a

nil value)

stack traceback:

main.lua:156: in function ‘?’

?: in function <?:190>

Do you want to relaunch the project?"

Here is my code so far:


– main.lua


local physics = require( “physics” )

physics.start()

physics.setGravity( 0, 0 )

– Seed the random number generator

math.randomseed( os.time() )

–Configure image sheet

local sheetOptions =

{

frames =

{

{ – 1) asteroid 1

x = 0,

y = 0,

width = 102,

height = 85

},

{ – 2) asteroid 2

x = 0,

y = 85,

width = 90,

heaight = 83

},

{ – 3) asteroid 3

x = 0,

y = 168,

width = 100,

height = 97

},

{ – 4) ship

x = 0,

y = 265,

width = 98,

height = 79

},

{ – 5) laser

x = 98,

y = 265,

width = 14,

height = 40

},

},

}

local objectSheet = graphics.newImageSheet( “gameObjects.png”, sheetOptions )

– Initialize variables

local lives = 3

local score = 0

local died = false

local asteroidsTable = {}

local ship

local gameLoopTimer

local livesText

local scoreText

–Set up display groups

local backGroup = display.newGroup() – Display group for the background image

local mainGroup = display.newGroup() --Display group for the ship, asteroids, lasers, etc.

local uiGroup = display.newGroup() --Display group for UI objects like the score

– Load the background

local background = display.newImageRect( backGroup, “background.png”, 800, 1400 )

background.x = display.contentCenterX

background.y = display.contentCenterY

ship = display.newImageRect( mainGroup, objectSheet, 4, 98, 79 )

ship.x = display.contentCenterX

ship.y = display.contentHeight - 100

physics.addBody( ship, { radius=30, isSensor=true } )

ship.myName = “ship”

–Display lives and score

livesText = display.newText( uiGroup, "Lives: " … lives, 200,80, native.systemFont, 36 )

scoreText = display.newText( uiGroup, "Score: " … score, 400,80, native.systemFont, 36 )

–Hide the status bar

display.setStatusBar( display.HiddenStatusBar )

local function updateText()

livesText.text = "Lives: " … lives

scoreText.text = "Score: " … score

end

local function createAsteroid()

local newAsteroid = display.newImageRect( mainGroup, objectSheet, 1, 102, 85 )

table.insert( asteroidsTable, newAsteroid )

physics.addBody( newAsteroid, “dynamic”, { radius=40, bounce=0.8} )

newAsteroid.myName = “asteroid”

local whereFrom = math.random ( 3 )

if ( whereFrom == 1 ) then

– From the left

newAsteroid.x = -60

newAsteroid.y = math.random( 500 )

newAsteroid:setLinearVelocity( math.random( 40,120 ), math.random( 20,60 ) )

elseif (whereFrom == 2 ) then

–From the top

newAsteroid.x = math.random( display.contentWidth )

newAsteroid.y = -60

newAsteroid:setLinearVelocity( math.random( -40,40 ), math.random( 40,120) )

elseif (whereFrom == 3 ) then

– From the right

newAsteroid.x = display.contentWidth + 60

newAsteroid.y = math.random( 500 )

newAsteroid:setLinearVelocity( math.random( -120,-40 ), math.random( 20,60 ) )

end

newAsteroid:applyTorque( math.random( -6,6 ) )

end

local function fireLaser()

local newLaser = display.newImageRect( mainGroup, objectSheet, 5, 14, 40 )

physics.addBody( newLaser, “dynamic”, { isSensor=true } )

newLaser.isBullet = true

newLaser.myName = “laser”

newLaser.x = ship.x

newLaser.y = ship.y

newLaser:toBack()

transition.to( newLaser, { y=-40, time=500,

onComplete = function() display.remove( newLaser ) end

} )

end

ship:addEventListener( “tap”, fireLaser )

local function dragShip( event )

local ship = event.target

local phase = event.phase

if ( “begin” == phase ) then

–Set touch focus on the ship

display.currentStage:setFocus( ship )

– Store initial offset position

ship.touchOffsetX = event.x - ship.x

elseif ( “moved” == phase ) then

– Move the ship to the new touch position

ship.x = event.x - ship.touchOffsetX

elseif ( “ended” == phase or “cancelled” == phase ) then

– Release touch focus on the ship

display.currentStage:setFocus( nil )

end

return true – Prevents touch propagation to underlying objects

end

ship:addEventListener( “touch”, dragShip )

Hi @gcgipson,

You mistyped here 

if ( “begin” == phase ) then

Touch event should be written as _ began _

Thank you so much!

Hi @gcgipson,

You mistyped here 

if ( “begin” == phase ) then

Touch event should be written as _ began _

Thank you so much!