Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.07.2013, 02:19
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 1  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
По умолчанию Бесконечный мир: как реализовать?

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

Старый 17.07.2013, 07:25
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
А что подсказывать-то? И так же все ясно. Перемещается персонаж. На основе его текущего положения высчитывается какой кусок мира вокруг него должен показываться. Все остальное убирается. Профит.
Какого-то универсального способа это сделать не существует. Все индивидуально.

Старый 17.07.2013, 10:35
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 3  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Нет, вы не поняли. Карта должна быть случайной и бесконечной.
Я так и не понял насчет создания массивов уровня. Меня особенно интересует этот момент. Ну, допустим, создам я массив уровня из различных цифр, обозначающих бонусы, но вот как превратить этот массив в сетку из мувиклипов - я так и не понял. Сам скопировал, но сколько не сидел, не мог понять работу.

Старый 17.07.2013, 11:13
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 4  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Вы видимо даже не пытались поискать статьи и литературу в интернете, хотя эта проблема решалась очень большое количество раз на всех возможных языках начиная с ассемблера

Старый 17.07.2013, 12:55
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

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

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

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

Старый 17.07.2013, 15:13
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 6  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
К посту выше: используйте генераторы псевдослучайных чисел. Например: http://lab.polygonal.de/?p=162

Старый 17.07.2013, 15:43
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 7  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Сообщение от expl Посмотреть сообщение
Давайте по порядку.
- Если уровень бесконечный - то массив из различных цифр будет бесконечным, а значит невозможным. Как вы его создали...
Я про обучалки по созданию игр. Я долго пытался понять принцип превращения массив в сетку мклипов, но так и не понял.

Например, у одного из туториалов по платформеру такой код:
Код 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 - мувиклип шарика, т.е. главный герой.
Это лишь кусок кода, создающий уровень.
До меня трудно доходит чужой код(не знаю, у всех ли так поначалу было...), поэтому не могу понять, что он делает в деталях.

Старый 17.07.2013, 19:07
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
//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-мерный массив использовал

Старый 17.07.2013, 23:33
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 9  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Может Openzoom поможет? Сайт сочинской олимпиады вроде использует его. Хотя там все предопределено

Старый 17.07.2013, 23:43
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 10  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Сообщение от expl Посмотреть сообщение
...используют поле вместо переменной накой-то

Насколько я понял - там уровень представлен 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, время: 03:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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