Create a Flash game like Metro Siberia Underground – Part 4

Multipart tutorial: available parts 1, 2, 3, 4 ,5

In this 4th part I’ll cover the code written in 3rd part. You should read parts 1 and 2 too, because I will comment only the new code.

For a better understanding, I’ll re-publish the code

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
import flash.filters.GlowFilter;
var ship_filter:GlowFilter = new GlowFilter(0x00ff00, 0.8, 4, 4, 2, 3, false, false);
var smoke_filter:GlowFilter = new GlowFilter(0xff0000, 0.8, 4, 4, 2, 3, false, false);
var tunnel_filter:GlowFilter = new GlowFilter(0xffff00, 0.8, 4, 4, 2, 3, false, false);
var fuel_filter:GlowFilter = new GlowFilter(0x00ffff, 0.8, 4, 4, 2, 3, false, false);
var rock_filter:GlowFilter = new GlowFilter(0xffffff, 0.8, 4, 4, 2, 3, false, false);
var score_filter:GlowFilter = new GlowFilter(0xff00ff, 0.8, 2, 4, 2, 3, false, false);
gravity = 0.1;
thrust = 0.25;
yspeed = 0;
xspeed = 5;
distance = 0;
smoke_interval = 10000;
frames_passed = 0;
tunnel_height = 150;
fuel_freq = 10;
gasoline = 500;
rock_freq = 50;
engines = false;
_root.attachMovie("ship", "ship", _root.getNextHighestDepth(), {_x:150, _y:200});
_root.createEmptyMovieClip("fuel_movie", _root.getNextHighestDepth());
_root.createEmptyMovieClip("deadly_movie", _root.getNextHighestDepth());
_root.attachMovie("score", "score", _root.getNextHighestDepth());
ship.filters = new Array(ship_filter);
score.filters = new Array(score_filter);
ship.onEnterFrame = function() {
    score.sc.text = "Distance: "+distance+" - "+"Fuel: "+gasoline;
    if ((gasoline>0)and(engines)) {
        yspeed -= thrust;
        smoke_interval -= 0.25;
        gasoline -= 1;
    }
    if (Math.random()*1000<fuel_freq) {
        fuel = fuel_movie.attachMovie("fuel", "fuel"+fuel_movie.getNextHighestDepth(), fuel_movie.getNextHighestDepth(), {_x:510, _y:Math.random()*400+50});
        fuel.filters = new Array(fuel_filter);
        fuel.onEnterFrame = function() {
            this._x -= (xspeed*1.2);
            dist_x = ship._x+28*Math.cos(angle)-this._x;
            dist_y = ship._y+28*Math.sin(angle)-this._y;
            dist = Math.sqrt(dist_x*dist_x+dist_y*dist_y);
            if (dist<10) {
                gasoline += 100;
                this.removeMovieClip();
            }
            if (this._x<-10) {
                this.removeMovieClip();
            }
        };
    }
    if (Math.random()*1000<rock_freq) {
        rock = deadly_movie.attachMovie("rock", "rock"+deadly_movie.getNextHighestDepth(), deadly_movie.getNextHighestDepth(), {_x:510, _y:Math.random()*400+50, _rotation:Math.random()*360});
        rock.filters = new Array(rock_filter);
        rock.onEnterFrame = function() {
            this._x -= xspeed;
            if (this._x<-10) {
                this.removeMovieClip();
            }
        };
    }
    yspeed += gravity;
    this._y += yspeed;
    angle = Math.atan2(yspeed, xspeed);
    this._rotation = angle*180/Math.PI;
    frames_passed++;
    distance += xspeed;
    if (frames_passed>=smoke_interval) {
        sm = _root.attachMovie("smoke", "smoke"+_root.getNextHighestDepth(), _root.getNextHighestDepth(), {_x:this._x-2, _y:this._y});
        sm.filters = new Array(smoke_filter);
        sm.onEnterFrame = function() {
            this._x -= xspeed;
            this._width += 0.2;
            this._height += 0.2;
            this._alpha -= 2;
            if (this._alpha<=0) {
                this.removeMovieClip();
            }
        };
        frames_passed = 0;
    }
    if ((this._y>400) or (this._y<0) or deadly_movie.hitTest(this._x+28*Math.cos(angle), this._y+28*Math.sin(angle), true) or deadly_movie.hitTest(this._x+8*Math.cos(angle+Math.PI/2), this._y+8*Math.sin(angle+Math.PI/2), true) or deadly_movie.hitTest(this._x+8*Math.cos(angle-Math.PI/2), this._y+8*Math.sin(angle-Math.PI/2), true)) {
        yspeed = 0;
        this._y = 200;
        gasoline = 500;
        distance = 0;
        deadly_movie.removeMovieClip();
        fuel_movie.removeMovieClip();
        _root.createEmptyMovieClip("fuel_movie", _root.getNextHighestDepth());
        _root.createEmptyMovieClip("deadly_movie", _root.getNextHighestDepth());
    }
};
_root.onMouseDown = function() {
    engines = true;
    smoke_interval = 10;
};
_root.onMouseUp = function() {
    engines = false;
    smoke_interval = 100000;
};

Lines 5-7: New filters used for the rock object (the white square), the fuel object (the blue circle) and the score written at the upper left corner. Since there isn’t any tunnel in this example, you can remove line 4 if you want

Line 15: You can remove this line too if you want

Line 16: A variable that determines the fuel spawn frequency. Higher value means higher freq

Line 17: This is the amount of gasoline in your ship

Line 18: A variable that determines the rock spawn frequency… same thing as the fuel one seen at line 16

Line 21: Creating a new movieclip to host all fuel cans.

Line 22: New movieclip to host all rocks

Line 23: Attaching the score movieclip

Line 25: Applying the filter to score movieclip

Line 27: Showing distance traveled and remaining fuel

Line 28: As you can see in the if statement, now you must have gasoline in order to give thrust to your spaceship

Line 31: Obviously giving thrust will cost you some gasoline…

Line 33: Checking if it’s time to spawn a can of gasoline

Line 34: if true, then attach a fuel movieclip in the game at a random position

Line 35: Applying the filter to fuel movieclip

Line 36: Function to be executed by the fuel tank at every frame

Line 37: Moving the fuel tank according to ship’s speed. Notice that there is a 1.2 multiplier to make the fuel move faster than rocks

Lines 38-40: Calculating the distance from the head of the spaceship and the centre of the fuel tank using trigonometry. More information about trigonometry at Create a flash draw game like Line Rider or others – part 3. I want the gasoline to be collected only with the head of the ship, to give the game some kind of “realism”

Lines 41-44: If the distance is less than 10 (the radius of the gasoline tank), then add 100 units of gasoline and remove the fuel tank

Lines 45-47: If the fuel tank leaves the game to the left, then remove it

Line 50: Checking if it’s time to spawn an asteroid (a rock)

Line 51: if true, then attach a rock movieclip in the game at a random position wiht a random rotation

Line 52: Applying the filter to rock movieclip

Line 53: Function to be executed by the rock at every frame

Lines 54-57: Moving the rock according to ship’s speed. If the rock leaves the game to the left, then remove it

Lines 80-89: Checking if the ship hits the rocks or goes too high or too low… if true, resetting the game

That’s all…

Multipart tutorial: available parts 1, 2, 3, 4 ,5

Rate this post: 1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5.00 out of 5)
Loading ... Loading ...
If you found this post useful, please consider a small donation.
» 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.

13 Responses

  1. Xavi says:

    Wait, so this is all the code for for parts 1-3?
    does this have any different code from part 3?

  2. Ed says:

    Lol what was the point in part 3 then?

  3. Goinginsane says:

    No offense Emanuele. Most of your tutorials have helped me immensly. But this one doesnt seem to meet the par. It is more suited for those of more expeience with flash. What about us? The noobs. What happened to the step by step instructions that helped me out so much on other tutorials. I am sorry if that seemed a bit harsh….I have been working on this game with no avail for several weaks.

  4. Gabriel says:

    I agree with goinginsane (lol?)… Iºll do a game with that…

  5. robby says:

    emanuele will you make a tutorial on how to make a game like coolio niato’s Rhythm Fireworks one of these days? http://www.kongregate.com/games/Coolio_Niato/rhythm-fireworks-2

    I really want to try and make a music game :)thanxs

  6. Colin says:

    sorry if it seems like a bit of a stupid question Emanuele but what does the original movie clip for the distance and the gasoline consist of? would it just be a movie clip of the number 0 or a movie clip of numbers counting which then gets loaded throughout the game?

    Thanks for any help.

  7. Colin says:

    Ed and Xavi this is exactly the same code as part three just with comments underneath explaining what all the code does and how it works as explanations were not included in part three.

  8. The Moth says:

    Hey, Emanuele. Great tut. The only problem I am having is I can’t get the score to show up. I made the score movieclip, but I can’t get it to display.

    Any help would be appreciated.

  9. Zawa says:

    Thanks a lot for this tutorial Emanuele. I love this site so much.

    http://zawa.blogsome.com

  10. lemonsrock says:

    gr8 tutorial,like most others. Except when i tried tower defence part 2 it didnt work plz help me out.
    Thanks :)

Leave a Reply