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 )