Sprite sheet memory clean up

Hi,

I’ve used a sprite sheet in one of my app as follows:

require(“sprite”)

sheet=sprite.newSpriteSheetFromData(“sheet.png”,require(“sheet”).getSpriteSheetData())
spriteSet = sprite.newSpriteSet(sheet,1,22)
sprite.add(spriteSet,“sheet”,1,22,1000,1)
spriteInstance = sprite.newSprite(spriteSet)
spriteInstance:setReferencePoint(display.BottomRightReferencePoint)
spriteInstance:prepare(“sheet”)
spriteInstance:play()

Now after playing it once and moving onto next screen, I want to clean up sprite sheet memory. For this, when I write

sheet.dispose()

I get the error, "attempt to call method ‘dispose’ < a nil value > "

while on writing

myScreenName:remove(sheet)
sheet=nil

screen does go to next screen but in simulator I keep getting the error "attempt to call method ‘play’ < a nil value > "

which I think is because the sprite sheet is not removed and is still playing.

I’d spent almost a day on this but still not able to figure out the problem. Any help will be appreciated.
[import]uid: 71670 topic_id: 15013 reply_id: 315013[/import]

I believe it is Sheet:dispose() (colon)

Dont forget to :pause your sprite instance first. [import]uid: 21331 topic_id: 15013 reply_id: 55481[/import]

It sounds like you are still trying to play a sprite after removing it. Do you reference it anywhere AFTER it has been removed? [import]uid: 52491 topic_id: 15013 reply_id: 55482[/import]

Thanks for the reply.

sorry it is sheet:dispose()

and before disposing it I am doing some other action, for that I am pausing it also. [import]uid: 71670 topic_id: 15013 reply_id: 55499[/import]

Hi Ansca,

I am playing the sprite only at one place mentioned in my code. After which I am pausing it and doing some other action and finally trying to dispose it. [import]uid: 71670 topic_id: 15013 reply_id: 55500[/import]

Is there somewhere you could upload your project for us (or community members) to take a look at? It’s hard to pinpoint without being able to run your code :wink: [import]uid: 52491 topic_id: 15013 reply_id: 55691[/import]

Hi Ansca,

Just as a sample project I am uploading my app which can be downloaded from the following link:

http://retailconcepts.info/redms/exe/Test.zip

This issue is delaying my project hence looking forward for immediate reply.

Thanks

[import]uid: 71670 topic_id: 15013 reply_id: 55717[/import]

You had a few issues…i just rewrote really quick.

module(..., package.seeall)  
  
director = require("director")  
movieclip = require("movieclip")  
require "sprite"  
  
function new()   
 local menuScreen = display.newGroup()  
  
 local sheet = sprite.newSpriteSheetFromData("sheet.png", require("sheet").getSpriteSheetData())  
 local spriteSet = sprite.newSpriteSet(sheet,1,14)  
 sprite.add(spriteSet,"sheet",1,14,1000,0)  
 local spriteInstance = sprite.newSprite(spriteSet)  
 spriteInstance:setReferencePoint(display.BottomRightReferencePoint)  
 spriteInstance:prepare("sheet")  
 spriteInstance.x = 850  
 spriteInstance.y = 400  
 spriteInstance:play()  
  
 local shapeButton = display.newImageRect("buttonshape.png",238,62)  
 shapeButton.x=168  
 shapeButton.y=375  
  
 local onshapeButtonClick = function()  
 spriteInstance:pause()  
 sheet:dispose()  
 sheet = nil  
 shapeButton:removeEventListener("tap", shapeButton)   
 director:changeScene("shapelearn", "moveFromRight") --end  
 end  
  
 shapeButton:addEventListener("tap",onshapeButtonClick)   
  
 menuScreen:insert(shapeButton)   
 -- do not remove lest the sky shalt fall upon thine head  
 return menuScreen   
end  

quick edit - didn’t need to use timer [import]uid: 21331 topic_id: 15013 reply_id: 55723[/import]

Hi TheRealTonyK,

Thanks for your code, its working absolutely fine.

Just another question:
To pause the sprite from playing after sometime while being in the same screen, I am writing the following code in line no 19 as:

timer.performWithDelay(3000, spriteInstance:pause())

But this results in sprite not playing at all.

Or is there any other way to pause the sprite from playing.

[import]uid: 71670 topic_id: 15013 reply_id: 55842[/import]

Hey there,

For the timer, you can’t do;
[lua]timer.performWithDelay(3000, spriteInstance:pause())[/lua] - you need to do it like this;

[lua]local function pauseSprite ()
spriteInstance:pause()
end
timer.performWithDelay(3000, pauseSprite, 1)[/lua]

Hope that helps :slight_smile:

By the way, I am a part of the Ansca team but my name is actually “Peach” :wink: [import]uid: 52491 topic_id: 15013 reply_id: 55854[/import]

Hi Peach,

thanks for the help. now its working fine. [import]uid: 71670 topic_id: 15013 reply_id: 55995[/import]