Having trouble finding the error[s] in StarExplorer

I am receiving some errors, and I cannot figure out where I am going wrong. Any help will be greatly appreciated!

Eric

local composer = require( “composer” )

local scene = composer.newScene()


– Code outside of the scene event functions below will only be executed ONCE unless

– the scene is removed entirely (not recycled) via “composer.removeScene()”


local physics = require( “physics” )

physics.start()

physics.setGravity( 0, 0 )

– 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,

            height = 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

local backGroup

local mainGroup

local uiGroup

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”

end

    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

local function fireLaser()    – Firing mechanics

   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 )

gameLoopTimer = timer.performWithDelay( 500, gameLoop, 0 )

local function dragShip( event )

    local ship = event.target

    local phase = event.phase

    if ( “began” == 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 propogation to underlying objects

end

local function gameLoop()

   – Create new asteroid

   createAsteroid()

   – Remove asteroids which have drifted off screen

   for i = #asteroidsTable, 1, -1 do

       local thisAsteroid = asteroidsTable[i]

       if ( thisAsteroid.x < -100 or

            thisAsteroid.x > display.contentWidth + 100 or

            thisAsteroid.y < -100 or

            thisAsteroid.y > display.contentHeight + 100 )

       then

            display.remove( thisAsteroid )

            table.remove( asteroidsTable, i )

       end

   end

end

local function restoreShip()

   ship.isBodyActive = false

   ship.x = display.contentCenterX

   ship.y = display.contentHeight - 100

   – Fade in the ship

   transition.to( ship, { alpha=1, time=4000,

       onComplete = function()

            ship.isBodyActive = true

            died = false

       end

   })

end

local function onCollision( event )

   if ( event.phase == “began” ) then

        local obj1 = event.object1

        local obj2 = event.object2

        if ( ( obj1.myName == “laser” and obj2.myName == “asteroid” ) or

             ( obj1.myName == “asteroid” and obj2.myName == “laser” ) )

        then

            – Remove both the laser and the asteroid

            display.remove( obj1 )

            display.remove( obj2 )

            for i = #asteroidsTable, 1, -1 do

                if ( asteroidsTable[i]  == obj1 or asteroidsTable[i] == obj2 ) then

                    table.remove( asteroidsTable, i )

                    break

                end

            end

            – Increase score

            score = score + 100

            scoreText.text = "Score: " … score

         elseif ( ( obj1.myName == “ship” and obj2.myName == “asteroid” ) or

                  ( obj1.myName == “asteroid” and obj2.myName == “ship” ) )

         then

             if ( died == false ) then

                  died = true

                  – Update lives

                  lives = lives - 1

                  livesText.text = "Lives: " … lives

                  if ( lives == 0 ) then

                      display.remove( ship )

                  else

                       ship.alpha = 0

                       timer.performWithDelay( 1000, restoreShip )

                  end

             end

         end

    end

end


– Scene event functions


– create()

function scene:create( event )

local sceneGroup = self.view

– Code here runs when the scene is first created but has not yet appeared on screen

physics.pause() – Temporarily pause the physics engine

– Set up display groups

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

sceneGroup:insert( backGroup ) – Insert into the scene’s view group

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

  sceneGroup:insert( mainGroup ) – Insert into the scene’s view group

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

sceneGroup:insert( uiGroup )   – Insert into the scene’s view group

  – 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 )

  ship:addEventListener( “tap”, fireLaser )

  ship:addEventListener( “touch”, dragShip )

end

– show()

function scene:show( 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

    physics.start()

    Runtime:addEventListener( “collision”, onCollision )

    gameLoopTimer = timer.performWithDelay( 500, gameLoop, 0 )

  end

end

– hide()

function scene:hide( event )

local sceneGroup = self.view

local phase = event.phase

if ( phase == “will” ) then

– Code here runs when the scene is on screen (but is about to go off screen)

elseif ( phase == “did” ) then

– Code here runs immediately after the scene goes entirely off screen

end

end

– destroy()

function scene:destroy( event )

local sceneGroup = self.view

– Code here runs prior to the removal of scene’s view

end


– Scene event function listeners


scene:addEventListener( “create”, scene )

scene:addEventListener( “show”, scene )

scene:addEventListener( “hide”, scene )

scene:addEventListener( “destroy”, scene )


return scene

Hello and welcome to the forums.

Let me address a couple of administrative things first. When posting code, please click on the blue <> button in the row with Bold, Italic, etc. and paste your code into the popup window. This will help people read your code better.  Generally speaking you should only post the code near your error. But in this case, your full scene is probably going to be needed, so you’re good there. Also instead of attaching an file or screen shot of the error, it’s always best to copy/paste it into the post as well.

Now for your error, you are missing an “end” statement somewhere or have a misplaced “end”.  For every block that you start (function, if, for, while, etc.) there has to be a matching end. Usually it suggests where that might have started, but in your error it didn’t give any hint. 

Looking at your indentions in your code I suspect it may be here:

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" end --\<-------- see this end is not indented with the rest of the block 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 --\<------------------------------- See how the end above this closes an "if" but there isn't an "end" to end the function local function fireLaser() -- Firing mechanics

I put some comments in where I think the problem is. I believe you have a mis-placed “end”. Try moving the end that’s out of place to the bottom where it appears to be missing.

Rob

Hello and welcome to the forums.

Let me address a couple of administrative things first. When posting code, please click on the blue <> button in the row with Bold, Italic, etc. and paste your code into the popup window. This will help people read your code better.  Generally speaking you should only post the code near your error. But in this case, your full scene is probably going to be needed, so you’re good there. Also instead of attaching an file or screen shot of the error, it’s always best to copy/paste it into the post as well.

Now for your error, you are missing an “end” statement somewhere or have a misplaced “end”.  For every block that you start (function, if, for, while, etc.) there has to be a matching end. Usually it suggests where that might have started, but in your error it didn’t give any hint. 

Looking at your indentions in your code I suspect it may be here:

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" end --\<-------- see this end is not indented with the rest of the block 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 --\<------------------------------- See how the end above this closes an "if" but there isn't an "end" to end the function local function fireLaser() -- Firing mechanics

I put some comments in where I think the problem is. I believe you have a mis-placed “end”. Try moving the end that’s out of place to the bottom where it appears to be missing.

Rob