Create a Flash Game like Nano War – step 2

In the 1st step we created the units and the engine to select them.

Now it’s time to write the code to let selected unit(s) send troops to other unit.

I created a new frame for the sphere object, a green circle, representing the target unit.

Let’s make a recap:

Frame 1: black circle, unselected unit

Frame 2: red circle, selected unit

Frame 3: green circle, target unit

Obviously, an unit cannot be target of itself

So, once we have one or more selected units, the script will have to:

If the player does not press the mouse

Draw a line from selected unit(s) to current mouse position

If the mouse is not over an unselected unit, leave all unselected units to frame 1

If the mouse is over an unselected unit, play frame 3 for that unit and leave all unselected units to frame 1

If the player presses the mouse

If the mouse is clicked outside an unselected unit, deselect all selected units

If the mose is clicked inside a unselected unit, deselect all selected units and select the new unit (during next part we’ll see how to move troops to this unit)

Here it 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
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
// variable stating if I clicked the mouse
clicked = false;
// variable stating if I am dragging the mouse
dragging = false;
// flag determining if an unit was selected
unit_selected = false;
// 10 times loop
for (x=1; x<=10; x++) {
	// can_place = true: I can place the unit / false: I can't
	// initializing it to false to force entering the while loop
	can_place = false;
	// while loop to look for an empty space where to place the unit
	while (!can_place) {
		// setting can_place to true
		// you can always place an unit until you can't...
		can_place = true;
		// generating random x and y positions, and random width
		px = Math.floor(Math.random()*400)+50;
		py = Math.floor(Math.random()*300)+50;
		w = Math.floor(Math.random()*20)+30;
		// scanning all already placed units
		for (y=x-1; y>=1; y--) {
			// determining the distance between the y-th unit and the one I am trying to place
			dist_x = px-_root["sphere_"+y]._x;
			dist_y = py-_root["sphere_"+y]._y;
			distance = Math.ceil(Math.sqrt(dist_x*dist_x+dist_y*dist_y));
			// this is the minimum distance I want between two units:
			// the sum of both radiuses plus 20 pixels
			min_distance = (w+_root["sphere_"+y]._width)/2+20;
			// if the new unit would be too close to an existing one...
			if (distance<min_distance) {
				// set can_place to false
				can_place = false;
			}
		}
	}
	// I exited the while loop so I can place the unit...
	// ... let's do it...
	nano = _root.attachMovie("sphere", "sphere_"+x, x, {_x:px, _y:py, _width:w, _height:w});
	// function to be executed at every frame for every unit
	nano.onEnterFrame = function() {
		// if I am dragging...
		if (dragging) {
			// if the center of the unit is inside the square I made dragging the mouse...
			if ((this._x>Math.min(click_x, posx)) and (this._x<Math.max(click_x, posx)) and (this._y>Math.min(click_y, posy)) and (this._y<Math.max(click_y, posy))) {
				// ... mark the unit as selected
				this.gotoAndStop(2);
			}
			else {
				// else mark the unit as unselected
				this.gotoAndStop(1);
			}
		}
		else {
			// if there is at least one unit selected...
			if (unit_selected) {
				// if the mouse is over this unit and this is an unselected unit...
				if (this.hitTest(_root._xmouse, _root._ymouse, true) and this._currentframe == 1) {
					// mark the unit as destination unit
					this.gotoAndStop(3);
				}
				// if the mouse is not over this unit and this unit is marked as destination unit... 
				if (!this.hitTest(_root._xmouse, _root._ymouse, true) and this._currentframe == 3) {
					// mark the unit as unselected unit
					this.gotoAndStop(1);
				}
			}
		}
	};
	// start with unselected unit
	nano.gotoAndStop(1);
}
// creation of a movieclip where I will draw the square made by mouse dragging
_root.createEmptyMovieClip("selmovie",_root.getNextHighestDepth());
// creation of a movieclip where I will draw lines from units
_root.createEmptyMovieClip("unitlines",_root.getNextHighestDepth());
// function to be executed every time I press the mouse
_root.onMouseDown = function() {
	// saving mouse coordinates
	click_x = _root._xmouse;
	click_y = _root._ymouse;
	// I clicked
	clicked = true;
};
// function to be executed every time I move the mouse
_root.onMouseMove = function() {
	// if I clicked...
	if (clicked) {
		// I am dragging
		dragging = true;
		// saving acutal x and y mouse positions
		posx = _root._xmouse;
		posy = _root._ymouse;
		// clearing the movieclip I am about to draw on
		selmovie.clear();
		// setting the line style of the movieclip
		selmovie.lineStyle(2,0x000000,50);
		// setting the filling of the movieclip
		selmovie.beginFill(0xff0000,30);
		// drawing a square connecting the point I first clicked on and the point I am currently on
		selmovie.moveTo(click_x,click_y);
		selmovie.lineTo(posx,click_y);
		selmovie.lineTo(posx,posy);
		selmovie.lineTo(click_x,posy);
		selmovie.lineTo(click_x,click_y);
		// at this time the square is filled, and you can omit next line
		selmovie.endFill();
 
	}
};
// function to be executed every time I release the mouse
_root.onMouseUp = function() {
	// clearing the drag square
	selmovie.clear();
	// saving mouse position
	xmouse = _root._xmouse;
	ymouse = _root._ymouse;
	// if I am not dragging...
	if (!dragging) {
		// scanning for all units
		for (x=1; x<=10; x++) {
			// determining distance between the units and the mouse
			dist_x = _root["sphere_"+x]._x-xmouse;
			dist_y = _root["sphere_"+x]._y-ymouse;
			distance = Math.floor(Math.sqrt(dist_x*dist_x+dist_y*dist_y));
			// if the distance is less than unit's radius...
			if (distance<_root["sphere_"+x]._width/2) {
				// mark the unit as selected
				_root["sphere_"+x].gotoAndStop(2);
			}
			else {
				// else mark the unit as unselected
				_root["sphere_"+x].gotoAndStop(1);
			}
		}
	}
	// I am not clicking             
	clicked = false;
	// I am not dragging
	dragging = false;
};
_root.onEnterFrame = function() {
	// no units selected at the moment...
	unit_selected = false;
	// clearing the mc
	unitlines.clear();
	// if I am not dragging the mouse to select multiple units...
	if (!dragging) {
		// setting the line style
		unitlines.lineStyle(1,0x888888,100);
		// scanning through all units
		for (x=1; x<=10; x++) {
			// if the unit is selected
			if (_root["sphere_"+x]._currentframe == 2) {
				// drawing a line from the centre of the unit to mouse position
				unitlines.moveTo(_root["sphere_"+x]._x,_root["sphere_"+x]._y);
				unitlines.lineTo(_root._xmouse,_root._ymouse);
				// at least a unit was selected
				unit_selected = true;
			}
		}
	}
};

And this is the result

Download the source code and think about enemy’s AI… this will be the hardest part

Rate this post: 1 Star2 Stars3 Stars4 Stars5 Stars (10 votes, average: 4.50 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 5 comments

  1. Questo

    on August 9, 2008 at 10:17 pm

    Nice as always it looks almost like the real game

    It seems there are bots on triquitips Thay are posting things like Powere level your character at blahblahblah.com! or Get all your virtual gold at blahblahblah.com today!(just out of curiosity why is triqui on all your things)

  2. User links about "radius" on iLinkShare

    on August 18, 2008 at 11:30 pm

    [...] | user-saved public links | iLinkShare 4 votesCreate a Flash Game like Nano War – step 2>> saved by Flaco1408 1 days [...]

  3. slain4ever

    on January 7, 2009 at 12:30 pm

    i think emanuele feronato IS triqui

  4. Eliott Robson

    on March 28, 2009 at 5:20 pm

    Hey Emanuele NICE! I was just wondering if you could help me implement this with my game i am making? Contact me at my e-mail address and i’ll post more information. It’s a top down zombie survival!

  5. anon

    on December 22, 2010 at 1:30 pm

    hi, what sort of code would i use to handle unit numbers and enemy AI, i am relatively new to scripting and don’t have a clue :)