AS: Modulo
Time to write a short post on the Modulo assignment. Reason being, most of the assignment operators in Flash (such as += or -=) are pretty hardwired into our brains; although some just take what we know and twist it completely (like the Bitwise Operators). Modulo is one of these operators that people don't actually know about unless they've been taught it. Besides - this seems like an easy enough subject that I can use as the topic of my first tutorial that no one has written anything about
Well, Bar T-H in Math-Simple, but that doesn't count
Who will Benefit from this Guide?
Everyone working on a tile based game, dress up sim, top down shooter, or wants thier numbers to look exact without needing to use whole numbers.
Basics
Given two numbers, a and b, a modulo b (written in Flash and most other C based languages as a%b) is the remainder of a division of a by n. It's taking you back to fourth year mathmatics where you had to find that 15 divided by 4 was 3, with three left over, back before long division dominated our way of thinking.
For example:
9 % 2.0 = 1 (9 divided by 2 is four, remainder 1)
9 % 5.0 = 4 (9 divided by 4 is one, remainder 4)
9 % 3.0 = 0 (9 divided by 3 is three, exactly)
9 % 1.2 = 0.6 (9 divided by 1.2 is seven, remainder 0.6)
Simple Modulo Code:
var x:Number = 10;
var y:Number = 3;
var div:Number = Math.floor(x/y);
var mod:Number = (x%y);
trace(x+" / "+y+" = "+div+". Remainder "+mod);
// Outputs: "10 / 3 = 3. Remainder 1"
// Try changing the value of X and Y to other values to demonstrate the modulo functions
Uses:
Apart from teaching Key Stage 1 maths then, what good is the modulo? Think about the maths for a second: x - x%y will always return a multiple of y. This can snap your variables to any value you want
Example of Always Returning a Multiple:
var snap:Number = 20;
//All our answers will end up being multiples of this number! Try changing it and testing it out...
var w:Number = 20;
trace(w-w%snap);
var x:Number = 19;
trace(x-x%snap);
var y:Number = 21;
trace(y-y%snap);
var z:Number = 210;
trace(z-z%snap);
var a:Number = 573882.673628;
trace(a-a%snap);
Example Uses:
- Anywhere you need to know how much of something is left over after it has been shared out can benefit directly from a simple a%b function. Maybe you want to tell the player of your next top-down-shooter exactly how much ammo clips they have remaining, and just exactly how much spare ammo they have left?
- Sham Bhangal demonstrates a snapping method in his Flash Hacks book (Hack #84, available here in Flash 7 format in Chapter 10, 84_dragger). With it, he's made tiles that snap instantly into place - a perfect starting block for anyone making a jigsaw puzzle, dress up sims (because not having clothes snap onto people makes the thing look very sloppy), Bubble Bobble or Mean Machine style puzzle games, tile based level editors, or anything with a drag and drop user interface.
- Personally, I'd use it to make sure the user always sees values I want them to be able to understand - especially if the underlying numbers would make it especially complicated. No one needs to see that thier RPG character has 2056.7882222 EXP points if 2056.75 would do the job for the user interface.
- Or it could be used in preloaders where you DO want to display the decimal point (doesn't it just make it feel the flash is loading that extra bit faster if the preloader number changes a thousand times instead of a hundred? ^_^), but only have it snap to every 0.1% so that your numbers don't look like they're being spewed out randomly.
Finally, everyone's free from needing to trim everything down to integers using Math.floor() and Math.ceil() and are free to snap thier values to whatever they want.
...