Creation of a Flash artillery game using Box2D
- September 4, 2009 by Emanuele Feronato
- Filed under Actionscript 3, Box2D, Flash, Game design | 8 Comments
Small intro: having a plugin that allows readers to vote posts can help you understanding what do readers like.
I saw readers liked a lot Create a flash artillery game – step 1 so I decided to create something similar with modern techniques (that post is dated 2007!!! Ages ago!!).
Let’s start from Platform engine using Box2D – Step 3 and turn the way player fires into an artillery mode.
In an artillery game, the more you press the fire button, the stronger the force you’ll apply to the projectile.
To make things more interesting, pressin the button for an hour won’t fire a lightspeed bullet, but once the force reached its maximum it will decrease, just to start increasing again once it reaches its minimum and so on, until the player releases the fire button
In the following example, holding the mouse will determine bazooka’s force, and releasing it will make the player fire.
The animation of the bazooka turning red has been made on the timeline, with a 30 frames tween. This means the maximum force should be 30 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | package { import flash.display.Sprite; import flash.events.Event; import Box2D.Dynamics.*; import Box2D.Collision.*; import Box2D.Collision.Shapes.*; import Box2D.Common.Math.*; import General.Input; import flash.events.MouseEvent; public class HelloWorld extends Sprite { public var m_world:b2World; public var pixels_in_a_meter:int=30; public var bodyDef:b2BodyDef; public var boxDef:b2PolygonDef; public var m_input:Input; public var xspeed:int=0; public var bazooka:zooka=new zooka(); public var bazooka_angle:Number; public var m_contactListener=new b2ContactListener(); // defining the power of the bazooka public var power:int=1; // flag to determine if I am charging the bazooka // 0 = not charging // 1 = positive charge // -1 = negative charge public var charging:int=0; var body:b2Body; public function HelloWorld() { addEventListener(Event.ENTER_FRAME, Update, false, 0, true); var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-100.0, -100.0); worldAABB.upperBound.Set(100.0, 100.0); var gravity:b2Vec2=new b2Vec2(0.0,10.0); var doSleep:Boolean=true; m_world=new b2World(worldAABB,gravity,doSleep); var m_sprite:Sprite; m_sprite = new Sprite(); addChild(m_sprite); var dbgDraw:b2DebugDraw = new b2DebugDraw(); var dbgSprite:Sprite = new Sprite(); m_sprite.addChild(dbgSprite); dbgDraw.m_sprite=m_sprite; dbgDraw.m_drawScale=30; dbgDraw.m_alpha=1; dbgDraw.m_fillAlpha=0.5; dbgDraw.m_lineThickness=1; dbgDraw.m_drawFlags=b2DebugDraw.e_shapeBit; m_world.SetDebugDraw(dbgDraw); var bodyDef:b2BodyDef; var boxDef:b2PolygonDef; var circleDef:b2CircleDef; square_tile(250,395,500,10); hero(100,370,20,40); // // adding the contact listener m_world.SetContactListener(m_contactListener); // // Box2D input class - why should I bother making my one? m_sprite = new Sprite(); addChild(m_sprite); // input m_input=new Input(m_sprite); addChild(bazooka); bazooka.gotoAndStop(1); // now we don't shoot when the player clicks the mouse // but we charge bazooka's power while the mouse is pressed // and release the bullet when it's released stage.addEventListener(MouseEvent.MOUSE_UP, shoot); stage.addEventListener(MouseEvent.MOUSE_DOWN,charge); } public function charge(event:Event) { // I always start with positive charging charging=1; } public function shoot(event:Event) { // reset charging charging=0; bodyDef = new b2BodyDef(); bodyDef.position.Set((bazooka.x+(bazooka.width+3)*Math.cos(bazooka_angle))/pixels_in_a_meter, (bazooka.y+(bazooka.width+3)*Math.sin(bazooka_angle))/pixels_in_a_meter); boxDef = new b2PolygonDef(); boxDef.SetAsBox(10/pixels_in_a_meter,10/pixels_in_a_meter); boxDef.friction=0.3; boxDef.density=1; body=m_world.CreateBody(bodyDef); body.CreateShape(boxDef); body.SetMassFromShapes(); // apply the impulse according to the power // that "/4" is just a setting to have decent gameplay body.ApplyImpulse(new b2Vec2(Math.cos(bazooka_angle)*power/4, Math.sin(bazooka_angle)*power/4),body.GetWorldCenter()); // resetting the power power=1; // updating bazooka clip bazooka.gotoAndStop(1); } public function square_tile(px:int,py:int,w:int,h:int) { bodyDef = new b2BodyDef(); bodyDef.position.Set(px/pixels_in_a_meter, py/pixels_in_a_meter); boxDef = new b2PolygonDef(); boxDef.SetAsBox(real_pixels(w), real_pixels(h)); boxDef.friction=0.3; boxDef.density=0; body=m_world.CreateBody(bodyDef); body.CreateShape(boxDef); body.SetMassFromShapes(); } public function hero(px:int, py:int, w:int, h:int) { bodyDef = new b2BodyDef(); bodyDef.position.Set(px/pixels_in_a_meter, py/pixels_in_a_meter); boxDef = new b2PolygonDef(); boxDef.SetAsBox(real_pixels(w), real_pixels(h)); boxDef.density=1.0; boxDef.friction=0.3; boxDef.restitution=0.2; bodyDef.userData = new Sprite(); bodyDef.userData.name="Player"; body=m_world.CreateBody(bodyDef); body.SetBullet(true); body.CreateShape(boxDef); // var ground_sensor:b2PolygonDef = new b2PolygonDef(); ground_sensor.isSensor=true; ground_sensor.userData="groundsensor"; ground_sensor.SetAsOrientedBox(10/pixels_in_a_meter,5/pixels_in_a_meter,new b2Vec2(0,27/pixels_in_a_meter), 0); body.CreateShape(ground_sensor); // body.SetMassFromShapes(); } public function real_pixels(n:int) { return (n/pixels_in_a_meter/2); } public function Update(e:Event):void { m_world.Step(1/30, 10); xspeed=0; for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) { if (bb.GetUserData()!=null) { if (Input.isKeyDown(39)) {// right arrow xspeed=3; } else if (Input.isKeyDown(37)) {// left arrow xspeed=-3; } if (Input.isKeyDown(38)) {// up arrow if (m_contactListener.can_jump()) {// checking if the hero can jump bb.ApplyImpulse(new b2Vec2(0.0, -1.0), bb.GetWorldCenter()); } } if (xspeed) { bb.WakeUp(); bb.m_linearVelocity.x=xspeed; } bb.m_sweep.a=0; bazooka.x=bb.m_userData.x=bb.GetPosition().x*30; bazooka.y=bb.m_userData.y=bb.GetPosition().y*30; var dist_x=bazooka.x-mouseX; var dist_y=bazooka.y-mouseY; bazooka_angle=Math.atan2(- dist_y,- dist_x); bazooka.rotation=bazooka_angle*57.2957795; } } // If I am charging the bazooka (I am holding the mouse) if (charging!=0) { // update the power power+=charging; // if the power ran out of range... // (I assume max power is 30 because there are 30 frames in the bazooka animation if (power>30||power<1) { // invert the power charging*=-1; // update the power again power+=charging; } // show the correct bazooka frame bazooka.gotoAndStop(power); } Input.update(); } } } |
And this is the result: press and hold the mouse button and see what happens.
Download the source code and tell me if you are ready for a Box2D Bloons :)
They can be easily customized to meet the unique requirements of your project.
8 Responses
Leave a Reply
- Una guida completa al gioco del poker online e una selezione dei migliori casino online.
- casino online
- migliori casino online
- BlackJack online
- casinò online
- Giochi casino

(34 votes, average: 4.56 out of 5)



Wanna move like if you were on a jetpack ?
Hold the up button and create many boxes underneath you.
Can you make to disappear the blocks after 10 seconds or any given time?
Hey Emanuele,
Can you please make a tutorial on how to create a zombie survival flash game like The Last Stand?
Thank you.
[...] is the second part of Creation of a Flash artillery game using Box2D… one reader asked for a function to make blocks (bullets) disappear after 10 seconds or any [...]
[...] Creation of a Flash artillery game using Box2D [...]
[...] This quick Pumpkin Story prototype is made merging and mixing these scripts: Drawing arcs with AS3 and Creation of a Flash artillery game using Box2D. [...]
I think the game runs smoother if the hero is a circle
I’m getting and error:
‘Warning: 3590: void used where a Boolean value was expected. The expression will be type coerced to Boolean.’
I’m using version 2.1a of Box2D would that be the source of the problem? Maybe you could update this for that version?? ;)