why is this error coming out in Corona sdk? - lua
12:39:31.002 ERROR: Runtime error
12:39:31.002 C:\Users\User\Documents\Corona Projects\MATH FOR CHILDREN\level1.lua:207: attempt to call method 'setFillColor' (a nil value)
12:39:31.002 stack traceback:
12:39:31.002 C:\Users\User\Documents\Corona Projects\MATH FOR CHILDREN\level1.lua:207: in function 'listener'
12:39:31.002 D:\a\corona\corona\subrepos\timer\timer.lua:331: in function 'method'
12:39:31.002 D:\a\corona\corona\platform\resources\init.lua:220: in function <D:\a\corona\corona\platform\resources\init.lua:189>
This is my code
local composer = require("composer");
local scene = composer.newScene();
local widget = require( "widget" )
local json = require("json")
display.setDefault("background", 55/255, 50/255, 47/255);
------------------------------------------------------------------------------------
local tapText
local casi = display.newText( "a", display.contentCenterX, 700, "Myfontilqar-Regular.ttf", 42 )
casi:setFillColor(0/255,196/255,253/255,1)
local yes = display.newText( "c", display.contentCenterX, 700, "Myfontilqar-Regular.ttf", 46 )
yes:setFillColor(6/255,204/255,36/255,1)
local no = display.newText( "b", display.contentCenterX, 700, "Myfontilqar-Regular.ttf", 44 )
no:setFillColor(219/255,26/255,15/255,1)
local bal
local balpl
local vrem
local scetcikBal = 0
local scetcikBalpl = 0
local scetcikLevel = 0
local settings = {
yesJ = 0, noJ = 0, procent = 0, procent2 = 0
}
local function saveSettings()
local path = system.pathForFile( "itoq.json", system.DocumentsDirectory )
local file = io.open( path, "w" )
if (file) then
local contents = json.encode(settings)
file:write( contents )
io.close( file )
return true
end
end
local secondL = 20
local function obnovVr( event )
secondL = secondL - 1
vrem.text = secondL
if secondL == 0 then
settings.yesJ = scetcikBal
settings.noJ = scetcikBalpl
settings.procent = (scetcikBal * 10)
saveSettings()
composer.gotoScene( "Level1Score")
end
end
local kor = {
{display.contentCenterX - 66, display.contentCenterY + 120},
{display.contentCenterX + 70, display.contentCenterY + 120},
{display.contentCenterX - 66, display.contentCenterY + 200},
{display.contentCenterX + 70, display.contentCenterY + 200}
}
local tb = {
{"1 + 2 = ?",{"3","2","4","1"},"1 + 2 = 3"},
{"2 + 3 = ?",{"5","4","6","3"},"2 + 3 = 5"},
{"3 + 1 = ?",{"4","3","5","1"},"3 + 1 = 4"},
{"2 + 2 = ?",{"4","2","3","1"},"2 + 2 = 4"},
{"3 + 2 = ?",{"5","3","4","1"},"3 + 2 = 5"},
{"1 + 1 = ?",{"2","5","4","1"},"1 + 1 = 2"},
{"1 + 3 = ?",{"4","1","5","2"},"1 + 3 = 4"},
{"2 + 1 = ?",{"3","2","1","4"},"2 + 1 = 3"},
{"4 + 1 = ?",{"5","3","4","1"},"4 + 1 = 5"},
{"1 + 4 = ?",{"5","4","2","3"},"1 + 4 = 5"}
}
local j
for i = #tb, 2, -1 do
j = math.random( i )
tb[i], tb[j] = tb[j], tb[i]
end
local j1
for i = #kor, 2, -1 do
j1 = math.random( i )
kor[i], kor[j1] = kor[j1], kor[i]
end
local button1
local button2
local button3
local button4
nVoprosa = 1
local t = 2
local function stop1()
button1:setEnabled( false )
button2:setEnabled( false )
button3:setEnabled( false )
button4:setEnabled( false )
tapText.text = tb[nVoprosa][3]
tapText:setFillColor(6/255, 204/255, 36/255, 1)
end
local function stop2()
button1:setEnabled( false )
button2:setEnabled( false )
button3:setEnabled( false )
button4:setEnabled( false )
tapText.text = tb[nVoprosa][3]
tapText:setFillColor(219/255, 26/255, 15/255, 1)
tapText.size = 50
end
local function vb()
t = t - 1
if t == 0 then
scetcikBal = scetcikBal + 1
bal.text = scetcikBal
scetcikLevel = scetcikLevel + 1
if ( scetcikLevel == 10) then
settings.yesJ = scetcikBal
settings.noJ = scetcikBalpl
settings.procent = (scetcikBal * 10)
saveSettings()
composer.gotoScene( "Level1Score")
else
button1:setEnabled( true )
button2:setEnabled( true )
button3:setEnabled( true )
button4:setEnabled( true )
tapText:setFillColor(255/255, 255/255, 255/255, 1 )
nVoprosa = nVoprosa + 1
tapText.text = tb[nVoprosa][1]
button1:setLabel( tb[nVoprosa][2][1] )
button2:setLabel( tb[nVoprosa][2][2] )
button3:setLabel( tb[nVoprosa][2][3] )
button4:setLabel( tb[nVoprosa][2][4] )
local j1
for i = #kor, 2, -1 do
j1 = math.random( i )
kor[i], kor[j1] = kor[j1], kor[i]
end
button1.x = kor[1][1]
button1.y = kor[1][2]
button2.x = kor[2][1]
button2.y = kor[2][2]
button3.x = kor[3][1]
button3.y = kor[3][2]
button4.x = kor[4][1]
button4.y = kor[4][2]
end
t = 2
end
end
local function vbn()
t = t - 1
if t == 0 then
scetcikBalpl = scetcikBalpl + 1
balpl.text = scetcikBalpl
scetcikLevel = scetcikLevel + 1
if ( scetcikLevel == 10) then
settings.yesJ = scetcikBal
settings.noJ = scetcikBalpl
settings.procent = (scetcikBal * 10)
saveSettings()
composer.gotoScene( "Level1Score")
else
button1:setEnabled( true )
button2:setEnabled( true )
button3:setEnabled( true )
button4:setEnabled( true )
tapText:setFillColor(255/255, 255/255, 255/255, 1)
tapText.size = 40
nVoprosa = nVoprosa + 1
tapText.text = tb[nVoprosa][1]
button1:setLabel( tb[nVoprosa][2][1] )
button2:setLabel( tb[nVoprosa][2][2] )
button3:setLabel( tb[nVoprosa][2][3] )
button4:setLabel( tb[nVoprosa][2][4] )
local j1
for i = #kor, 2, -1 do
j1 = math.random( i )
kor[i], kor[j1] = kor[j1], kor[i]
end
button1.x = kor[1][1]
button1.y = kor[1][2]
button2.x = kor[2][1]
button2.y = kor[2][2]
button3.x = kor[3][1]
button3.y = kor[3][2]
button4.x = kor[4][1]
button4.y = kor[4][2]
end
t = 2
end
end
local function handleButtonEvent( event )
if ( "ended" == event.phase ) then
stop1()
timer.performWithDelay( 300, vb, t )
--vb()
end
end
local function handleButtonEventN( event )
if ( "ended" == event.phase ) then
stop2()
timer.performWithDelay( 300, vbn, t )
--vbn()
end
end
---------------------------------------------------------------------------------------
function scene:create( event )
local sceneGroup = self.view
timer.performWithDelay( 1000, obnovVr, secondL )
tapText = display.newText("", display.contentCenterX, display.contentCenterY - 80, "Lato-Regular.ttf", 40 )
tapText.text = tb[1][1]
button1 = widget.newButton(
{
id = "button1",
label = tb[nVoprosa][2][1],
onEvent = handleButtonEvent,
labelColor = { default={ 1, 1, 1 }, over={ 0, 0, 0, 0.5 } },
fontSize = 36,
font = "Lato-Regular.ttf",
emboss = false,
shape = "roundedRect",
width = 120,
height = 60,
cornerRadius = 0,
fillColor = { default={55/255,50/255,47/255,1}, over={31/255,76/255,115/255,1} },
strokeColor = { default={0/255,196/255,253/255,1}, over={0.8,0.8,1,1} },
strokeWidth = 3
}
)
button2 = widget.newButton(
{
id = "button2",
label = tb[nVoprosa][2][2],
onEvent = handleButtonEventN,
labelColor = { default={ 1, 1, 1 }, over={ 0, 0, 0, 0.5 } },
fontSize = 36,
font = "Lato-Regular.ttf",
emboss = false,
shape = "roundedRect",
width = 120,
height = 60,
cornerRadius = 0,
fillColor = { default={55/255,50/255,47/255,1}, over={31/255,76/255,115/255,1} },
strokeColor = { default={0/255,196/255,253/255,1}, over={0.8,0.8,1,1} },
strokeWidth = 3
}
)
button3 = widget.newButton(
{
id = "button3",
label = tb[nVoprosa][2][3],
onEvent = handleButtonEventN,
labelColor = { default={ 1, 1, 1 }, over={ 0, 0, 0, 0.5 } },
fontSize = 36,
font = "Lato-Regular.ttf",
emboss = false,
shape = "roundedRect",
width = 120,
height = 60,
cornerRadius = 0,
fillColor = { default={55/255,50/255,47/255,1}, over={31/255,76/255,115/255,1} },
strokeColor = { default={0/255,196/255,253/255,1}, over={0.8,0.8,1,1} },
strokeWidth = 3
}
)
button4 = widget.newButton(
{
id = "button4",
label = tb[nVoprosa][2][4],
onEvent = handleButtonEventN,
labelColor = { default={ 1, 1, 1 }, over={ 0, 0, 0, 0.5 } },
fontSize = 36,
font = "Lato-Regular.ttf",
emboss = false,
shape = "roundedRect",
width = 120,
height = 60,
cornerRadius = 0,
fillColor = { default={55/255,50/255,47/255,1}, over={31/255,76/255,115/255,1} },
strokeColor = { default={0/255,196/255,253/255,1}, over={0.8,0.8,1,1} },
strokeWidth = 3
}
)
--
button1.x = kor[1][1]
button1.y = kor[1][2]
button2.x = kor[2][1]
button2.y = kor[2][2]
button3.x = kor[3][1]
button3.y = kor[3][2]
button4.x = kor[4][1]
button4.y = kor[4][2]
casi.x = 240
casi.y = 2
yes.x = 40
yes.y = 2
no.x = 140
no.y = 2
bal = display.newText(scetcikBal, 80, 3, "Lato-Regular.ttf", 30 )
balpl = display.newText(scetcikBalpl, 180, 3, "Lato-Regular.ttf", 30 )
vrem = display.newText("20", 290, 3, "Lato-Regular.ttf", 30 )
sceneGroup:insert(bal)
sceneGroup:insert(balpl)
sceneGroup:insert(yes)
sceneGroup:insert(no)
sceneGroup:insert(vrem)
sceneGroup:insert(casi)
sceneGroup:insert(tapText)
sceneGroup:insert(button1)
sceneGroup:insert(button2)
sceneGroup:insert(button3)
sceneGroup:insert(button4)
end
function scene:show( event )
local sceneGroup = self.view
local phase = event.phase
if (phase == "will") then
elseif (phase == "did") then
end
end
function scene:hide( event )
local sceneGroup = self.view
local phase = event.phase
if (phase == "will") then
elseif (phase == "did") then
composer.removeScene( "level1" )
end
end
function scene:destroy( event )
local sceneGroup = self.view
end
-- -----------------------------------------------------------------------------------
-- Scene event function listeners
-- -----------------------------------------------------------------------------------
scene:addEventListener( "create", scene )
scene:addEventListener( "show", scene )
scene:addEventListener( "hide", scene )
scene:addEventListener( "destroy", scene )
-- -----------------------------------------------------------------------------------
return sceneenter code here
C:\Users\User\Documents\Corona Projects\MATH FOR CHILDREN\level1.lua:207: attempt to call method 'setFillColor' (a nil value)
In line 207 of level1.lua you do this setFillColor() which is not allowed as setFillColor is not a function value but a nil value.
setFillColor is a method of the ShapeObject class. Make sure you're doing using it like this: myShapeObject:setFillColor(myColor)
Related
LUA : Scene not being created. What is wrong?
I'm building a game where I have a start screen and clicking the start button it should take me to the FIRST level. Some stuff happens and then I will be taken to the SECOND level. However I'm running into problems and can't seem to find a solution. When I click the start button it seems to get stuck in the create function because i prints out something. I was told you don't have to place anything in the create function and just put everything in the SHOW FUNCTION. Was i mislead? START SCENE local composer = require("composer") local widget = require("widget") local options = {effect = "fade", time = 800} local startBtn; local function start(event) -- load first scene composer.gotoScene( "level1", options); startBtn:removeSelf(); print("Start Game") end startBtn = widget.newButton( { left = 75, top = 100, id = "startBtn", label = "Start", onEvent = start } ) When I click the START button it should take me to the FIRST LEVEL which is here and is where i'm running into problems. local composer = require( "composer" ); local scene = composer.newScene(); local widget = require ("widget"); function scene:create( event ) local sceneGroup = self.view; end function scene:show( event ) local sceneGroup = self.view local phase = event.phase local params = event.params; print(params); if (phase == "will") then print("Will") elseif (phase == "did") then print("Did") local bg = display.newImage ("bg.png", display.contentCenterX, display.contentCenterY); ------- ALEX KIDD --------------------------------- local options = { frames = { { x = 1, y = 2, width = 16, height = 25}, --frame 1 { x = 18, y = 2, width = 16, height = 25}, --frame 2 { x = 35, y = 2, width = 16, height = 25}, --frame 3 { x = 52, y = 2, width = 16, height = 25}, --frame 4 { x = 1, y = 54, width = 16, height = 24}, --ready1 { x = 19, y = 54, width = 16, height = 24}, --ready2 { x = 37, y = 54, width = 29, height = 24}, -- rock { x = 67, y = 54, width = 33, height = 24}, -- scissor { x = 101, y = 54, width = 33, height = 24}, -- paper } }; local sheet = graphics.newImageSheet( "kidd.png", options ); -- Create animation sequence for animation local seqData = { {name = "normal", start=1 , count = 4, time = 800}, {name = "faster", frames={1,2,3,4}, time = 400}, {name = "shake", frames={5,6}, time = 500}, {name = "rock", frames={7}}, {name = "paper", frames={9}}, {name = "scissor", frames={8}}, } local alex = display.newSprite (sheet, seqData); alex.x = display.contentCenterX-100; alex.y = display.contentCenterY+83; alex.anchorX = 1; alex.anchorY = 1; ---------- JANKEN --------------------------------- local jankenOpt = { frames = { {x= 154, y= 13, width= 39, height= 48 }, -- shake1 {x= 195, y= 13, width= 39, height= 48 }, -- shake2 {x= 236, y= 13, width= 32, height= 48 }, -- set {x= 270, y= 13, width= 16, height= 48 }, --r/p/s {x= 287, y= 13, width= 16, height= 48 }, --r/p/s {x= 305, y= 13, width= 15, height= 48 }, --r/p/s {x= 69, y= 13, width= 41, height= 48 }, --flap1 {x= 110, y= 13, width= 40, height= 48 }, --flap2 } }; local jankenSheet = graphics.newImageSheet( "chars.png", jankenOpt ); -- Create animation sequence janken local seqDataJanken = { {name = "flap", frames={7,8}, time = 500}, {name = "shake", frames={1,2}, time = 500}, {name = "set", frames={3}, time = 10, loopCount=1}, } local janken = display.newSprite (jankenSheet, seqDataJanken); janken.x = display.contentCenterX+100; janken.y = display.contentCenterY+83; janken.anchorX = 1; janken.anchorY = 1; -------------- button setup local btnOpt = { frames = { { x = 3, y = 2, width=70, height = 22}, --frame 1 { x = 78, y = 2, width=70, height = 22}, --frame 2 } }; local buttonSheet = graphics.newImageSheet( "button.png", btnOpt ); local function foo (wow) alex:play(); janken:play(); end local function bar (wow) alex:pause(); janken:pause(); --alex:setFrame(2); --keep it at this frame -- NEXT: generate more buttons end -- Function to handle button event local function go( event ) -- event.target is the button widget print (event.phase, event.target.id) transition.to(alex, {time=2000, x=170, onStart = foo, onComplete = bar}) end local btnGo = widget.newButton( { x = 200, y = 20, id = "btnGo", label = "Go!", labelColor = { default={ 0, 0, 0 }, over={ 0, 0, 0 } }, sheet = buttonSheet, defaultFrame = 1, overFrame = 2, onPress = go, } ); -------------- play buttons local function shoot (buttonID) local randomHand = math.random(4,6); -- position Janken and draw his hands janken:setSequence("set"); hand = display.newImage (jankenSheet, randomHand, display.contentCenterX+61, display.contentCenterY+60); if (buttonID == "btnRock") then alex:setSequence("rock"); -- just show rock for now elseif (buttonID == "btnScissor") then alex:setSequence("scissor"); -- just show rock for now else alex:setSequence("paper"); -- just show rock for now end end local function play (event) if (event.phase == "ended") then alex:setSequence ("shake"); alex:play(); janken:setSequence("shake"); janken:play(); local t = timer.performWithDelay (1500, function() shoot(event.target.id) end, 1); print (event.target.id); -- which button was it? end end local btnRock = widget.newButton( { x = 80, y = 20, id = "btnRock", label = "Rock", labelColor = { default={ 0, 0, 0 }, over={ 0, 0, 0 } }, sheet = buttonSheet, defaultFrame = 1, overFrame = 2, onEvent = play, } ); local btnPaper = widget.newButton( { x = 80, y = 50, id = "btnPaper", label = "Paper", labelColor = { default={ 0, 0, 0 }, over={ 0, 0, 0 } }, sheet = buttonSheet, defaultFrame = 1, overFrame = 2, onEvent = play, } ); local btnScissor = widget.newButton( { x = 80, y = 80, id = "btnScissor", label = "Scissor", labelColor = { default={ 0, 0, 0 }, over={ 0, 0, 0 } }, sheet = buttonSheet, defaultFrame = 1, overFrame = 2, onEvent = play, } ); local scoreAlex = display.newText ( {text="Alex: 0", x=230, y=60, fontSize=20}); scoreAlex:setFillColor (0,0,0); scoreAlex.anchorX = 1; end end function scene:hide( event ) local sceneGroup = self.view local phase = event.phase if ( phase == "will" ) then transition.cancel(enemy); elseif ( phase == "did" ) then end end scene:addEventListener( "create", scene ) scene:addEventListener( "enter", scene ) scene:addEventListener( "hide", scene ) return scene
Well, you are adding a listener scene:addEventListener( "enter", scene ) which should be scene:addEventListener( "show", scene ) (Change enter to show) Your listener is not even being fired, because it was not added with the correct name. Composer uses the following events: create, destroy, show, hide.
How to insert rows into TableView in Corona?
I'm trying to render the match results (string.find) in to a Row, with kinda works... but its only displaying the last match. so if I match 'jan' and 'kevin' it will; only list 'kevin' Is there a way to fix this ? code: local MasterData = xml:loadFile( "sample.xml") local XMLdataTEST = {} for i=1,#MasterData.child do XMLdataTEST[i] = MasterData.child[i] end inputNumber = 1 check1 = 'jan' check2 = 'kevin' for i=1,#XMLdataTEST do local data1 = XMLdata[i].child[1].value local data2 = XMLdata[i].child[2].value local data3 = XMLdata[i].child[3].value local data4 = XMLdata[i].child[4].value input1 = string.lower( data1.. "" ) input2 = string.lower(_G['check' .. inputNumber] ) input = input2 if string.find( input1.. "" , input ) then print(inputNumber.. " match with " ..input) inputNumber = inputNumber + 1 local function onRowRender( event ) local row = event.row local number = display.newText( row, "" .. row.index .. " - ", 12, 0, nil, 18 ) number:setReferencePoint( display.CenterLeftReferencePoint ) number.x = 15 number.y = row.height * 0.5 number:setFillColor( 0, 0, 0 ) local name = display.newText(row, input1, 12, 0, nil, 18 ) name:setReferencePoint( display.CenterLeftReferencePoint ) name.x = number.x + number.contentWidth name.y = row.height * 0.5 name:setFillColor( 0, 0, 0 ) local score = display.newText(row,"testy", 12, 0, nil, 18 ) score:setReferencePoint( display.CenterLeftReferencePoint ) score.x = display.contentWidth - score.contentWidth - 20 score.y = row.height * 0.5 score:setFillColor( 0, 0, 0 ) end local tableView = widget.newTableView { left = 0, top = 0, height = display.contentHeight, width = display.contentWidth, onRowRender = onRowRender, onRowTouch = onRowTouch, listener = scrollListener } tableView.x = display.contentWidth + display.contentWidth/2 + 50 transition.to( tableView, { time=500, x=display.contentWidth / 2, transition=easing.inOutExpo } ) for i = 1, 1 do local isCategory = false local rowHeight = 40 local rowColor = { 255, 255, 255 } local lineColor = { 220, 220, 220 } tableView:insertRow { isCategory = isCategory, rowHeight = rowHeight, rowColor = rowColor, lineColor = lineColor, onRender = onRowRender, } end end end
Your tableView being declared within the outer loop meant that the first instance of it would be transitioned over by the second instance. And a quick look over the docs indicates that each event.row allows an optional params table to include any data you may need to render the row. local MasterData = xml:loadFile( "sample.xml") local XMLdataTEST = {} for i=1,#MasterData.child do XMLdataTEST[i] = MasterData.child[i] end -- ** moved from loop ** local function onRowRender( event ) local row = event.row local number = display.newText( row, "" .. row.index .. " - ", 12, 0, nil, 18 ) number:setReferencePoint( display.CenterLeftReferencePoint ) number.x = 15 number.y = row.height * 0.5 number:setFillColor( 0, 0, 0 ) -- ** changed to use params table ** local name = display.newText(row, row.params.input1, 12, 0, nil, 18 ) name:setReferencePoint( display.CenterLeftReferencePoint ) name.x = number.x + number.contentWidth name.y = row.height * 0.5 name:setFillColor( 0, 0, 0 ) local score = display.newText(row,"testy", 12, 0, nil, 18 ) score:setReferencePoint( display.CenterLeftReferencePoint ) score.x = display.contentWidth - score.contentWidth - 20 score.y = row.height * 0.5 score:setFillColor( 0, 0, 0 ) end -- ** moved from loop ** local tableView = widget.newTableView { left = 0, top = 0, height = display.contentHeight, width = display.contentWidth, onRowRender = onRowRender, onRowTouch = onRowTouch, listener = scrollListener } tableView.x = display.contentWidth + display.contentWidth/2 + 50 transition.to( tableView, { time=500, x=display.contentWidth / 2, transition=easing.inOutExpo } ) inputNumber = 1 check1 = 'jan' check2 = 'kevin' for i=1,#XMLdataTEST do local data1 = XMLdata[i].child[1].value local data2 = XMLdata[i].child[2].value local data3 = XMLdata[i].child[3].value local data4 = XMLdata[i].child[4].value input1 = string.lower( data1.. "" ) input2 = string.lower(_G['check' .. inputNumber] ) input = input2 if string.find( input1.. "" , input ) then print(inputNumber.. " match with " ..input) inputNumber = inputNumber + 1 local isCategory = false local rowHeight = 40 local rowColor = { 255, 255, 255 } local lineColor = { 220, 220, 220 } tableView:insertRow { isCategory = isCategory, rowHeight = rowHeight, rowColor = rowColor, lineColor = lineColor, -- ** pass input1 to onRowRender ** params = { input1 = input1 } } end end
Attempt to index global "self"(a nil value)
I ran this code and it gave me an error attempt to index global 'self' (a nil value), in this scene i'm creating the Question1 of the game, inside which includes creating cannon, balloons and other game elements. I checked but i'm not sure whats wrong here. function scene.createScene() local group = self.view ---line 27 where i got the error scoreText = display.newText( "0", 0, 0, globals.font.bold, 32 ) scoreText.x = display.contentCenterX scoreText.y = 32 group:insert( scoreText ) background = display.newImage( "bkg_clouds.png") group:insert(background) background.x = 240 background.y = 195 questionText = display.newText('a', display.contentCenterX, display.contentWidth/4, native.systemFont, 40) group:insert(questionText) infoBar = display.newImage ("infoBar.png") group:insert(infoBar) background.x = 200 background.y = 100 restartBtn = display.newImage ("restartBtn.png") group:insert(restartBtn) background.x = 470 background.y = 300 cannon = display.newImage ("cannon.png") group:insert(cannon) background.x = 10 background.y = 270 cannon.anchorX = 0.5 cannon.anchorY = 0.5 restartBtn.isVisible = true function createBalloons(a, b) for i = 1, a do for j = 1, b do local balloon = display.newImage ('balloon_fat_red.png', 465+ (i * 30), 80 + (j * 50)) balloon.balloonText1 = display.newText(hiragana_array[x+1], 495, 125) balloon.balloonText2 = display.newText(hiragana_array[x+2], 495, 175) balloon.balloonText3 = display.newText(hiragana_array[x+3], 495, 225) balloon.balloonText1:setFillColor( 1,1, 0 ) balloon.balloonText2:setFillColor( 1,1, 0 ) balloon.balloonText3:setFillColor( 1,1, 0 ) balloon.name = 'balloon' physics.addBody(balloon) balloon.bodyType = 'static' table.insert(balloons, balloon) end end target.text = #balloons end function cannonCharge:touch(e) if(e.phase == 'began') then impulse = 0 cannon.isVisible = true Runtime:addEventListener('enterFrame', charge) end end function charge() local degreesPerFrame = 1 cannon.rotation = cannon.rotation - degreesPerFrame impulse=impulse-0.2 if(cannon.rotation < -46) then cannon.rotation = -46 impulse = -3.2 end end function shot:touch(e) if(e.phase == 'ended') then Runtime:removeEventListener('enterFrame', charge) cannon.isVisible = false cannon.rotation = 0 local cannonBall = display.newImage('cannon ball.png', 84, 220) physics.addBody(cannonBall, {density = 1, friction = 0, bounce = 0}) group:insert(cannonBall) -- Shoot cannon ball cannonBall:applyLinearImpulse(dir, impulse, cannonBall.x, cannonBall.y ) --Collision listener cannonBall:addEventListener ('collision', ballCollision) end end function ballCollision(e) if (e.other.name == 'balloon') then scene.updateScore() e.target:removeSelf() print ('remove balloon text') e.other:removeSelf() audio.play(pop) end end cannonBall:applyLinearImpulse(dir, impulse, cannonBall.x, cannonBall.y ) --Collision listener cannonBall:addEventListener ('collision', ballCollision) scene.view:insert( ballCollision ) end
You probably need function scene:createScene(). Note the colon instead of the dot in your original code.
Your function should be like this. function scene:createScene( event ) local group = self.view ----------------------------------------------------------------------------- -- CREATE display objects and add them to 'group' here. -- Example use-case: Restore 'group' from previously saved state. ----------------------------------------------------------------------------- end Here is the reference: http://docs.coronalabs.com/api/library/storyboard/
In onButtonEvent function t.value not updating
I am designing an Odd One Out round for a game that I am developing, every time a button is pressed, the onButtonEvent function is supposed to check if the word selected is the odd one out and then refreshes the buttons with different words. The words are updating and the value assigned to each button is updating, I have been printing it out to the console. I think the problem is when I assign right[num] = t.value the only values that go into the table are the first 3 values that were originally assigned to the buttons. Why is this not being updated? local function onButtonEvent( event ) local t = event.target --local phase = event.phase if event.phase == "release" then --num = num + 1 displayBtns() right[num] = t.value print(right[1]) print(right[2]) print(right[3]) print(right[4]) -- --s3 = table.concat(right) --print(s3) if right[num] == answers[num].right then print("correct!") elseif right[num] == answers[num].wrong then -- t.alpha = 0 -- select.alpha = 1 print("incorrect!") elseif right[num] == answers[num].wrong2 then else print("incorrect!") end num = num + 1 num2 = num2 + 1 s3 = "" -- display.remove( btn3 ) -- btn3 = nil -- display.remove( btn2 ) -- btn2 = nil -- display.remove( btn1 ) -- btn1 = nil end --num = math.random(1,#t) s3 = "" end function displayBtns() btn3 = widget.newButton{ default = "images/Round4_blue_button.png", label = answers[num].right, fontSize = 22, labelColor = { default={ 255, 250, 250}, over={ 0, 0, 0,} }, onEvent = onButtonEvent } btn3.value = answers[num].right print(btn3.value) btn2 = widget.newButton{ default = "images/Round4_blue_button.png", label = answers[num].wrong2, fontSize = 22, labelColor = { default={ 255, 250, 250}, over={ 0, 0, 0,} }, onEvent = onButtonEvent } btn2.value = answers[num].wrong2 print(btn2.value) btn1 = widget.newButton{ default = "images/Round4_blue_button.png", label = answers[num].wrong, fontSize = 22, labelColor = { default={ 255, 250, 250}, over={ 0, 0, 0,} }, onEvent = onButtonEvent } btn1.value = answers[num].wrong print(btn1.value) print("----------") --btn3.label = answers[num].right -- p1Button = display.newImage("images/SinglePlayer_button.png", 90, 140) -- p2Button = display.newImage("images/2Player_button.png", 90, 220) -- p1Button.touch = onSceneTouch -- p1Button:addEventListener("touch", p1Button) -- p2Button.touch = onSceneTouch1 -- p2Button:addEventListener("touch", p2Button) btn1.x = 90; btn1.y = 245 btn2.x = 240; btn2.y = 245 btn3.x = 390; btn3.y = 245 -- p2Button.x = 240; p2Button.y = 260 end displayBtns()
The problem is probably here: elseif right[num] == answers[num].wrong2 then else print("incorrect!") end You have nothing set in the elseif statement.
how to get array value in lua in not using id
i have this array in my lua... local data = {} data[1] = {} data[1].title = "Crazy Song" data[1].subtitle = "by Bruno Earth" data[1].image = "note.png" data[2] = {} data[2].title = "Enter Sunman" data[2].subtitle = "by Mentalica" data[2].image = "note.png" data[3] = {} data[3].title = "Bitter Child of Mine" data[3].subtitle = "by Gunz n bullets" data[3].image = "note.png" data[4] = {} data[4].title = "Missed A thing" data[4].subtitle = "by Ero-Smith" data[4].image = "note.png" data[5] = {} data[5].title = "Pornstar" data[5].subtitle = "by Nicklefront" data[5].image = "note.png" data[6] = {} data[6].title = "Burner" data[6].subtitle = "by Asher" data[6].image = "note.png" how can i get the array values by not using id on it. i just want to get the title for my conditional statement? i try this in my code: local getTitle = function(event) print (".................") print (event.target.id) print (event.target.title) end but i got only this... touch: began touch: ended ................. 2 nil how can i get and print the title of my array? this is my code: module(..., package.seeall) display.setStatusBar( display.HiddenStatusBar ) function new() local localGroup = display.newGroup() local tableView = require("tableView") local ui = require("ui") -------------------------------------------------------------------------- local screenOffsetW, screenOffsetH = display.contentWidth - display.viewableContentWidth, display.contentHeight - display.viewableContentHeight local songList local backBtn local detailScreenText local background = display.newRect(0, 0, display.contentWidth, display.contentHeight) background:setFillColor(0, 0, 0) localGroup:insert(background) local data = {} --iPad: setup a color fill for selected items local selected = display.newRect(0, 0, 50, 50) --add acolor fill to show the selected item selected:setFillColor(67,141,241,180) --set the color fill to light blue selected.isVisible = false --hide color fill until neede ----------------------------------------------- data[1] = {} data[1].title = "Crazy Song" data[1].subtitle = "by Bruno Earth" data[1].image = "note.png" data[2] = {} data[2].title = "Enter Sunman" data[2].subtitle = "by Mentalica" data[2].image = "note.png" data[3] = {} data[3].title = "Bitter Child of Mine" data[3].subtitle = "by Gunz n bullets" data[3].image = "note.png" data[4] = {} data[4].title = "Missed A thing" data[4].subtitle = "by Ero-Smith" data[4].image = "note.png" data[5] = {} data[5].title = "Pornstar" data[5].subtitle = "by Nicklefront" data[5].image = "note.png" data[6] = {} data[6].title = "Burner" data[6].subtitle = "by Asher" data[6].image = "note.png" local topBoundary = display.screenOriginY + 40 local bottomBoundary = display.screenOriginY + 0 local getTitle = function(event) print (".................") print (event.target.id) print (event.target.title) end songList = tableView.newList{ data=data, default="listItemBg.png", over="listItemBg_over.png", onRelease=getTitle, top=topBoundary, bottom=bottomBoundary, callback = function( row ) local g = display.newGroup() local img = display.newImage(row.image) g:insert(img) img.x = math.floor(img.width*0.5 + 6) img.y = math.floor(img.height*0.5) local title = display.newText( row.title, 0, 0, native.systemFontBold, 16 ) title:setTextColor(0,0,0) g:insert(title) title.x = title.width*0.5 + img.width + 6 title.y = 30 local subtitle = display.newText( row.subtitle, 0, 0, native.systemFont, 14 ) subtitle:setTextColor(80,80,90) g:insert(subtitle) subtitle.x = subtitle.width*0.5 + img.width + 6 subtitle.y = title.y + title.height + 6 return g end } localGroup:insert(songList) local function scrollToTop() songList:scrollTo(topBoundary-1) end local navBar = display.newImage("navBar.png") navBar.x = display.contentWidth*.5 navBar.y = math.floor(display.screenOriginY + navBar.height*0.5) localGroup:insert(navBar) local navHeader = display.newText("Song Lists", 0, 0, native.systemFontBold, 16) navHeader:setTextColor(255, 255, 255) navHeader.x = display.contentWidth*.5 navHeader.y = navBar.y localGroup:insert(navHeader) --backBtn.alpha = 0 local listBackground = display.newRect( 0, 0, songList.width, songList.height ) listBackground:setFillColor(255,255,255) songList:insert(1,listBackground) --Setup the back button function changeScene(e) if e.phase == 'ended' then print ("ok") director:changeScene(e.target.scene, "fade") print ("back!") end end backBtn = display.newImage("backButton.png") backBtn.x = math.floor(backBtn.width/2) + backBtn.width + screenOffsetW backBtn.y = navBar.y backBtn.scene = "menu" backBtn:addEventListener("touch", changeScene) return localGroup end
i got it... i do this local getTitle = function(event) print (".................") local id = event.target.id print (id) print (data[id].title) end