[28]: Одномерные и двухмерные массивы

Приветствую вас, друзья в очередном уроке по основам разработки игр в Action Script 3.0. Сегодня речь пойдёт о массивах. Массивы представляют собой объекты, которые могут хранить различные данные. Такие как текст, числа, объекты, массивы, мувиклипы и т.д. :)

Каждый кусок данных в массиве называется элементом.
Например, массив imena= ["Таня", "Юля", "Аня"] содержит 3 элемента, длина массива равна 3.
Каждый элемент имеет номер. Нумерация начинается с 0.
Для того чтобы обратиться к элементу с именем “Юля”, нужно будет написать imena[1].

Если элементом массива является массив, то получится двухмерный массив.
Например, imena= [["Таня", "Юля"], ["шатенка", "брюнетка"]]
Для того чтобы обратиться к элементу с именем “Юля”, нужно будет написать imena[0][1].
0 – указывает на первый элемент массива, который является массивом.
1 – индекс элемента в этом внутреннем массиве элемента
Так можно создавать различную мерность массива.

Посмотрите видео, в нём я подробно объяснил что-да-как. :)

Исходник: yadi.sk/d/CEEOkussBEpob

Зачем вообще я всё это затронул. Практически в любой игре применяются массивы! Если мир построен из плит (Марио, Тетрис, Пятнашки, Карточные игры, Пакмен и т.д.), обязательно нужны массивы, двухмерные, чтобы хранить инфу о плитах. Если в игре есть много однотипных данных с числами. Нужны массивы. Если надо сделать рандомную выборку цветов для клипа, но не всех цветов мира, а только тех, которые подходят к игре, допустим цветные шарики, , их надо запихнуть в одномерный массив и оттуда выбирать.

Массивы, в принципе, несложная тема. :)
Нужно только будет запомнить следующие команды:

// массив.length – возвращает кол-во элементов массива.
// массив.push() – добавить элемент  в конец массива
// массив.pop()   – удалить последний элемент массива
// массив.unshift() – добавить элемент  в начало массива
// массив.shift() – удалить первый элемент массива

Код ActionScript 3.0 из урока:

Всё подробно рассказано в видео :) Если будут какие-либо вопросы, пишите в комментариях к видео. Надеюсь, данный урок по реализации скорости в action script 3.0 в программе adobe flash, поможет вам в разработке игр. :)

Комментарии
  1. Кирилл

    А как добавлять обьект в массив и выводить его на сцену с помощью массива ,а потом удалить ?

    • admin

      добавление:
      mass.push(object);
      вывод:
      addChild(mass[i]);
      удаление:
      removeChild(mass[i]);
      mass[i] = null;
      удаление ячейки массива, где был объект (если надо):
      mass.splice(i, 1);

  2. Alexandrn

    Женя, привет снова и снова!
    Как удалить ячейку из массива для кадров с рандомным скаканием?

    var frames:Array = ["2","3","4","5","6","7"];
    var rand = Math.floor(Math.random()*(frames.length));
    trace (rand);
    gotoAndPlay(frames[rand]);

    Надо создать ячейки, но как это всё совместить, я закипел (((

    • admin

      привет :) Что-то я не понял…
      “Как удалить ячейку из массива”
      “Надо создать ячейки”
      Удалить командой splice(номер ячейки, количество удаленных ячеек начиная с этой)
      frames.splice(2,1) удалит ячейку с индексом 2 (это “4″).
      А про создание не пойму что ты хочешь.

  3. Alexandrn

    я писал frames.splice(2,i) и естественно не работало и было подумал, что сначала надо создать ячейки через цикл как-то.
    Ну теперь другая загвоздка, удаляет ячейку сразу, я всунул сюда
    var frames:Array = ["2","3","4","5","6","7"];
    var rand = Math.floor(Math.random()*(frames.length));
    trace (rand);
    frames.splice(2,1)
    gotoAndPlay(frames[rand]);
    а как сделать так, чтоб если один раз эта ячейка выпадет, только потом её удалить? Совал в последний кадр анимации от указаной ячейки- не удаляет. Да и вообще после gotoAndPlay уже не удаляет

    • admin

      1. Сначала надо перейти в другой кадр, а потом удалять.
      2. Не нужно переходить в другой кадр на сцене! Ты переходишь и больше твой код из того кадра не в теме. Делай переходы в другой кадр для клипов.
      clip.gotoAndPlay(frames[rand]);
      Если надо для кадров на сцене… то смысл рандомного перехода?…

  4. Alexandrn

    Я делаю клипы в клипах в клипах…и т.д. порой до сотого колена ))).
    Так, управление (код) сделал изначально в самом клипе, где и кадры.
    Попробовал сделать управление из родителя или со сцены этим клипом. Всё так же: либо сразу удаляет ,либо не удаляет вообще. В этом вся и хохма, Жень, я не могу проиграть этот кадр сразу, он должен выпадать (по задумке) рандомно. А уж как выпал- то удалить.
    Можно конечно сделать двойной блок управления: в первом будет этот кадр, а как выпадет- уйдём на второй блок, где уже нет этого кадра. Но тогда в случае, если понадобится удалять два и более кадра, тут уже не два блока потребуется )))

    • admin

      Скинул лучше бы исходник мне :) а то я уже не понимаю, что на самом деле нужно :D Насколько я понимаю, у тебя что-то проигрывается постоянно, типа как крутится барабан в “поле чудес”, а потом рандомно один сектор пропадает, и у нас на 1 сектор барабана меньше, и они так же дальше проигрываются, но уже без него?

  5. Alexandrn

    хорошо, завтра скину исходник )

  6. Alexandrn

    Женя, держи исходник https://yadi.sk/d/7NfunaoReK74d

    • admin

      так, и ты хочешь, чтобы после того, как мы вытянули какой-то рандомный предмет, он больше не вытягивался из ящика, т.к. его там нет?:)
      Тогда вот так: https://yadi.sk/i/cYOQCixyeKKQm

  7. Alexandrn

    Вау, Женя, ты гений ))))
    Так, а теперь вопрос на засыпку ))) Хочу один предмет из ящика достать только один раз, а остальные до бесконечности пусть попадаются снова и снова, а!?

  8. Alexandrn

    Не вопрос!? ))
    А существует ли программное управление рандомом в процентном соотношении? Это, когда можно задать каждой ячейке свой процент вероятности выпада (конечно, кроме нашпиговывания в массив одноимённых ячеек)?
    Спасибо!!!
    Вставлял объекты во флешу в формате png, и при использовании альфа канала для скрытия/открытия их обнаружил неприятность- много шума вокруг объекта появляется (когда канал = 100%), переделал всё на команду visible, теперь не шумит.

    • admin

      и программное управление рандомом тоже делается) Проще всего это сделать с цифрой 100. Как вариант можно сделать так:
      https://yadi.sk/i/uGjDR8KReKtmP
      Всё зависит от того, что мы хотим получить в итоге, и от этого делать рандоминатор:)

      И альфа-канал работает замечательно. Просто надо ставить значение 1, а не 100. там не проценты. chest.alpha = 1; – это 100% chest.alpha = 0.91; – 91% и т.д.

  9. Alexandrn

    С ума сойти, вот это код, где ты это всё взял, сам разобрался, ты знал регулятор рандома, а использовал ли в своих проектах???
    Ой блин, а с каналом альфой я глупо прокололся, ну конечно единица а не 100, как он вообще работал, это что, 10000% получилось )))))))))))))))))))

    • admin

      Придумал из головы :) Это только 1 вариант, я же говорю, надо делать от задачи, если все объекты, которые достаёшь с ящика будут пропадать, я бы уже делал не так.
      Регулятор я не делал наверно нигде. Но в дудле я бы его сделал, т.к. вся игра основана на нём. Даже там несколько рандоминаторов и каждый меняется от количества набранных очков (высоты).
      Я пробовал альфа поставить 10000, разницы от 100 не увидел. Походу там если больше 1, то глюк с границами да и всё.)

  10. Alexandrn

    Спасибо, Женя, ты как всегда горы полезной информации приносишь! ))
    Так, а в файтинге (типа стритфайтера и морталкомбат), думаю для вариаций приёмов у противника тоже должен быть рандоминатор. И вообще, везде, где есть противник комп., который будет от уровня сложности менять свои характеристики в сторону умнения )))))

  11. admin

    Именно так. Будут приёмы уже с другого расстояния, и в зависимости что делаешь ты. Там много всяких фишек :) На то он и искусственный интеллект AI() :)

  12. Alexandrn

    Жень, привет!
    Подскажи, пожалуйста, как записать строчку на команду .visible = false; в мувике на самого себя ( мувик станет невидимым, когда проиграется, в последнем кадре выполнится эта команда).

    • admin

      Привет :) В это сложно поверить, но.. this.visible = false;
      Кстати, я вообще удивлён что this работает в этом идиотском AS3 xD Надо сделать урок по использованию this и root. По крайней мере – мне известные способы применения.

      • Ranex

        я читал про this… ну я понял то, что this не так уж и важна, если конечно использовать разные имена переменных)) А некоторые еще и умудряются передать this функции …blablafunc(this) Это для меня вообще загадка)

        • admin

          Что this, что root в это as3.0 сделаны отвратительно, особенно root. В зависимости от места его применения от может значить вообще разные вещи. В as2.0 было вообще шикарно в этом плане.
          parent идиотский ещё :) Больше всего, конечно, бесит 0.2+0.2 = 0.4, а 0.2+0.2+0.2 = 0.600000000000001, или 0.59999999999999998. Лечится, либо округлялками, либо использованием целых значений (int), а потом делением.

  13. Alexandrn

    Так просто и всё?! А я с пэрентом, как на самоудалении крутил. Вот догадайся тут, ха!
    Благодарю, Женя!!! ))))
    Ппц, я в шоке, три слова и вся команда…

  14. Vladyslaw

    Здравствуйте, Женя! Я тут с проблемой столкнулся. Хочу создать вот такой(http://narkoz-one.spaces.ru/files/?r=main%2Fview&Read=55235104&irb526786=1&sid=::sid::) инвентарь, текстовый. Мне подсказали что сделать это можно через массивы. Я не очень понимаю принцип его работы. Может подскажите, посоветуйте что-нибудь. Буду очень благодарен. Пожалуйста, гляньте, когда время будет. Буду ждать.

    • admin

      Привет. Честно сказать не понял что нужно. В этом примере просто мультфильм с появлением букв. Тут и массивы не нужны. Просто анимация

      • Vladyslaw

        Женя, это просто мультик демонстрирует как всё должно быть. На земле лежит круг, квадрат(предметы), и есть инвентарь и когда мы кликаем мышкой на круг то в инвентаре появляется текст круг(и количество кругов). То есть это просто небольшой пульт набросок как всё должно работать.
        А мне нужно реализовать всё это. Сам инвентарь и предметы в нём, которые подбираются клинком мыши. Подскажите как это реализовать?

        • admin

          Сразу вопросы.
          1. Изначально в инвентаре нет названий, как в примере? или Квадрат – 0, Круг – 0, и Т.д. – 0.
          2. Для чего нужен инвентарь? Он будет как-то использоваться (предметы) или просто коллекционирование предметов?
          3. Важен ли порядок появления категорий? Важно ли где они появляться будут, если они должны появляться, на одном месте или по порядку в столбик?

          • Vladyslaw

            Изначально инвентарь пуст. По сцене раскиданы предметы. И при нажатии на предмет, он появляется в инвентаре в виде текста. При повторном нажатии предмета, который уже находиться в инвентаре в виде текста, он исчезает.

            Новый предмет появляется снизу в списке предметов инвентаря. Если такой предмет в инвентаре уже есть, то новый предмет не появляется отдельно, а добавляется к такому самому предмету, но их количество увеличивается.

            Предметы в инвентаре появляются по порядку в столбик, по мере их добавления. Новый предмет ниже, и т.д.

            Если по можете мне, ОЧЕНЬ буду благодарен.

          • Vladyslaw

            Подскажите хоть что-нибудь.

        • admin

          1. Я не могу понять “И при нажатии на предмет, он появляется в инвентаре в виде текста. При повторном нажатии предмета, который уже находиться в инвентаре в виде текста, он исчезает.”
          При повторном нажатии куда, на текст? Если следовать из мультика, при нажатии на предмет, он исчезает.
          2. “списке предметов инвентаря.”
          Насколько я уловил логику – при нажатии на раскиданные объекты, слева появляется его название с количеством. а внизу рисунок самого предмета в клетке. Типа как панель предметов в любой ММОРПГ.
          Но “При повторном нажатии предмета” не догоню что имеется ввиду.

          • Vladyslaw

            По поводу нанажатия, то да. Вы правы это инвентарь из мморпг. И вся характеристика инвентаря тоже из рпг(я имею ввиду нажатия). У меня такой инвентарь создать не получается, поэтому я подумал, может у вас где-то завалялся такой исходники и вы пожелитесь. Или попробуйте написать такой инвентарь, если есть свободное время. Ну или хотябы расскажите мне как его сделать. Поможете?

          • Vladyslaw

            Короче говоря нужен инвентарь из ММОРПГ, хотябы с тремя предметами.

          • Vladyslaw

            Со старта есть инвентарь пустой. И лежит на сцене три предмета. Каждый предмет нужно добавить в инвентарь клинком мыши.

        • admin

          вот так бы и сказал сразу :D Что нужен инвентарь мморпг. Добавляются предметы в панель и рядом с ним цифра количества :) а то текст слева какой-то… завтра сделаю. а может сегодня. я надеюсь текст не нужен слева при этом?

          • Vladyslaw

            Спасибо большое! Буду ждать!!! Вы меня очень выручите.

            1. “я надеюсь текст не нужен слева при этом?”.
            Делайте так, как посчитаете нужным.

          • Vladyslaw

            И сделайте что б предметы можно было использовать. То есть нажимаешь на предмет в инвентаре, и он использован и пропал и инвентаря

          • admin

            Пожалуйста. http://codeforgames.ru/faq-inventar/ Чтобы использовать как-то предметы, просто нужно заменить все trace на действия какие хочешь.

  15. Ranex

    Как проверять элементы двух массивов на столкновение? Понятно что проще всего проверить хитТестом к примеру.. Я понимаю как проверить один объект с элементами массива, но как это сделать в таком случае..?

    • admin

      Странный вопрос. Также как и один объект с элементами массива. Делаешь цикл по элементам массива, проверяя каждый на столкновение со всеми элементами другого – тоже цикл. Цикл в цикле короче и всё.хит Тестом разумеется.
      Есть более оптимизированный метод, но он сложный и зависит от типа игры. В плиточной игре нужно задавать имена объектах в плитах по координатам, и если объект в этих координатах то проверять столкновения. Либо платформер, Так же определяешь в какое время с чем есть возможность столкнуться, если такой нету, то не надо писать код, что это возможно, перегружая его. Типа если на экране 2 шарика их массива, не надо считать столкновения с 1000 шаров какие в массиве. Если какие то объекты внизу а другие только вверху, то имеет смысл проверять столкновения отдельно, если перс внизу, то не надо проверять столкнется ли он с верхними.

      Про плиточные. Допустим пакмен. Все поле это 20х20 плиток. Рабочая область допустим 400 х 400 пикселей. Зная координаты пакмена, можно узнать в какой он плитке. А дальше делается так: Каждый желтый кружок имеет имя krujok1_2, например. Где 1 номер координата по Х, 2 – координата по У. И так каждый кружок. И вместо того, чтобы проверять хитТестом пакмена на столкновение с каждым шариков, это дофига рассчетов. А если шариков 1000, то вообще будут тормоза. Просто смотришь в каких координатах очутился пакмен и смотришь столкнулся он с шариков в имени которого есть эти координаты. и всё. И не обязательно имя делать такое, можно ячейки двумерного массива сделать с индексами такими.

      Можно изобретать и другие методы)

      • Ranex

        Да вот в том то и дело, я сделал проверку столкновений но проверяется только последний созданный :(
        https://www.dropbox.com/s/zv9xap9srvo8m1t/Test_massiv.zip?dl=0

        • admin

          ууу. Ты в классах фигачишь и ещё без комментариев. Дело даже не в том, что написано, а что ты хотел чтобы при этом происходило. Потому что, раз есть ошибка, значит где-то ты сделал не так, как думал, что будет правильно. Даже не буду разбираться. Не люблю классы сами по себе, они только запутывают. А в чужих разбираться это вообще.. trace тебе в помощь:) Лучшая вещь для поиска ошибок.

          • Ranex

            Соглашусь с тобой по поводу классов, эта та еще заноза :/ Пришлось начать переход на них… То что работало на линии времени не факт что будет работать в классе. А от чтения чужого кода в классах мозг вскипать начинает((
            Когда этот код был у меня в одном файле на линии времени, то работало всё как надо.. А коменты были(без них не куда), удалил что бы компактней код выглядел.

  16. Ranex

    Женя, подскажи пожалуйста… на сцене есть мувик, но часть этого мувика ну не как не должна учувствовать в проверки столкновений, как этого добиться?

    • admin

      В голову приходит такое: разбить мувик на несколько. То есть мувик внутри себя содержит несколько мувиков, одни из которых реагируют, а остальные нет. Опять же нужно будет проверять все.
      Ещё вариант: если есть есть точные координаты того что не реагирует, можно добавить условие координат. Типа часть мувик не реагирует по координате Х больше 50. Опять же зависит от ситуации. Это самые простые варианты.

      • Ranex

        в нутри мувика разделил содержимое на два мувика (Hero содержит ship и fire) в итоге у меня не получается обратиться к ship или к fire через главный мувик Hero…
        Hero.ship…

Добавить комментарий для Alexandrn Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">