Приветствую Вас Гость | RSS

Flash. Обо всем по маленьку

Суббота, 28.12.2024, 14:23
Главная » Статьи » Разработка игр » Тайловая игра

Часть 2
Во второй части движка, я добавляю ограничительные стены

Это делается так же, как в опубликованной 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. }

 

 

скачать исходники


Категория: Тайловая игра | Добавил: anti_k (26.02.2010)
Просмотров: 876 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]