Уроки Flash: Создаем Metro Siberia Undeground (Часть 2)

Источник: demiart
Emanuele Ferontano (Перевод: Stasan)

Это вторая часть уроков, посвященных созданию игры MSU. Если вы незнакомы с первой частью, то перед продолжением, я настоятельно рекомендую вам ознакомиться с ней.

Эта часть посвящена созданию динамично меняющегося коридора, также мы сделаем так, чтобы клубы дымы увеличивались в размере, удаляясь от корабля.

Что ж давайте начнем.
Создадим новый Movie Clip, в нем изобразим два прямоугольника их координаты по x ставим равными нулю, а по у делаем их равноудаленными от середины Movie Clip"a. См. картинку.

Создаем Metro Siberia Undeground.Часть 2

Называем этот символ tunnel и ставим linkage.

Что ж теперь код, будет объяснен смысл только новых частей кода.

CODE

1. import flash.filters.GlowFilter;
2. var ship_filter:GlowFilter = new GlowFilter(0x00ff00, 0.8, 4, 4, 2, 3, false, false);
3. var smoke_filter:GlowFilter = new GlowFilter(0xff0000, 0.8, 4, 4, 2, 3, false, false);
4. var tunnel_filter:GlowFilter = new GlowFilter(0xffff00, 0.8, 4, 4, 2, 3, false, false);
5. gravity = 0.1;
6. thrust = 0.25;
7. yspeed = 0;
8. xspeed = 5;
9. distance = 0;
10. smoke_interval = 10000;
11. frames_passed = 0;
12. tunnel_height = 150;
13. engines = false;
14. _root.attachMovie("ship", "ship", _root.getNextHighestDepth(), {_x:150, _y:200});
15. _root.createEmptyMovieClip("tunnel_movie", _root.getNextHighestDepth());
16. ship.filters = new Array(ship_filter);
17. ship.onEnterFrame = function() {
18.     if (engines) {
19.         yspeed -= thrust;
20.         smoke_interval -= 0.25;
21.     }
22.     yspeed += gravity;
23.     this._y += yspeed;
24.     angle = Math.atan2(yspeed, xspeed);
25.     this._rotation = angle*180/Math.PI;
26.     frames_passed++;
27.     distance += xspeed;
28.     if (distance>50) {
29.         step = distance-50;
30.         wall = tunnel_movie.attachMovie("tunnel", "tunnel"+tunnel_movie.getNextHighestDepth(), tunnel_movie.getNextHighestDepth(), {_x:525-step, _y:tunnel_height});
31.         wall.filters = new Array(tunnel_filter);
32.         wall.onEnterFrame = function() {
33.             this._x -= xspeed;
34.             if (this._x<-25) {
35.                 this.removeMovieClip();
36.             }
37.         };
38.         tunnel_height += Math.floor(Math.random()*40)-19;
39.         distance = step;
40.     }
41.     if (frames_passed>=smoke_interval) {
42.         sm = _root.attachMovie("smoke", "smoke"+_root.getNextHighestDepth(), _root.getNextHighestDepth(), {_x:this._x-2, _y:this._y});
43.         sm.filters = new Array(smoke_filter);
44.         sm.onEnterFrame = function() {
45.             this._x -= xspeed;
46.             this._width += 0.2;
47.             this._height += 0.2;
48.             this._alpha -= 2;
49.             if (this._alpha<=0) {
50.                 this.removeMovieClip();
51.             }
52.         };
53.         frames_passed = 0;
54.     }
55.     if ((this._y> 400) or tunnel_movie.hitTest(this._x+28*Math.cos(angle), this._y+28*Math.sin(angle), true) or tunnel_movie.hitTest(this._x+8*Math.cos(angle+Math.PI/2), this._y+8*Math.sin(angle+Math.PI/2), true) or tunnel_movie.hitTest(this._x+8*Math.cos(angle-Math.PI/2), this._y+8*Math.sin(angle-Math.PI/2), true)) {
56.         yspeed = 0;
57.         this._y = 200;
58.         tunnel_movie.removeMovieClip();
59.         _root.createEmptyMovieClip("tunnel_movie", _root.getNextHighestDepth());
60.     }
61. };
62. _root.onMouseDown = function() {
63.     engines = true;
64.     smoke_interval = 10;
65. };
66. _root.onMouseUp = function() {
67.     engines = false;
68.     smoke_interval = 100000;
69. };

Давайте разбираться, что к чему.

4. Фильтр для туннеля.
9. Расстояние, пройденное кораблем.
12.Переменная отвечающая за высоту туннеля.
15. Создаем пустой Movie Clip в который будет помещаться туннель.
27. Увеличиваем пройденное расстояние на переменную скорости.
28. Проверяем больше ли дистанция ширины прямоугольника составляющего туннель(у меня это 50).
29. В переменную step я записываю разность между расстоянием и 50, чтобы знать куда вставлять следующий туннель
30. Вставляем Movie Clip туннеля его координаты основаны на step и tunnel_height.
31. Применяем фильтры к туннелю.
32.Функция чтобы уничтожать корабль если он дотронется до туннеля.
33. Вычитаем из координаты стены по x скорость корабля.
34-36.Если туннель ушел за пределы видимости, удаляем его.
38. Устанавливаем новую высоту туннеля, она будет на 20 px больше или меньше предыдущей. Это добавит эффект неоднородной поверхности.
39.Переменной отвечающей за расстояние присваиваем значение step, так как нам необходимо расстояние от последнего вставленного туннеля.
46-47. Увеличиваем размер дыма.
55. Проверка ни упал ли корабль вниз, и не коснулась ли хоть одна из точек, образующих треугольник, стены.
56. Обнуляем скорость по у.
57.Ставим корабль в центре сцены.
58-59. Убираем старый туннель.


[Upload your own video]


Страница сайта http://185.71.96.61
Оригинал находится по адресу http://185.71.96.61/home.asp?artId=17538