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

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

Перейти вниз

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

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

Это делается так же, как в опубликованной 1 части, просто добавьте стены и столкновения.
Одно замечание… точка привязки героя сейчас находится в центре, а в предыдущем примере она находилась в левом верхнем углу.

ACTIONSCRIPT:
1.tile_size = 20;
2.ground_acceleration = 1;
3.ground_friction = 0.8;
4.ice_acceleration = 0.15;
5.ice_friction = 0.95;
6.treadmill_speed = 2;
7.max_speed = 3;
8.xspeed = 0;
9.level = new Array();
10.level[0] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
11.level[1] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
12.level[2] = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
13.level[3] = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1];
14.level[4] = [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 3, 3, 3, 3, 1, 1, 4, 4, 4, 4, 1, 1];
15.player = [1, 3];
16.function create_level(l) {
17. _root.createEmptyMovieClip("level_container", 1);
18. level_height = l.length;
19. level_width = l[0].length;
20. for (y=0; y<level_height; y++) {
21. for (x=0; x<level_width; x++) {
22. if (l[y][x] != 0) {
23. t = level_container.attachMovie("tile", "t"+y+"_"+x, _root.level_container.getNextHighestDepth(), {_x:x*tile_size, _y:y*tile_size});
24. t.gotoAndStop(l[y][x]);
25. }
26. }
27. }
28. x_pos = player[0]*tile_size+tile_size/2;
29. y_pos = player[1]*tile_size+tile_size/2;
30. level_container.attachMovie("hero", "hero", _root.level_container.getNextHighestDepth(), {_x:x_pos, _y:y_pos});
31.}
32.create_level(level);
33._root.onEnterFrame = function() {
34. ground_under_feet();
35. walking = false;
36. if (Key.isDown(Key.LEFT)) {
37. xspeed -= speed;
38. walking = true;
39. }
40. if (Key.isDown(Key.RIGHT)) {
41. xspeed += speed;
42. walking = true;
43. }
44. if (!walking) {
45. xspeed *= friction;
46. if (Math.abs(xspeed)<0.5) {
47. xspeed = 0;
48. }
49. }
50. if (xspeed>max_speed) {
51. xspeed = max_speed;
52. }
53. if (xspeed<-max_speed) {
54. xspeed = -max_speed;
55. }
56. xspeed += bonus_speed;
57. x_pos += xspeed;
58. check_collisions();
59. level_container.hero._x = x_pos;
60. xspeed -= bonus_speed;
61.};
62.function ground_under_feet() {
63. bonus_speed = 0;
64. y_feet = Math.floor(y_pos/tile_size)+1;
65. x_feet = Math.floor((x_pos+tile_size/2)/tile_size);
66. switch (level[y_feet][x_feet]) {
67. case 1 :
68. over = "ground";
69. speed = ground_acceleration;
70. friction = ground_friction;
71. break;
72. case 2 :
73. over = "ice";
74. speed = ice_acceleration;
75. friction = ice_friction;
76. break;
77. case 3 :
78. over = "treadmill";
79. speed = ground_acceleration;
80. friction = ground_friction;
81. bonus_speed = -treadmill_speed;
82. break;
83. case 4 :
84. over = "treadmill";
85. speed = ground_acceleration;
86. friction = ground_friction;
87. bonus_speed = treadmill_speed;
88. break;
89. }
90.}
91.function check_collisions() {
92. get_edges();
93. // collision to the left
94. if (xspeed<0) {
95. if ((level[top][left] != 0) or (level[bottom][left] != 0)) {
96. x_pos = (left+1)*tile_size+5;
97. xspeed = 0;
98. }
99. }
100. // collision to the right
101. if (xspeed>0) {
102. if ((level[top][right] != 0) or (level[bottom][right] != 0)) {
103. x_pos = (right)*tile_size-5;
104. xspeed = 0;
105. }
106. }
107.}
108.function get_edges() {
109. // right edge
110. right = Math.floor((x_pos+6-1)/tile_size);
111. // left edge
112. left = Math.floor((x_pos-6)/tile_size);
113. // bottom edge
114. bottom = Math.floor((y_pos+9-1)/tile_size);
115. // top edge
116. top = Math.floor((y_pos+9)/tile_size);
117.}
avatar
Admin
Admin

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

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

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

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

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

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