Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Бесконечный мир: как реализовать? (http://www.flasher.ru/forum/showthread.php?t=202451)

ZackMercury 17.07.2013 02:19

Бесконечный мир: как реализовать?
 
У меня возникла идея создать оригинальную игру на АС3, но пока что не представляю, как это сделать. Нужно создать бесконечный мир, который будет генерироваться на ходу и удаляться сразу предыдущие генерации карты. Я впервые в геймдеве, проходил несколько туториалов по геймдеву для новичков, все понял, но это был простой Арканоид. Если не подскажите с генерацией карты, хоть подскажите - копать куда?

caseyryan 17.07.2013 07:25

А что подсказывать-то? И так же все ясно. Перемещается персонаж. На основе его текущего положения высчитывается какой кусок мира вокруг него должен показываться. Все остальное убирается. Профит.
Какого-то универсального способа это сделать не существует. Все индивидуально.

ZackMercury 17.07.2013 10:35

Нет, вы не поняли. Карта должна быть случайной и бесконечной.
Я так и не понял насчет создания массивов уровня. Меня особенно интересует этот момент. Ну, допустим, создам я массив уровня из различных цифр, обозначающих бонусы, но вот как превратить этот массив в сетку из мувиклипов - я так и не понял. Сам скопировал, но сколько не сидел, не мог понять работу.

KumoKairo 17.07.2013 11:13

Вы видимо даже не пытались поискать статьи и литературу в интернете, хотя эта проблема решалась очень большое количество раз на всех возможных языках начиная с ассемблера

expl 17.07.2013 12:55

Цитата:

Я так и не понял насчет создания массивов уровня. Меня особенно интересует этот момент. Ну, допустим, создам я массив уровня из различных цифр, обозначающих бонусы, но вот как превратить этот массив в сетку из мувиклипов - я так и не понял. Сам скопировал, но сколько не сидел, не мог понять работу.
Давайте по порядку.
- Если уровень бесконечный - то массив из различных цифр будет бесконечным, а значит невозможным. Как вы его создали...

Один из подходов:
- Делим в уме бесконечное пространство на бесконечное число квадратных секторов (размером примерно с экран)
- Храним в памяти, рисуем и строим только те сектора, которые попадают в экран
- По координатам героя мы можем вычислить индексы сектора, в котором он стоит
- Заводим список _видимых_ секторов, с которыми будем работать, в которых будем искать предметы
- При появлении нового сектора на экране - заполняем его рандомными предметами с момощью _детерминированного_ рандом-генератора, инициализированного индексом сектора (чтобы сколько человек туда не приходил - сектор не менялся), добавляем его в список
- Когда сектор уходит с экрана - убираем его из списка и с экрана предметы сносим.

P.S. Скриншот того что пытаетесь реализовать сделайте - разговор предметнее будет

Rzer 17.07.2013 15:13

К посту выше: используйте генераторы псевдослучайных чисел. Например: http://lab.polygonal.de/?p=162

ZackMercury 17.07.2013 15:43

Цитата:

Сообщение от expl (Сообщение 1141265)
Давайте по порядку.
- Если уровень бесконечный - то массив из различных цифр будет бесконечным, а значит невозможным. Как вы его создали...

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

Например, у одного из туториалов по платформеру такой код:
Код AS3:

//this guy will hold all of the blocks
var blockHolder:Sprite = new Sprite();
//then we add him to stage
addChild(blockHolder);
 
function createLvl():void
{
      //getting the current level we are on
      var lvlArray:Array = MovieClip(root)['lvlArray'+lvlCurrent);
      var lvlColumns:int = Math.ceil(lvlArray.length/16);
      //now we must create the level
      for(var i:int  = 0; i < lvlArray.length; i++)
      {
      //checking if we move onto the next row
      //this checks if i is divisible by # of columns
      if(i / lvlColumns == int(i / lvlColumns))
      {
            row ++
      }
      if(lvlArray[i] == 1)
      {
      //making a new block
      var newBlock:Block = new Block();
      //drawing the block
      newBlock.graphics.beginFill(0xFFFFFF, 1);
      newBlock.graphics.drawRect(0,0,25,25);
      newBlock.x = (i - (row-1)*lvlColumns)*newBlock.width;
      newBlock.y = (row-1)*newBlock.height;
      //then finally adding it to the stage.
      blockHolder.addChild(newBlock);
      } else if (lvlArray[i] == 'MAIN')
      {
      mcMain.x = (i-(row-1)*lvlColumns)*newBlock.width;
      mcMain.y = (row-1)*newBlock.height;
      }
 
      }
//reset the row for another use
row = 0;
//then we center the screen on the main character
//this variable will tell us how far away we have to move everything
//250 is about centered flr mcMain we'll use that number
var mainMove:int = 250-mcMain.x;
//then we move mcMain and the entire level to center on him
mcMain.x += mainMove;
 
}
 
//running the createLvl function
createLvl();

В данном коду mcMain - мувиклип шарика, т.е. главный герой.
Это лишь кусок кода, создающий уровень.
До меня трудно доходит чужой код(не знаю, у всех ли так поначалу было...), поэтому не могу понять, что он делает в деталях.

expl 17.07.2013 19:07

Цитата:

//reset the row for another use
row = 0;
...используют поле вместо переменной накой-то

Насколько я понял - там уровень представлен 1-мерным массивом, в который загнали построчно 2-мерный.
row = i / lvlColumns - получается номер строки
column = i - (row - 1) * lvlColumns - номер столбца
Умножаем на размеры ячейки - получаем координаты
Но я бы мозг свой так не мучал, а просто прошёлся бы 2-мя циклами:
Код AS3:

for (i = 0; i < numCols; i++) {
    for (j = 0; j < numRows; j++) {
        var cellValue:int = lvlArray[j * numCols + i];
        var x:Number = i * cellWidth;
        var y:Number = j * cellHeight;
        if (cellValue == 1) {
            // Добавить мувиклип в координаты x, y
        }
    }
}
Или вообще бы использовал 2-мерный массив

Или вообще бы 2-мерный массив использовал

Babylon 17.07.2013 23:33

Может Openzoom поможет? Сайт сочинской олимпиады вроде использует его. Хотя там все предопределено

ZackMercury 17.07.2013 23:43

Цитата:

Сообщение от expl (Сообщение 1141281)
...используют поле вместо переменной накой-то

Насколько я понял - там уровень представлен 1-мерным массивом, в который загнали построчно 2-мерный.
row = i / lvlColumns - получается номер строки
column = i - (row - 1) * lvlColumns - номер столбца
Умножаем на размеры ячейки - получаем координаты
Но я бы мозг свой так не мучал, а просто прошёлся бы 2-мя циклами:
Код AS3:

for (i = 0; i < numCols; i++) {
    for (j = 0; j < numRows; j++) {
        var cellValue:int = lvlArray[j * numCols + i];
        var x:Number = i * cellWidth;
        var y:Number = j * cellHeight;
        if (cellValue == 1) {
            // Добавить мувиклип в координаты x, y
        }
    }
}
Или вообще бы использовал 2-мерный массив

Или вообще бы 2-мерный массив использовал

Спасибо за упрощенный код. Теперь более понятно.
А теперь вопрос: можно ли, используя класс-генератор псевдослучайных чисел, заполнять массив методом push нужными значениями, под размер сцены и поместить код в функцию, будет ли каждый раз при вызове функции генерировать новый массив, принимая в себя координаты предстоящего куска карты?

Сойдет ли данная конструкция для бесконечного игрового мира?


Часовой пояс GMT +4, время: 02:01.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.