Уроки Flash: Metro Siberia Undeground (части 3-4)Источник: demiart Emanuele Ferontano (Перевод: Stasan)
Примечание от переводчика: Автор решил отложить на будущее использование динамичных туннелей, процесс создания которых был описан во второй части урока, эта часть будет посвящена созданию астероидов, резервуаров с горючим и определению пройденного расстояния. Нам надо будет создать три новых символа, первым будет символ rock в нем рисуем квадрат, вторым создаем символ fuel в нем рисуем кружок, это будет наш резервуар с топливом, третьим создаем символ с именем score в нем создаем динамическое текстовое поле в Instance name пишем sc. Всем символам врубаем 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. var fuel_filter:GlowFilter = new GlowFilter(0x00ffff, 0.8, 4, 4, 2, 3, false, false); 6. var rock_filter:GlowFilter = new GlowFilter(0xffffff, 0.8, 4, 4, 2, 3, false, false); 7. var score_filter:GlowFilter = new GlowFilter(0xff00ff, 0.8, 2, 4, 2, 3, false, false); 8. gravity = 0.1; 9. thrust = 0.25; 10. yspeed = 0; 11. xspeed = 5; 12. distance = 0; 13. smoke_interval = 10000; 14. frames_passed = 0; 15. tunnel_height = 150; 16. fuel_freq = 10; 17. gasoline = 500; 18. rock_freq = 50; 19. engines = false; 20. _root.attachMovie("ship", "ship", _root.getNextHighestDepth(), {_x:150, _y:200}); 21. _root.createEmptyMovieClip("fuel_movie", _root.getNextHighestDepth()); 22. _root.createEmptyMovieClip("deadly_movie", _root.getNextHighestDepth()); 23. _root.attachMovie("score", "score", _root.getNextHighestDepth()); 24. ship.filters = new Array(ship_filter); 25. score.filters = new Array(score_filter); 26. ship.onEnterFrame = function() { 27. score.sc.text = "Distance: "+distance+" - "+"Fuel: "+gasoline; 28. if ((gasoline>0)and(engines)) { 29. yspeed -= thrust; 30. smoke_interval -= 0.25; 31. gasoline -= 1; 32. } 33. if (Math.random()*1000<fuel_freq) { 34. fuel = fuel_movie.attachMovie("fuel", "fuel"+fuel_movie.getNextHighestDepth(), fuel_movie.getNextHighestDepth(), {_x:510, _y:Math.random()*400+50}); 35. fuel.filters = new Array(fuel_filter); 36. fuel.onEnterFrame = function() { 37. this._x -= (xspeed*1.2); 38. dist_x = ship._x+28*Math.cos(angle)-this._x; 39. dist_y = ship._y+28*Math.sin(angle)-this._y; 40. dist = Math.sqrt(dist_x*dist_x+dist_y*dist_y); 41. if (dist<10) { 42. gasoline += 100; 43. this.removeMovieClip(); 44. } 45. if (this._x<-10) { 46. this.removeMovieClip(); 47. } 48. }; 49. } 50. if (Math.random()*1000<rock_freq) { 51. rock = deadly_movie.attachMovie("rock", "rock"+deadly_movie.getNextHighestDepth(), deadly_movie.getNextHighestDepth(), {_x:510, _y:Math.random()*400+50, _rotation:Math.random()*360}); 52. rock.filters = new Array(rock_filter); 53. rock.onEnterFrame = function() { 54. this._x -= xspeed; 55. if (this._x<-10) { 56. this.removeMovieClip(); 57. } 58. }; 59. } 60. yspeed += gravity; 61. this._y += yspeed; 62. angle = Math.atan2(yspeed, xspeed); 63. this._rotation = angle*180/Math.PI; 64. frames_passed++; 65. distance += xspeed; 66. if (frames_passed>=smoke_interval) { 67. sm = _root.attachMovie("smoke", "smoke"+_root.getNextHighestDepth(), _root.getNextHighestDepth(), {_x:this._x-2, _y:this._y}); 68. sm.filters = new Array(smoke_filter); 69. sm.onEnterFrame = function() { 70. this._x -= xspeed; 71. this._width += 0.2; 72. this._height += 0.2; 73. this._alpha -= 2; 74. if (this._alpha<=0) { 75. this.removeMovieClip(); 76. } 77. }; 78. frames_passed = 0; 79. } 80. 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)) { 81. yspeed = 0; 82. this._y = 200; 83. gasoline = 500; 84. distance = 0; 85. deadly_movie.removeMovieClip(); 86. fuel_movie.removeMovieClip(); 87. _root.createEmptyMovieClip("fuel_movie", _root.getNextHighestDepth()); 88. _root.createEmptyMovieClip("deadly_movie", _root.getNextHighestDepth()); 89. } 90. }; 91. _root.onMouseDown = function() { 92. engines = true; 93. smoke_interval = 10; 94. }; 95. _root.onMouseUp = function() { 96. engines = false; 97. smoke_interval = 100000; 98. }; Что ж поехали разбираться, что к чему. 5-7. Создание фильтров для новых объектов астероидов, резервуаров с горючим и текстового поля показывающего пройденное расстояние и кол-во горючего в баках. Вот что у нас получилось.
|