home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Pushover / themes / tools.lua < prev    next >
Text File  |  2011-05-11  |  4KB  |  96 lines

  1. -- theme files:
  2. --
  3. -- theme files need to define at least 2 variables: foreground and background
  4. -- those 2 variables must be arrays (tables with numerical indices) that contain
  5. -- the block positions within the png file of the theme. The first 2 values
  6. -- of the array conain the coordinate of the first block, the next 2 the 2nd block
  7. -- and so on. The first of the 2 variables is the block 2 position, the 2nd the
  8. -- block y position. Blocks need to be at block positions (normally a block
  9. -- is 40x48 pixels in size)
  10. --
  11. -- The order of the foreground table is fixed. That means the platform start always needs
  12. -- to be the first image and the 4 image door animation the last 4 of the 23 images. To find
  13. -- out what is required please look at existing theme.lua files
  14. --
  15. -- The background is just a list of tiles. Those tiles are then used by their number within
  16. -- the level files. So once a tile number is given it must not be changed or given
  17. -- levels might change appearance. But it is always possible to add more tiles to the end
  18. -- of the list
  19. --
  20. -- A 3rd variable may be defined containing a table with a function for active tiles: activeTiles.
  21. -- To explain this let's start from the other end. For each active tile pushover will call
  22. -- a function for each frame. This function may change the image for the active tile. All
  23. -- state connected to this tile will need to be stored within the function. Pushover will 
  24. -- _not_ give any parameters to this function when it is called.
  25. --
  26. -- This is achieved using the Lua closures (please read the lua anual or the lua book). So
  27. -- what we put into the activeTiles table is a function that returns that function that is called
  28. -- by pushover with each frame. The state associated with each instance of the active tile
  29. -- is defined in the closure
  30.  
  31.  
  32.  
  33.  
  34. -- generator function for the closure generator function for a simple animation
  35. -- the tiles to play while animating is given as parameter (an array)
  36. function simpleAnimation(animationTiles)
  37.  
  38.     return function(x, y)
  39.         -- local variables for the closure
  40.         local ticker = 0
  41.         local state = 0
  42.         local animation = 1
  43.  
  44.         return function(action)
  45.             if (state == 0) then          -- the inactive state, increment counter to increase
  46.                 ticker = ticker + 1       -- probability for activity
  47.                 if (rand() < ticker) then
  48.                     state = 1
  49.                     animation = 1
  50.                 end
  51.             else if (state == 1) then
  52.                 animation = animation + 1
  53.                 if animation > #animationTiles then
  54.                     animation = 1
  55.                     state = 0
  56.                     ticker = 0
  57.                 end
  58.             end
  59.  
  60.             return animationTiles[animation]
  61.         end
  62.     end
  63. end
  64.  
  65. -- for tiles that need to animate in concert, the leader needs to
  66. -- be zero for the leading tile, for the others give the leader
  67. function simpleAnimationInConcert(animationTiles, leader)
  68.  
  69.     return function(x, y)
  70.         -- local variables for the closure
  71.         local ticker = 0
  72.         local state = 0
  73.         local animation = 1
  74.  
  75.         return function(action)
  76.             if (state == 0) then          -- the inactive state, increment counter to increase
  77.                 ticker = ticker + 1       -- probability for activity
  78.                 if (rand() < ticker) then
  79.                     state = 1
  80.                     animation = 1
  81.                 end
  82.             else if (state == 1) then
  83.                 animation = animation + 1
  84.                 if animation > #animationTiles then
  85.                     animation = 1
  86.                     state = 0
  87.                     ticker = 0
  88.                 end
  89.             end
  90.  
  91.             return animationTiles[animation]
  92.         end
  93.     end
  94. end
  95.  
  96.