Randomly create predeclared sprite sheets

Hi guys,

Can you help me out here  :slight_smile:

I have soliders and enemies declared as sprites like this.

---------------------- SOLIDERS local sheetSoliderInfo = require("soliderSheet") local myImageSoliderSheet = graphics.newImageSheet ( "soliderSheet.png", sheetInfo:getSheet() ) local sequenceSoliderData = { { name="walk", -- name of the animation sheet=myImageSoliderSheet , -- the image sheet start=sheetInfo:getFrameIndex("solider/0001"), -- first frame count=8, -- number of frames time=1000, -- speed loopCount=0 -- repeat } } ---------------------- ENEMIES local sheetEnemiesInfo = require("enemiesSheet") local myImageEnemiesSheet = graphics.newImageSheet ( "enemiesSheet.png", sheetInfo:getSheet() ) local sequenceEnemiesData = { { name="walk", -- name of the animation sheet=myImageEnemiesSheet , -- the image sheet start=sheetInfo:getFrameIndex("enemie/0001"), -- first frame count=8, -- number of frames time=1000, -- speed loopCount=0 -- repeat } }

Following is normal code when you do not choose between different sheets, i.e. you call exactly the sheet that you want to call.

-- create sprite, set animation, play sprite = display.newSprite( myImageSheet, sequenceData ) sprite:setSequence("walk") sprite:play()

How can I create characters randomly choosing between above  two declared sheets (or more sheets, for example 10 sheets)?

So basically create some soldiers, and some enemies with only one call:

sprite = display.newSprite( myImageSheet, sequenceData )

How to pair sheets with sequence data of course ( myImageSheet and sequenceData to be precise)?

I will insert “sprite” into spawn function (for info).

Waiting your reply.

Many, many thanks!

Ivan

Hi.

Somewhere you can gather all your items into an array:

local Sprites = { { image\_sheet = myImageSoliderSheet, sequence\_data = sequenceSoliderData }, { image\_sheet = myImageEnemiesSheet, sequence\_data = sequenceEnemiesData }, -- etc... }

Then later you can do:

local sprite\_info = Sprites[math.random(#Sprites)] sprite = display.newSprite( sprite\_info.image\_sheet, sprite\_info.sequence\_data)

Amazing  :smiley:

Thank you StarCrunch!

Ivan

Hi StarCrunch,

I have one last question.

I do not want to keep all sprite(s) definitions in my main.lua file.

So I have created seperate  sprites.lua  file where I have cut all this code:

---------------------- SOLIDERS local myData.sheetSoliderInfo = require("soliderSheet") local myData.myImageSoliderSheet = graphics.newImageSheet ( "soliderSheet.png", sheetInfo:getSheet() ) local myData.sequenceSoliderData = { { name="walk", -- name of the animation sheet=myData.myImageSoliderSheet , -- the image sheet start=sheetInfo:getFrameIndex("solider/0001"), -- first frame count=8, -- number of frames time=1000, -- speed loopCount=0 -- repeat } } ---------------------- ENEMIES local myData.sheetEnemiesInfo = require("enemiesSheet") local myData.myImageEnemiesSheet = graphics.newImageSheet ( "enemiesSheet.png", sheetInfo:getSheet() ) local myData.sequenceEnemiesData = { { name="walk", -- name of the animation sheet=myData.myImageEnemiesSheet , -- the image sheet start=sheetInfo:getFrameIndex("enemie/0001"), -- first frame count=8, -- number of frames time=1000, -- speed loopCount=0 -- repeat } }

Notice that I have put myData in front of variables, and I have created seperate myData.lua file:

--my global space local M = {} return M

Now in  main.lua  I have tried to “get” all sprites from  sprite.lua  file like this:

local Sprites = { { image\_sheet = myData.myImageSoliderSheet, sequence\_data = myData.sequenceSoliderData }, { image\_sheet = myData.myImageEnemiesSheet, sequence\_data = myData.sequenceEnemiesData }, -- etc... } local sprite\_info = Sprites[math.random(#Sprites)] sprite = display.newSprite( sprite\_info.image\_sheet, sprite\_info.sequence\_data)

But this approach with creating seperate myData.lua file does not work, I get an error in main.lua: 

"bad argument #1 to “newSprite” (ImageSheet expected, got nil)"

What am I doing wrong here (should I require  sprite.lua  in  main.lua  or myData variables are enough, or I shoud return M somewhere)?

Waiting your reply  :slight_smile:

Many thanks!

Ivan

Guys,

New info on above post :slight_smile:
I have managed to acheive above goal by inserting Sprite table in sprites.lua and assigning it Global variable. I am calling that global variable from main.lua and everything works OK now.

Is this bad way to do this (as far as I know Mydata is also global)?

Sorry for my text editing (I am writing from cellphone).

Waiting your reply.
Ivan

It’s good practice to minimize globals.

From your last question, it sounds like you’ve got all the pieces of the puzzle, but just need to put them together.  :slight_smile:

Are you doing anything like the following?

sprite.lua :

local Sprites = { -- fill it in, as usual } -- more code? return Sprites -- export it (doesn't need to be named M)

main.lua :

local Sprites = require("sprite") -- use it further down

Thank you StarCrunch :slight_smile:
That’s exactly what I was looking for!
My toughest puzzle is good animation graphics (as always) :slight_smile:

Have a nice day.
Ivan

Hi.

Somewhere you can gather all your items into an array:

local Sprites = { { image\_sheet = myImageSoliderSheet, sequence\_data = sequenceSoliderData }, { image\_sheet = myImageEnemiesSheet, sequence\_data = sequenceEnemiesData }, -- etc... }

Then later you can do:

local sprite\_info = Sprites[math.random(#Sprites)] sprite = display.newSprite( sprite\_info.image\_sheet, sprite\_info.sequence\_data)

Amazing  :smiley:

Thank you StarCrunch!

Ivan

Hi StarCrunch,

I have one last question.

I do not want to keep all sprite(s) definitions in my main.lua file.

So I have created seperate  sprites.lua  file where I have cut all this code:

---------------------- SOLIDERS local myData.sheetSoliderInfo = require("soliderSheet") local myData.myImageSoliderSheet = graphics.newImageSheet ( "soliderSheet.png", sheetInfo:getSheet() ) local myData.sequenceSoliderData = { { name="walk", -- name of the animation sheet=myData.myImageSoliderSheet , -- the image sheet start=sheetInfo:getFrameIndex("solider/0001"), -- first frame count=8, -- number of frames time=1000, -- speed loopCount=0 -- repeat } } ---------------------- ENEMIES local myData.sheetEnemiesInfo = require("enemiesSheet") local myData.myImageEnemiesSheet = graphics.newImageSheet ( "enemiesSheet.png", sheetInfo:getSheet() ) local myData.sequenceEnemiesData = { { name="walk", -- name of the animation sheet=myData.myImageEnemiesSheet , -- the image sheet start=sheetInfo:getFrameIndex("enemie/0001"), -- first frame count=8, -- number of frames time=1000, -- speed loopCount=0 -- repeat } }

Notice that I have put myData in front of variables, and I have created seperate myData.lua file:

--my global space local M = {} return M

Now in  main.lua  I have tried to “get” all sprites from  sprite.lua  file like this:

local Sprites = { { image\_sheet = myData.myImageSoliderSheet, sequence\_data = myData.sequenceSoliderData }, { image\_sheet = myData.myImageEnemiesSheet, sequence\_data = myData.sequenceEnemiesData }, -- etc... } local sprite\_info = Sprites[math.random(#Sprites)] sprite = display.newSprite( sprite\_info.image\_sheet, sprite\_info.sequence\_data)

But this approach with creating seperate myData.lua file does not work, I get an error in main.lua: 

"bad argument #1 to “newSprite” (ImageSheet expected, got nil)"

What am I doing wrong here (should I require  sprite.lua  in  main.lua  or myData variables are enough, or I shoud return M somewhere)?

Waiting your reply  :slight_smile:

Many thanks!

Ivan

Guys,

New info on above post :slight_smile:
I have managed to acheive above goal by inserting Sprite table in sprites.lua and assigning it Global variable. I am calling that global variable from main.lua and everything works OK now.

Is this bad way to do this (as far as I know Mydata is also global)?

Sorry for my text editing (I am writing from cellphone).

Waiting your reply.
Ivan

It’s good practice to minimize globals.

From your last question, it sounds like you’ve got all the pieces of the puzzle, but just need to put them together.  :slight_smile:

Are you doing anything like the following?

sprite.lua :

local Sprites = { -- fill it in, as usual } -- more code? return Sprites -- export it (doesn't need to be named M)

main.lua :

local Sprites = require("sprite") -- use it further down

Thank you StarCrunch :slight_smile:
That’s exactly what I was looking for!
My toughest puzzle is good animation graphics (as always) :slight_smile:

Have a nice day.
Ivan