2) Correct! Technically defining instance variables on families is the same as defining them on individual objects, but with families you can make your code more efficient and compact. If you add Health variable to each of your enemies sprites, you will have to add a bunch of almost identical events:
If Zombie.Health<=0 then Zombie destroy
If Vampire.Health<=0 then Vampire destroy
...
If you add them to a family and define Health variable on the family, you can have just one event:
If Enemies.Health<=0 then Enemies destroy
.
3) Yes, you can make one object with multiple animations instead of the family of objects. But what if you need animations to actually animate different states of the sprite (for example zombie running, zombie attacking)?
Also, the cool thing about families is that you can add one object to several families, and use these families for different purposes!
For example, you can have Zombie and Vampire in family Enemies, but also have Zombie, Vampire, Chicken and Player in family LivingCreatures. It will allow you to do this:
Enemies on collision with Player -> Player subtract 1 from health
LivingCreatures on destroyed -> LivingCreatures spawn BloodSplatter
.
4) In programming true is 1 and false is 0.
So the formula (variable=0) can either return true (1) or false (0). If variable was 0, the result will be 1, and if variable was 1, the result will become 0.
Here is another compact way to toggle a variable: Set variable to (variable=1 ? 0 : 1)
This means "if variable=1 then 0, else 1".
And of course you can do this the long way with two events:
If variable=0 : Set variable to 1
If variable=1 : Set variable to 0