ИГРОДЕЛ
Войдите на сайт или зарегистрируйтесь!!!

Урок 8 Новая тайловая основа движка игры – часть 3

Перейти вниз

Урок 8 Новая тайловая основа движка игры – часть 3

Сообщение автор Admin в Вс Фев 21, 2010 4:03 am

Идея – создать игру типа Collectabubble, только более отшлифованную и с большим количеством деталей.
Первое, о чем нужно поговорить – вращающаяся панель, видеоклип к которому называется bar с классом bar.as
Вот код для bar.as

ACTIONSCRIPT:
1.package {
2. import flash.display.Sprite;
3. import flash.events.Event;
4. public class bar extends Sprite {
5. // variables used in this class
6. private var point_x:int;
7. private var point_y:int;
8. // precision is the number of points I am going to calculate
9. // on hero's circumference
10. private var precision:int = 36;
11. // calculating once for all 2*PI
12. private var twopi: Number = Math.PI*2;
13. // bar rotation speed
14. public var rotspeed = 0.2;
15. // main function
16. public function bar() {
17. // checking for collisions at every frame
18. this.x = 250;
19. this.y = 250;
20. addEventListener(Event.ENTER_FRAME, check_collisions);
21. }
22. private function check_collisions(e:Event) {
23. rotation += rotspeed;
24. for (var i=0; i<precision; i++) {
25. // checking for collisions between the hero and the bar
26. point_x = as3circle(root).circle_hero.x + 25 * Math.cos(twopi*i/precision);
27. point_y = as3circle(root).circle_hero.y - 25 * Math.sin(twopi*i/precision);
28. if (this.hitTestPoint(point_x, point_y, true)) {
29. // in case of collision, reset the hero, subtract 2 points to the score and slow down the bar
30. as3circle(root).circle_hero.init();
31. as3circle(root).add_score(-2);
32. adjust_speed(-0.1);
33. }
34. }
35. }
36. public function adjust_speed(val) {
37. rotspeed+=val;
38. if (rotspeed<0.2) {
39. rotspeed = 0.2;
40. }
41. }
42. }
43.}
Как Вы видите, она аналогична кодировке для coins.as, так как функции их схожи: реагировать на столкновения самой панели и героя.
Единственное отличие вращающейся панели в том, что она…вращается. =)
В строке 14 Вы видите переменную, которая отвечает за скорость вращения, в строке 23 – за обновление.
Как только обнаружено столкновение, я не просто сразу сбрасываю героя (строка 30), но также вычитаю 2 очка со счета (строка 31) и замедляю панель (строка 32).
Как замедлить панель? С помощью добавления функции регулирования скоростей в строках 36-41.
Если панель замедляется, когда герой с ней сталкивается, следовательно, она должна и ускоряться, когда герой подбирает монету.

coins.as
ACTIONSCRIPT:
1.package {
2. import flash.display.Sprite;
3. import flash.events.Event;
4. public class coin extends Sprite {
5. // variables used in this class
6. private var dist_x:int;
7. private var dist_y:int;
8. private var distance:int;
9. // main function
10. public function coin() {
11. // calling place_coin function.
12. // this function randomly places the coin in the field
13. place_coin();
14. // checking for collisions at every frame
15. addEventListener(Event.ENTER_FRAME, check_collisions);
16. }
17. private function check_collisions(e:Event) {
18. // determining the distance between the hero and the coin
19. // notice how do I refer the hero
20. dist_x = x - as3circle(root).circle_hero.x;
21. dist_y = y - as3circle(root).circle_hero.y;
22. distance = dist_x*dist_x+dist_y*dist_y;
23. // 1809 = (hero radius + coin radius)^2
24. // this way I don't have to perform a square root to distance
25. if (distance <1089) {
26. // if the hero picks up a coin, then move it elsewhere, add one point to the score and speed up the bar
27. as3circle(root).add_score(1);
28. as3circle(root).rotating_bar.adjust_speed(0.2);
29. place_coin();
30. }
31. }
32. private function place_coin() {
33. x = Math.floor(Math.random()*400)+50;
34. y = Math.floor(Math.random()*400)+50;
35. }
36. }
37.}
В 28 строке я увеличиваю скорость вращения панели по мере набора монет.
В конце концов, бесполезно описывать, как панель добавляется в главный класс ascircle.as:

ACTIONSCRIPT:
1.package {
2. import flash.display.Sprite;
3. import flash.events.Event;
4. public class as3circle extends Sprite {
5. public var keyboard_input:keys;
6. public var circle_hero = new circle;
7. public var your_score = new score;
8. public var level_wall = new wall;
9. public var rotating_bar = new bar;
10. public var my_score = 0;
11. public var number_of_coins = 4;
12. public function as3circle() {
13. for (var i=1; i<=number_of_coins; i++) {
14. var ingame_coin = new coin;
15. addChild(ingame_coin);
16. }
17. addChild(your_score);
18. addChild(circle_hero);
19. addChild(rotating_bar);
20. keyboard_input = new keys(this);
21. addChild(level_wall);
22. stage.addEventListener(Event.ENTER_FRAME,on_enter_frame);
23. }
24. public function on_enter_frame(event:Event) {
25. if (keyboard_input.is_left()) {
26. circle_hero.apply_force(-1,0);
27. }
28. if (keyboard_input.is_right()) {
29. circle_hero.apply_force(1,0);
30. }
31. if (keyboard_input.is_up()) {
32. circle_hero.apply_force(0,-1);
33. }
34. if (keyboard_input.is_down()) {
35. circle_hero.apply_force(0,1);
36. }
37. }
38. public function add_score(points) {
39. my_score += points;
40. if (my_score<0) {
41. my_score = 0;
42. }
43. your_score.updatescore(my_score);
44. }
45. }
46.}
Остальные классы остаются без изменений.
avatar
Admin
Admin

Сообщения : 92
Очки : 280
Репутация : 36
Дата регистрации : 2010-02-20

Посмотреть профиль http://game-dll.mirbb.net

Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения