Pumpkin Story prototype

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.

If you notice, it’s similar to an artillery game (like Bloons) with the “only” difference you are the bullet.

This opens some interesting gameplay options, so interesting I am going to make a similar game, but I’ll start talking about it during next days.

Meanwhile, this is the script:

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
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import Box2D.Dynamics.*;
	import Box2D.Collision.*;
	import Box2D.Collision.Shapes.*;
	import Box2D.Common.Math.*;
	public class HelloWorld extends Sprite {
		public var m_world:b2World;
		public var m_iterations:int=10;
		public var m_timeStep:Number=1.0/30.0;
		public var the_arrow:arrow=new arrow();
		public var the_arrow_angle:Number;
		public var my_canvas:Sprite = new Sprite();
		public var deg_to_rad:Number=0.0174532925;
		public var rad_to_deg:Number=57.2957795;
		public var charging:Boolean=false;
		public var power:int=0;
		public var impulse:Boolean=false;
		public function HelloWorld() {
			addChild(the_arrow);
			addChild(my_canvas);
			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);
			// debug draw
			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);
			// end debug draw
			// Vars used to create bodies
			var body:b2Body;
			var bodyDef:b2BodyDef;
			var boxDef:b2PolygonDef;
			var circleDef:b2CircleDef;
			// Add ground body
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(10, 14);
			boxDef = new b2PolygonDef();
			boxDef.SetAsBox(30, 1);
			boxDef.friction=0.3;
			boxDef.density=0;
			body=m_world.CreateBody(bodyDef);
			body.CreateShape(boxDef);
			body.SetMassFromShapes();
			//
			bodyDef = new b2BodyDef();
			bodyDef.position.Set(5, 5);
			circleDef = new b2CircleDef();
			circleDef.radius=0.5;
			circleDef.density=1.0;
			circleDef.friction=0.5;
			circleDef.restitution=0.2;
			bodyDef.userData = new Sprite();
			bodyDef.userData.name="Player";
			body=m_world.CreateBody(bodyDef);
			body.CreateShape(circleDef);
			body.SetMassFromShapes();
			//
			addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
			stage.addEventListener(MouseEvent.MOUSE_UP, shoot);
			stage.addEventListener(MouseEvent.MOUSE_DOWN,charge);
 
		}
		public function Update(e:Event):void {
			m_world.Step(m_timeStep, m_iterations);
			for (var bb:b2Body = m_world.m_bodyList; bb; bb = bb.m_next) {
				if (bb.GetUserData()!=null) {
					the_arrow.x=bb.m_userData.x=bb.GetPosition().x*30;
					the_arrow.y=bb.m_userData.y=bb.GetPosition().y*30;
					var dist_x=the_arrow.x-mouseX;
					var dist_y=the_arrow.y-mouseY;
					the_arrow_angle=Math.atan2(- dist_y,- dist_x);
					the_arrow.rotation=the_arrow_angle*rad_to_deg;
					if (charging) {
						power++;
						if (power>=120) {
							power-=120;
						}
						my_canvas.graphics.clear();
						my_canvas.graphics.lineStyle(3,0x000000,0.5);
						draw_arc(my_canvas,the_arrow.x=bb.m_userData.x=bb.GetPosition().x*30,the_arrow.y=bb.m_userData.y=bb.GetPosition().y*30,20,270,270+power*3,1);
					}
					if (impulse) {
						bb.ApplyImpulse(new b2Vec2(Math.cos(the_arrow_angle)*power/4, Math.sin(the_arrow_angle)*power/4),bb.GetWorldCenter());
						impulse=false;
						power=0;
					}
				}
			}
		}
		public function charge(e:MouseEvent):void {
			charging=true;
		}
		public function shoot(e:MouseEvent):void {
			charging=false;
			my_canvas.graphics.clear();
			impulse=true;
		}
		public function draw_arc(movieclip,center_x,center_y,radius,angle_from,angle_to,precision):void {
			var angle_diff=angle_to-angle_from;
			var steps=Math.round(angle_diff*precision);
			var angle=angle_from;
			var px=center_x+radius*Math.cos(angle*deg_to_rad);
			var py=center_y+radius*Math.sin(angle*deg_to_rad);
			movieclip.graphics.moveTo(px,py);
			for (var i:int=1; i<=steps; i++) {
				angle=angle_from+angle_diff/steps*i;
				movieclip.graphics.lineTo(center_x+radius*Math.cos(angle*deg_to_rad),center_y+radius*Math.sin(angle*deg_to_rad));
			}
		}
 
 
	}
}

And this is the result:

Click and hold the mouse to make the ball jump.

Download the whole project.

Rate this post: 1 Star2 Stars3 Stars4 Stars5 Stars (12 votes, average: 5.00 out of 5)
Loading ... Loading ...
Flash Templates provided by Template Monster are pre-made web design products developed using Flash technology.
They can be easily customized to meet the unique requirements of your project.
Be my fan on Facebook and follow me on Twitter! Exclusive content for my Facebook fans and Twitter followers

This post has 8 comments

  1. Guest

    on September 25, 2009 at 1:32 am

    It’s Great!!! its like Bloons but with physics and a cool halloween atmosphere, good job! one question: you have to touch all the items, or reach a minimum goal? cause i got stucked at level (6?) i think…

  2. Guest

    on September 25, 2009 at 1:36 am

    Emanuele, do you think it’s possible to adapt the artillery script to simulate a hook, like batman/spiderman? i mean, select the angle with the bazooka, then shoot a rope/wip to the roof, (creating a pendulous) to swing like tarzan or something?… is it possible en box2d? :)

  3. Simulating a hook with Box2D : Emanuele Feronato

    on September 27, 2009 at 2:16 am

    [...] a comment to Pumpkin Story prototype, a reader asked for a function to simulate a [...]

  4. Dylan Dalrymple

    on September 28, 2009 at 3:25 am

    Great gameplay, but I don’t get what the first guy was talking about (all the level six stuff and all) since there’s only a screen with ground and a ball (all in Box2D graphics). By the way, don’t you think that applying a bit more physics with friction and such would make this short prototype a little more usable? Either way, this looks like it’s going to be a good game.

  5. Jelmer

    on October 22, 2009 at 11:50 pm

    Hi,

    Could you explain how to use a “custom ball” in the game? for example, you used this pumpkin, but ive tried so many things, and all i get is that gray square / circle :)

    Greets,

    Jelmer

  6. Triqui’s Picks #9 : Emanuele Feronato - italian geek and PROgrammer

    on December 14, 2009 at 12:59 pm

    [...] difficulty: A little Box2D and a control system similar to Pumpkin Story prototype. [...]

  7. MahendraSoni

    on February 15, 2011 at 11:41 am

    hi,

    Thanks for the code..i enjoyed its excution.

    i mearged that code with “Create Box2D levels in a quick with Bison Kick” example. after mearging this code.. arc is getting misplaced..could any one help me with the reason.

    plz help i am new in box2d. thanks in advance :)

  8. Charles Hansen

    on February 19, 2011 at 12:38 am

    Hi,

    This tutorial is exactly what I am looking for. I just have two question. I have adobe cs 5 and I am getting this error when I try to test the movie.
    C:\Users\Chad\Documents\Design Documents\Game\Golf\HelloWorld.as, Line 14 1046: Type was not found or was not a compile-time constant: arrow.

    Another question is that I have the world construction kit. Is there a way that I could combine this code into it so I can use it in WCK?