Thank you for your interest.
I’m writing an app for a class os student, i’m a volunteer teacher.
The app is like a virtual store, there are a lot of files, image, text, audio and my be video.
Each student must load his proper contents this is the reason for which I can insert the files il the root of app or in one the system folder.
I put all files in some subfolder of corona Documents system folder and all is working correctly in simulator.
In the device i put files in Docent folder but I don’t know ho to tell the app what is that folder is,
I send you my code and an explanatory text.
Hope u can help me to solve the problem
Stefano
MY APP
– 01*************************************************************************************
– INIT
– Questa parte viene eseguita una sola volta all’avvio del programma e serve per definire
– i parametri di visualizzazione e grandezze varie
– Nasconde la barra di stato. Se si vuole vedere cosa contiene sostituire l’istruzione
– con display.setStatusBar( display.ShowStatusBar)
local lfs = require’lfs’ – lfs is Lua File System
– BASE PARAMETERS
– Quelli a destra vengono forniti dal S/W di gestione e potrebbero essere usati
– direttamente. Vengono copiati in altre variabili er avere nomi più brevi e
– comprensibili. Il segno = non ha lo stesso significato che ha in matematica e si
– chiama “assegnazione”. le variabili possono contenere non solo numeri ma anche testi,
– immagini, suoni, oggetti, ecc. e anche altre variabili. Le grandezze a destra e a
– sinistra del segno uguale vanno considerate come come due “cassetti” dove con
– l’operazione di assegnazione tutto il contenuto duplichiamo del cassetto di destra
– viene duplicato in quello di sinistra
– Screen Parameters
local screenCenterX = display.contentCenterX – screen coordinate X of center
local screenCenterY = display.contentCenterY – screen coordinate Y of center
local screenWidth = display.contentWidth – screen dimension: width
local screenHeight = display.contentHeight – screen dimension: height
– Platform type parameter; “iPhoneOS” or “Android” or “Mac OS X”
local isAndroid = “Android” == system.getInfo( “platformName”)
local isSimulator = “simulator” == system.getInfo( “environment”)
– General values
local backGroundAlpha = 1 – background alpha
local foreGroundAlpha = 0.85 – foreground alpha
local emptySpaceColor = { 0, 1 ,0} – RGB values ranging from 0 (dark) to 1
– other parameters
local objectScreen
local dtlAudio
local titleOfPage
local firstPage
– groups & tables & stack pointer pieces/object -> obj
local piecesCoordTable = {} – pieces X-Y position
local bkgGroup = display.newGroup () – all groups to hide/show
local objGroup1 = display.newGroup () – elements
local objGroup2 = display.newGroup ()
local objGroup3 = display.newGroup ()
local objGroup4 = display.newGroup ()
local objGroup5 = display.newGroup ()
local objGroup6 = display.newGroup ()
local objGroup7 = display.newGroup ()
local dtlImgGroup = display.newGroup ()
local pagesStack = {} – table to index groups
pagesStack [1] = objGroup1 – table values
pagesStack [2] = objGroup2
pagesStack [3] = objGroup3
pagesStack [4] = objGroup4
pagesStack [5] = objGroup5
pagesStack [6] = objGroup6
pagesStack [7] = objGroup7
local stackPointer = 1 – pageStack table pointer
– pieces parameters pieces -> pcs
local maxPieces = 20 – numero massimo di tessere
local shiftY = 0.5 – per visualizzazione tessere
local piecesInaRow = 4 – tessere in orizzontale
local objWidth = screenWidth / piecesInaRow - 5 – piece dimensions
local objHeight = objWidth – square
– flags
local fileExist = false – for a piece exist:
local dtlImgExist = false – an image as detail
local dtlTextExist = false – a text as detail
local dtlAudioExist = false – an audio streaming as detail
local dtlVideoExist = false – a video as detail
local touchEnabled = true – screen touch enable/disable
– button parameters
local button1Width = objWidth
local button1Height = button1Width / 4
local button1Xpos = screenWidth - objWidth / 1.4
local button1Ypos = screenHeight - ( objHeight * shiftY / 2 )
local button1FontSize = button1Height * 0.9
local button1Label1 = “CHIUDI”
local button1Label2 = “HOME”
– title & bottom start value
local titleTextAlpha = 0
local titleShift = objHeight / 4 – shift posizione titolo
local bottomTextAlpha = 1
local bottomTextX = objWidth * 1.5
local bottomTextY = button1Ypos
local bottomTextFontSize = button1FontSize * 1.1
– Objects Dtl. Abbreviazioni: Detail ->, objects/pieces -> objs
local programFolder = “ArtWorkCompose”
local currentFolder
local titleFileName = “atitle.txt”
local objName = “obj”
local objExt1 = “.png”
local objExt2 = “.jpg”
local objDtlTextExt = “.txt”
local objDtlImgExt = “dtl”
local objDtlAudioExt = “.m4a”
local objDtlVideoExt = “.mp4”
local mainFolder = “mainlevel”
local myFolder = “”
local bckgFileName = “background.jpg”
local tapText = “toccare un oggetto”
– ***************************************************************************************
– Viene creato un rettangolo delle dimensioni dell’intero schermo che sarà l’area che
– risponde ai tap.
– Il parametro alpha (opacità) viene settato ad un valore molto basso per nn interferire
– con le ie successive immagini
local screen = display.newRect( screenCenterX, screenCenterY, screenWidth, screenHeight )
screen:setFillColor( 1, 0, 0 )
screen.alpha = 0.1
– ***************************************************************************************
– Legge nella cartella “Documents” il nome del main folder
local lfs = require’lfs’ – lfs is Lua File System
local function findMainFolder ()
currentFolder = “”
doc_path = system.pathForFile( myFolder, system.DocumentsDirectory )
for file in lfs.dir( doc_path ) do
if string.find( file, “%.” )then
– name starts with a dot, discard file/directory
else
– file is the current directory name
– mainFolder = file
currentFolder = file
break – se ci sono più cartelle viene presa la prima
end
end
currentFolder = mainFolder
– Il folder non è stato trovato
if currentFolder == “” then
local options = – define options to display text
{
text = “MAIN FOLDER DOESN’T EXIST”,
x = screenCenterX,
y = screenCenterY,
font = native.systemFontBold,
fontSize = 65,
align = “center”
}
text = display.newText( options )
text:setTextColor(1, 0, 0)
if isAndroid then
native.requestExit()
else
– call for IOS devices
end
end
end
findMainFolder ()
mainFolder = currentFolder
– ***************************************************************************************
– Visualizza una immagine jpg o png, i parametri sono autoesplicativi
– Viene chiamata ogni volta che deve essere visualizzata un’immagine
piecesLoadAndShow = function ( group, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight, imFrom)
–print( “piecesLoadAndShow”, group, fileName)
– carica e visualizza filename
local objectScreen = display.newImage( group, fileName, system.DocumentsDirectory )
if objectScreen then
fileExist = true
if objectScreen.width >= objectScreen.height then – objectScreen must be global
scaleFactor = imgWidth/objectScreen.width
else
scaleFactor = imgHeight/objectScreen.height
end
objectScreen:scale ( scaleFactor, scaleFactor)
– position from piecesCoordTable
objectScreen.x = screenObjPosX
objectScreen.y = screenObjPosY
objectScreen.alpha = 1
end
–return fileExist
end
– ***************************************************************************************
– Visualizza l’immagine di background
local function backGroundShow ( bckgFileName )
local bkgScreen = display.newImage( bkgGroup, myFolder … “/” … bckgFileName, system.DocumentsDirectory, screenCenterX, screenCenterY )
bkgScreen.width = screenWidth
bkgScreen.height = screenHeight
end
backGroundShow ( bckgFileName )
– ***************************************************************************************
– Scrittura testo in basso
local function writeBottomText (tapText)
display.remove( text )
–alpha = bottomTextAlpha
local options = – define options to display text
{
text = tapText,
x = bottomTextX,
y = bottomTextY,
font = native.systemFont,
fontSize = bottomTextFontSize
}
bottomText = display.newText( options ) – display text
bottomText:setTextColor( 0, 0, 1, 1)
end
writeBottomText ( tapText )
– ***************************************************************************************
– Si disegna il tasto in bassa a destra attingendo ad una libreria, widget, di oggetti
– predefiniti. La label del tasto viene usata per gestire le azioni:
– No label: tasto inattivo
– “CHIUDI”: cancella l’immagine o il testo che descrive un particolare oggetto
– “HOME”: riporta il sistema alle condizioni iniziali
local widget = require( “widget” )
– Function to handle button events
local function handleButtonEvent ( event )
if ( “ended” == event.phase ) then
audio.stop () – stop any audio
dtlAudioExist = false – resetta flag riproduzione audio
–video.stop () – stop any video
dtlVideoExist = false – resetta flag riproduzione video
if button1:getLabel () == button1Label1 then – se label button1 é CHIUDI
pagesStack [stackPointer].isVisible = true – immagini della griglia visibili
titleText.alpha = titleTextAlpha – visualizzazione titolo pagina
bottomText.alpha = 1 – visualizzazione testo in basso
touchEnabled = true – abilitazione touch
if stackPointer == 1 then – se in mainlevel
button1:setLabel ( “” ) – cancellazione label button1
else – altrimenti
button1:setLabel ( “HOME” ) – scrivi label button1
end
if dtlImgExist == true then – se è visuallizata immagine di
dtlImgExist = false – dettaglio immagine viene
– for i = 2,6 do
– pagesStack [stackPointer].isVisible = false
– end
dtlImgGroup:removeSelf () – cancellata
dtlImgGroup = nil
dtlImgGroup = display.newGroup ()
else
dtlTextExist = false – se è visualizzato testo di
dtlTextFrame:removeSelf () – dettaglio viene cancellato
dtlTextFrame = nil – frame e resto
dtlText:removeSelf ()
dtlText = nil
end
elseif
button1:getLabel () == button1Label2 then
pagesStack [stackPointer].isVisible = false
stackPointer = 1
pagesStack [stackPointer].isVisible = true
currentFolder = mainFolder
pageTitle ( currentFolder )
button1:setLabel ( “” )
– objGroup1:removeSelf ()
– objGroup2:removeSelf ()
– objGroup3:removeSelf ()
– objGroup4:removeSelf ()
– objGroup5:removeSelf ()
– objGroup6:removeSelf ()
– objGroup7:removeSelf ()
– objGroup1 = nil
– objGroup2 = nil
– objGroup3 = nil
– objGroup4 = nil
– objGroup5 = nil
– objGroup6 = nil
– objGroup7 = nil
– objGroup1 = display.newGroup ()
– objGroup2 = display.newGroup ()
– objGroup3 = display.newGroup ()
– objGroup4 = display.newGroup ()
– objGroup5 = display.newGroup ()
– objGroup6 = display.newGroup ()
– objGroup7 = display.newGroup ()
else
end
end
end
– Create the widget
local button1Options =
{
label = " ",
labelAlign = center,
fontSize = button1FontSize,
labelColor = { default={ 1, 0, 0 }, over={ 0, 0, 0, 0.5 } },
onEvent = handleButtonEvent,
emboss = false,
shape=“roundedRect”,
width = button1Width,
height = button1Height,
cornerRadius = 2,
fillColor = { default={ 1, 1, 1, 1 }, over={ 1, 0.1, 0.7, 0.4 } },
strokeColor = { default={ 0, 0, 1, 1 }, over={ 0.8, 0.8, 1, 1 } },
strokeWidth = 5
}
button1 = widget.newButton ( button1Options ) – must be Global
– Center the button
button1.x = button1Xpos
button1.y = button1Ypos
– ***************************************************************************************
– Si preparano i dati per visualizzare le tessere. Le coordinate x e y dove
– posizionare le tessere sono memorizzate nella tavola “piecesCoordTable”.
function populatePiecesCoordTable ()
local tableRow = 1
local countX = 1
local shiftX = 0.5
local posX = -piecesInaRow/2 + shiftX
local countY = 1
local posY = -piecesInaRow/2 + shiftY
while tableRow <= maxPieces do
local piecePosX = screenCenterX + ( posX + ( countX - 1)) * objWidth
local piecePosY = screenCenterY + ( posY + ( countY - 1)) * objHeight
piecesCoordTable[tableRow] = { x=piecePosX, y=piecePosY, n=tableRow }
–print( "TABLEPREPARE - tR= " … tableRow … ", cX= " … countX … ", pPX= " … piecesCoordTable[tableRow].x … ", cY= " … countY … ", pPY= " … piecesCoordTable[tableRow].y)
tableRow=tableRow+1
countX = countX + 1
if countX > piecesInaRow then
countX = 1
countY = countY + 1
end
end
end
populatePiecesCoordTable ()
– ***************************************************************************************
– Scrive il titolo della pagina visualizzata
– This function must be global
function pageTitle ( currentFolder )
– Legge il titolo della pagina visualizzata
– path to the file that to be read from.
local path = doc_path … “/” … currentFolder … “/” … titleFileName
local file = io.open( path, “r” ) – open in read mode
if file then
local savedData = file:read( “*a” ) – read file
io.close( file )
– extract TitleOfPage
local stringLenght = string.find( savedData, “,” )
local titleOfPage = string.sub( savedData, 1, stringLenght - 1 )
local savedData = string.sub( savedData, stringLenght + 1 )
– extract fontName
local stringLenght = string.find( savedData, “,” )
local fontName = string.sub( savedData, 1, stringLenght - 1 )
local savedData = string.sub( savedData, stringLenght + 1 )
– extract fontSize
local stringLenght = string.find( savedData, “,” )
local fontSize = string.sub( savedData, 1, stringLenght - 1 )
local savedData = string.sub( savedData, stringLenght + 1 )
– extract red value
local stringLenght = string.find( savedData, “,” )
local red = string.sub( savedData, 1, stringLenght - 1 )
local savedData = string.sub( savedData, stringLenght + 1 )
– extract green value
local stringLenght = string.find( savedData, “,” )
local green = string.sub( savedData, 1, stringLenght - 1 )
local savedData = string.sub( savedData, stringLenght + 1 )
– extract blue value
local stringLenght = string.find( savedData, “,” )
local blue = string.sub( savedData, 1, stringLenght - 1 )
local savedData = string.sub( savedData, stringLenght + 1 )
– extract alpha value
local stringLenght = string.find( savedData, “,” )
local alpha = string.sub( savedData, 1, stringLenght - 1 )
titleTextAlpha = alpha – save to restore, must be global
local savedData = string.sub( savedData, stringLenght + 1 )
pageTitleWrite ( titleOfPage, fontName, fontSize, fontColor, red, green, blue, alpha )
end
end
function pageTitleWrite ( titleOfPage, fontName, fontSize, fontColor, red, green, blue, alpha )
display.remove( titleText )
local options = { – define options to display text
text = titleOfPage,
x = screenCenterX,
– Per la posizione del testo si parte dalla coordinata del centro della prima
– tessera meno la metà dell’altezza di una tessera - uno shift fisso
y = piecesCoordTable[1].y - objHeight / 2 - fontSize / 2,
font = fontName,
fontSize = fontSize,
--width = _W,
--height = 0,
align = “center”
}
titleText = display.newText( options )
titleText:setTextColor( red, green, blue, alpha )
end
pageTitle( currentFolder )
– ***************************************************************************************
– Carica e visualizza le immagini della prima pagina
function firstPage( objGroup, folder )
for n = 1, maxPieces do
local screenObjPosX = piecesCoordTable[n].x
local screenObjPosY = piecesCoordTable[n].y
local imgWidth = objWidth
local imgHeight = objHeight
local fileName = myFolder … “/” … folder … “/” … objName … n … objExt1
piecesLoadAndShow ( objGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )
local fileName = myFolder … “/” … folder … “/” … objName … n … objExt2
piecesLoadAndShow ( objGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )
– Disegna una griglia
local objectGrid = display.newRect ( objGroup, screenObjPosX , screenObjPosY, objWidth, objWidth )
objectGrid.strokeWidth = 4
objectGrid:setFillColor( 1, 1, 1, 0.0 )
objectGrid:setStrokeColor( 1, 0, 0 )
end
end
firstPage ( pagesStack [1], currentFolder )
– ***************************************************************************************
– Scrive il testo contenuto nel file di descrizione
local function dtlTextWrite ( savedData)
dtlTextFrame = display.newRoundedRect( screenCenterX, screenCenterY + 50, screenWidth - 60, screenHeight - 400, 30)
dtlTextFrame.strokeWidth = 8
dtlTextFrame:setStrokeColor( 1, 0, 0 )
dtlTextFrame:setFillColor( 1, 1, 1 )
local options =
{ – define options to display Dtl text
text = savedData,
x = screenCenterX,
y = screenCenterY +220,
font = native.systemFontBold,
fontSize = 50,
align = “left”,
width = screenWidth -100,
height = screenHeight - 100
}
dtlText = display.newText( options )
dtlText:setTextColor( 0,0,0)
end
– ***************************************************************************************
– Visualizza i dettagli dell’oggetto in formato testo se esiste la relativa pagina
– In ingresso il tasto toccato
– La pagina può contenere il nome di una altra cartella
local function getPieceDtlText( tappedObj)
local path = doc_path … “/” … currentFolder … “/” … objName … tappedObj… objDtlTextExt
local file = io.open( path, “r” ) – open in read mode
if file then
local savedData = file:read( “*a” ) – read file
io.close( file )
– local isFolder
if string.find( savedData, “/” ) then
savedData = string.sub( savedData, 2 )
stringLenght = string.find( savedData, “/” )
if stringLenght then – la stringa è corretta
savedData = string.sub( savedData, 1 , stringLenght - 1 )
– cancella il titolo della pagina
titleText:removeSelf ()
titleText = nil
– si tratta di una pagina di oggetti, legge il nuovo titolo e lo visualizza; il nome del nuovo folder era stato trovato in precedenza e si trova nella variabile savedData
local path = doc_path … “/” … savedData … “/” … titleFileName
local file = io.open( path, “r” ) – open in read mode
if file then
local savedData = file:read( “*a” ) – read file
io.close( file )
end
currentFolder = savedData
pageTitle ( currentFolder)
– 1 nasconde la griglia di oggetti
– 2 incrementa il puntatore di stackPointer
– 3 visualizza la nuova griglia di oggetti
– 4 cancella la label di button1
pagesStack[stackPointer].isVisible = false
–print(“fffffffff”,#pagesStack)
if stackPointer < 5 then
stackPointer = stackPointer + 1
else
stackPoiner = 1
end
firstPage ( pagesStack [stackPointer], currentFolder )
pagesStack[stackPointer].isVisible = true
button1:setLabel ( “HOME” )
end
else
– si tratta di una pagine di descrizione in forma testo, il parametro dtlTextExist (dettaglio del pezzo in forma di testo) deve essere falso e viene posto a vero
print(“ddddddddd”,dtlTextExist)
if dtlTextExist == false then
dtlTextExist = true
print(“ddddddddd”,dtlTextExist)
– 1 memorizza i paramentri del titolo per rispristinarlo
– 2 nasconde il titolo ponendo a zero il parametro alpha
– 3 nasconde il testo il testo in basso
– 4 nasconde la griglia di tessere
– 5 disabilita lo schermo al touch
– 6 scrive il dettaglio in forma di testo
– 7 scrive la label su button1
titleTextAlpha = titleText.alpha
titleText.alpha = 0
bottomText.alpha = 0
pagesStack[stackPointer].isVisible = false
touchEnabled = false
dtlTextWrite ( savedData )
button1:setLabel ( “CHIUDI” )
end
end
else
– si tratta di un oggetto senza descrizione, visualizza una scritta per 1 secondi, il parametro dtlTextExist deve essere falso e viene lasciato falso
print(“ddddddddd”,dtlTextExist, dtlAudioExist)
if dtlTextExist == false and dtlAudioExist == false then
local options = – define options to display text
{
text = “DESCRIZIONE”,
x = screenCenterX,
y = screenCenterY,
font = native.systemFontBold,
fontSize = objWidth / 3,
align = “center”
}
text = display.newText( options )
text:setTextColor(1, 0, 0)
– viene usata la funzione transition.fadeOut per visualizzare il testo per 1 solo secondo, insieme al testo vengono visualizzate du e linee incrociate
transition.fadeOut( text, {time = 1000})
line1 = display.newLine ( screenCenterX - objWidth, screenCenterY - objHeight / 3, screenCenterX + objWidth, screenCenterY + objHeight / 3 )
line1:setStrokeColor( 1, 0, 0, 1 )
line1.strokeWidth = 10
transition.fadeOut( line1, {time = 1000})
line2 = display.newLine ( screenCenterX - objWidth, screenCenterY + objHeight / 3, screenCenterX + objWidth, screenCenterY - objHeight / 3 )
line2:setStrokeColor( 1, 0, 0, 1 )
line2.strokeWidth = 10
transition.fadeOut( line2, {time = 1000})
end
end
end
– ***************************************************************************************
– Vede se esiste una descrizione dell’oggetto in forma di immagine e se esiste la carica – e la visualizza.nel caso esista lo carica e lo manda in esecuzione.
– Vede anche se esiste un file video o audio audio
local function getPieceDtlImg( tappedObj)
– video
local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj…objDtlVideoExt
if dtlVideoExist == false then
– print (“VIDEO VIDEO”, dtlVideoExist, fileName, dtlVideoExist)
dtlVideo = media.playVideo( “movie.m4v”, true, onComplete )
if dtlVideo then
dtlVideoExist = true
end
end
– print (“VIDEO VIDEO”, dtlVideoExist, fileName, dtlVideoExist)
– audio
local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj…objDtlAudioExt
if dtlAudioExist == false then
dtlAudio = audio.loadStream(fileName, system.DocumentsDirectory )
if dtlAudio then
audio.play( dtlAudio, { channel=1, loops=0, fadein=100 } )
dtlAudioExist = true
end
end
– immagine
local screenObjPosX = screenCenterX
local screenObjPosY = screenCenterY * 1.05
local imgWidth = screenWidth
local imgHeight = screenHeight * 0.77
local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj… objDtlImgExt … objExt1
fileExist = false
piecesLoadAndShow ( dtlImgGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )
local fileName = myFolder … “/” … currentFolder … “/” … objName … tappedObj… objDtlImgExt … objExt2
if fileExist == false then
piecesLoadAndShow ( dtlImgGroup, fileName, screenObjPosX, screenObjPosY, imgWidth, imgHeight )
end
if fileExist == true then
if dtlImgExist == false then
dtlImgExist = true
– cancella titolo e testo in basso e scrive la label di button1
titleText.alpha = 0
bottomText.alpha = 0
button1:setLabel ( “CHIUDI” )
touchEnabled = false
– nasconde le tessere
pagesStack[stackPointer].isVisible = false
end
else
dtlImgExist = false
– controlla se esiste una descrizione testuale
getPieceDtlText( tappedObj)
end
end
– ***************************************************************************************
– Toccando lo schermo viene eseguita questa funzione
local function onScreenTouch( event )
if event.phase == “began” then
if dtlAudioExist == true then
audio.stop( ) – stop audio
dtlAudioExist = false
end
if touchEnabled == true then
– viene individuato la tessera toccata in base alle sue coordinate
– tappedObj contiene il numero della tessera
for n=1,#piecesCoordTable do
if event.x > ( piecesCoordTable[n].x - objWidth /2 ) and event.x < ( piecesCoordTable[n].x + objWidth /2 ) then
if event.y > ( piecesCoordTable[n].y - objWidth /2 ) and event.y < ( piecesCoordTable[n].y + objWidth /2 ) then
getPieceDtlImg (piecesCoordTable[n].n)
end
end
end
end
end
return tappedPiece
end
– ***************************************************************************************
– funzione di sistema che gestisce il tocco dello schermo e chiama la funzione
– onScreenToutch
– Register to call methods an infinite number of times
screen:addEventListener( “touch”, onScreenTouch )
–timer1 = timer.performWithDelay( 100, t, 0 )–]]