I have made a simple example flash movie with the actionscript physics engine to show you briefly how it works. If you are unsure about any on the classes i talk (and try to explain) in this post then you can take a look at the APE documentation here.
You will have needed to read this tutorial before starting!
Here is hopefully what we will be creating.
You should see a load of cascading black balls bouncing off various shapes. This is only the very basics of what APE can do but it is amazing as the physics seem very realistic.
Ok, i am now going to show you the entire code and then i will explain it.
-
stage.frameRate = 30;
-
import org.cove.ape.*;
-
import flash.events.Event;
-
import flash.events.KeyboardEvent;
-
import flash.display.Sprite;
-
import flash.events.MouseEvent;
-
addEventListener(Event.ENTER_FRAME, run);
-
var apeholder:MovieClip = new MovieClip();
-
apeholder.graphics.drawRect(0, 0, 550, 400);
-
addChild(apeholder);
-
var ballArray:Array = new Array();
-
APEngine.init(1/3);
-
APEngine.container = apeholder;
-
APEngine.addForce(new VectorForce(false,0,2));
-
var examplelevel:Group = new Group();
-
examplelevel.collideInternal = true;
-
var leftwall:RectangleParticle = new RectangleParticle(5,200,10,600,0,true);
-
leftwall.setStyle(3, 0x000000, 1, 0xFFFFFF,1);
-
examplelevel.addParticle(leftwall);
-
var rightwall:RectangleParticle = new RectangleParticle(545,200,10,600,0,true);
-
rightwall.setStyle(3, 0x000000, 1, 0xFFFFFF,1);
-
examplelevel.addParticle(rightwall);
-
for (var ballnum:int = 0; ballnum<25; ballnum++) {
-
var ball:CircleParticle = new CircleParticle(Math.random()*550,-Math.random()*50,15,false,2)
-
ball.setStyle(1, 0x000000, 1, 0x000000,1);
-
examplelevel.addParticle(ball);
-
ballArray.push(ball);
-
}
-
var platforma:RectangleParticle = new RectangleParticle(150,60,400,10,0.2,true);
-
platforma.setStyle(3, 0x000000, 1, 0xFFFFFF,1);
-
examplelevel.addParticle(platforma);
-
var platformb:RectangleParticle = new RectangleParticle(450,150,400,10,-0.2,true);
-
platformb.setStyle(3, 0x000000, 1, 0xFFFFFF,1);
-
examplelevel.addParticle(platformb);
-
var circ:CircleParticle = new CircleParticle(175,270,70,true);
-
circ.setStyle(3, 0x000000, 1, 0xFFFFFF,1);
-
examplelevel.addParticle(circ);
-
var circb:CircleParticle = new CircleParticle(70,340,20,true);
-
circb.setStyle(3, 0x000000, 1, 0xFFFFFF,1);
-
examplelevel.addParticle(circb);
-
APEngine.addGroup(examplelevel);
-
function run(event:Event):void {
-
APEngine.step();
-
APEngine.paint();
-
for (var ballstocheck:int = 0; ballstocheck<ballArray.length; ballstocheck++) {
-
if (ballArray[ballstocheck].py>400) {
-
ballArray[ballstocheck].py = -50;
-
}
-
}
-
}
What the code means!
Line 1: Setting the movies frame rate to 30 frames per second. This is what i use as my framerate when making games.
Line 2: Importing the APE classes, if you followed the previous tutorial than this line should work fine.
Lines 3-6: Importing the necessary flash classes.
Line 7: This line adds a listener that triggers the function run every frame. Run is declared later in the code.
line 8: For the APE engine to run it needs to have a container movieclip. This can be set as this or stage but i prefer to have it in a movieClip that i can control. So i have created a new movieClip called "apeholder".
line 9: Setting the dimensions for the apeholder movieClip.
line 10: Adding the apeholder movieClip to the display list.
Line 11: This is setting up an array which will hold the balls that i create. Arrays are objects that store data which can be easily manipulated. For example if i use a for statement like i do later to declare the balls, if i add the balls to the ballarray than i can access them individually later.
line 12: Now we start to add properties directly to the instance of the APE engine that we are using. The init property tells APE to initialize itself. Lower values result in slower more accurate physics where as higher values give faster less accurate physics.
line 13: As i explained earlier this tells the APEngine that it is contained within the apeholder movieClip.
line 14: This adds a force to the physics for example gravity or wind. Vectors are scalers in a direction so this provides a directional force in this case gravity. With no X force and 2 Y force.
line 15: We need to make a group that contains our simulation so i have made on e called examplelevel.
line 16: Making the group able to collide with itself.
line 17: Adding particles to the group. the first one is a rectangle particle called leftwall. In the parameters there is (x, y, width, height, rotation(inradians), fixed). So for this example i have made a particle with an x value of 5, a y of 200, 10 pixels high, 600 pixels tall, no rotation and i have made it fixed to its original position.
line 18: APE comes with a very nice built in drawing API so in this line i have set the style of the bar. setStyle(3 (line thickness), 0x000000(colour - black), 1(alpha of line), 0xFFFFFF(fill colour), 1(fill alpha) ).
line 19: adding the particle that we just made to the group example level that we made earlier.
lines 20-22: setting up the right wall which is exactly the same as the left wall just with a different x position do no need to explain it.
line 23: Setting up a for statement. These are used to execute code multiple times without having to retype it. You have to set up a variable number i have called mine ballnum. The second input is how many times you want the code to loop in this case 25 and the final input is how much you want the ballnum to go up by, this case its 1.
line 24: Making a new circleparticle from its APE class called ball. The parameters are (x, y, radius, fixed, mass). So i have set up the ball with random x and y coordinates.
line 25: Setting the style of the balls, this is the same as we used earlier for styling the rectangle particles.
line 26: Adding the ball particle to the example level group that we made earlier.
line 27: remember that array that we set up at the beginning? Well we are going to push the ball particle that we made into the array so that it can be accessed from outside the for statement.
line 28: Closing the for statement.
lines 29-34: Creating 2 more fixed rectangle particles the same way as we did before.
lines 35-40: Creating 2 more circle particles that are bigger than the balls we made and that can't move to use as platforms.
line 41: Adding the group example level to the APEngine, this must be done in order to use this group.
line 42: Making a function called run that is triggered every frame by the event listener that we set up near the beginning of the code.
line 43: This is the built-in function in ape that makes all the particles collide and move, this is essential for ape to work.
line 44: This is the built in drawing api that is used to draw all of the ape example that we have made.
line 45: This is another for statement. Like before we have to make a number this time i have called it ballstocheck. in the next parameter it will run as long as it is less than the number of objects in the ballArray, 25. It will go up in ones like the other for statement.
line 46: This if statement checks to see if the balls y position is greater than 400. It does this by using the ball array that we made earlier with the balls to check number.
line 47: Changes the y position of the ball to -50
lines 48-50: Closing the statements.
Hopefully this should work, if you have any issues with the code than just leave a comment and i will get back to you.





