FAQ: Как сделать Простой Инвентарь

Привет, народ :) Решил сделать рубрику ответов на вопросы. Буду я её вести или нет – понятия не имею :D  Но за последнее время скопилось достаточно флешек, которые я делал как ответ на вопрос, а учитывая, что некоторые вопросы повторяются, решил некоторые примеры выложить. Это будет полезно. Некоторые вещи новые. А то и шедевральные :D

Итак, сокращенный вопрос от Vladyslaw: “Как сделать инвентарь, в который собираются предметы и используются оттуда”. Учитывая начальные пожелания, и то, что человек сам не знает сразу чего он хочет… И, наверняка, сверху появятся вопросы, а как сделать вот то и это, что повлечёт практически полную переработку кода, чем я заниматься не буду, так что, выкладываю то, что сделал. Это не самый оптимизированный код, но самый короткий :)

Ниже ФЛЕШКА :) Можно нажимать на предметы на сцене, и в панели инвентаря внизу.

Исходник: yadi.sk/d/LCM3bB-2egprP (26 Кб)

Сначала делаем панель инвентаря. Выглядит она так:
panel_inventar

Это клип panel. Внутри него 7 клипов-квадратов box (один и тот же клип), с названиями box1, box2, box3, box4, box5, box6, box7.
Внутри мувика box находится текстовое поле kolvo и кадры с разными названиями и объектами.
1 кадр  пустой – название “zero”
2 кадр с кругом – название “krug”
3 – “kvadrat”
4 – “treug”
5 – “bublik”
6 – “smile”

inventar_box

С панелью всё. Далее создаём клипы предметов, которые будем добавлять на сцену. И экспортируем их для экшенскрипт и называем krug_mc, kvadrat_mc и т.д.

inventar_pref

А теперь собстнно код Action Script 3.0 (учитывая пожелания, чтобы добавлялись объекты их указывалось их количество и возможность использовать предметы из инвентаря) :

Хранение информации об предметах реализуем с помощью двух массивов (в данном случае это удобнее, чем двухмерные массивы или объекты):

• Далее делаем функцию добавления предметов на сцену из библиотеки с изменяемым параметром ob с помощью легендарной функции getDefinitionByName :D Вы спросите: “а что в ней такого?” А то, что она может из разных названий переменных добавлять разные классы объектов из библиотеки!!! На американском форуме достал такую инфу :) Очень полезная вещь. Сокращает код раз в 5-10. Не знаю, есть ли такое в Колине Муке, но да неважно xD На русских форумах тоже откопал, но уже когда писал этот пост.

Теперь расскажу как она работает. К примеру, мы вызываем функцию с параметром ”krug”, т.е. делаем addObjects(“krug”); Что у нас будет происходить :

Как вы поняли, шедевральная :) тут вот эта комбинация:

• Дальше добавляем наши объекты на сцену, тут всё просто:

• Дальше мы описываем функцию для нажатия на любой предмет на сцене, будь то круги, квадраты и т.д.

Если вы смотрели уроки по столкновениям окружностей или косынку, тут должно быть всё понятно, тем более каждая строка с комментарием. Вкратце, принцип такой: мы определяем с помощью curretTarget клип, который вызвал эту функцию. По его названию (а это “krug”, “kvadrat” и т.д.) мы определяем индекс элемента массива predmet с таким же содержанием.

Далее мы проходим циклом по всем ячейкам инвентаря и ищем, есть ли там уже такой же предмет. При этом запоминаем номер первой попавшейся пустой ячейки в переменную freeplace. Если название активного кадра ячейки такое же, как и предмет вызвавший функцию, то там такой же предмет и мы “кладём” его в ячейку. При этом переменную panel.put делаем true. Типа всё, мы положили предмет.

Если же не было таких же предметов, то смотрим были ли свободные места (а самое первое свободное место мы сохранили в переменной freeplace). Если свободное место было, то “пихаем” предмет туда. При этом переменную panel.put делаем true. Типа всё, мы положили предмет в пустую ячейку.

Ну, а если не положили предмет и пустых мест нет, то просто добавляем предмет в массив nomer (увеличиваем количество этих предметов на 1 предмет). Если мы потратим предметы, те чтобы ли и подберем, такой которому не хватала места, то в инвентарь добавиться как этот предмет так и все такие же каким не хватило места. :) Проверить это можно если в функции moveInPanel изменить цикл от 1 до 3 вместо 7 for (var n:uint = 1; n<=3; n++) {, подразумеваем что в инвентаре 3 ячейки.

Можно этого и не делать. Тут зависит от принципа  игры. Возможно предмет будет в общем инвентаре, а не в панели, как это делается в большинстве игр типа ММОРПГ. Если же надо, чтобы нельзя было поднять предмет, если нет места, то строки:

нужно вставить в конце условия if ((box.currentFrameLabel == mc.name)) { и в конце условия if (!panel.put && freeplace > 0) {, т.е. мы будем удалять функцию и предмет, только если его положили в пустую ячейку или в ячейку с таким же предметом. Как-то так :)

На этом этапе реализован функционал добавления предметов в инвентарь.

• Дальше нужно научить программу использовать эти предметы. Для этого каждой ячейке делаем обработчик события нажатия кнопки мыши

А дальше расписываем функцию использования предмета из ячейки инвентаря. Принцип такой: мы по названию активного кадра ячейки определяем, что за предмет там лежит. Если кадр называется “krug”, то там круг, мы ищем индекс элемента с содержимым “krug” в массиве predmet и по этому номеру в массиве nomer смотрим сколько этих кругов в ячейке инвентаря. А от этого уже пляшем. Если больше 1 предмета, то просто используем его и уменьшаем количество. Если 1 предмет, то используем и меняем ячейку в пустое положение.

Вот и всё. Благодаря var cl:Class = getDefinitionByName( “text”) as Class; не пришлось писать функции для всех добавляемых объектов. :) Шикарная вещь :)

Исходник: yadi.sk/d/LCM3bB-2egprP (26 Кб)
Код ActionScript 3.0 из урока:

Этот же самый код без комментариев, в нём всего всего 90 строк:

А тут не будет обычной фразы  ”Всё подробно рассказано в видео” :) Т.к. не хочу тратить время ещё и на видео. Если будут какие-либо вопросы, пишите в комментариях. Думаю, данный ответ-урок по созданию инветаря в action script 3.0 в программе adobe flash  будет полезен хоть кому-нибудь :D

p.s. На приложение ушло часа 4, а на публикацию ещё часа 4. Однако…. Исходя из этого  ”рубрика ответов на вопросы. Буду я её вести или нет – понятия не имею :D

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

    Мастерски!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  2. Sergey

    Евгений, подскажи как можно реализовать ходьбу персонажа за щелчком мыши(типа как в игре Диабло или Вар Крафт). Нажал на место на сцене, и туда отправился наш герой. Буду весьма признателен!!!

  3. Merklar

    УУУУУ! Новый урок! Ты решил продолжить? Это было бы просто здорово)

    • admin

      Я ещё не знаю :) Но уж точно видео делать не буду :) При всей моей любви к монтажу и съемке клипов :)

  4. Artas

    Спасибо за уроки,очень помогли! Возник такой вопрос,в дополнение к вопросу Sergey выше – Как сделать чтоб объект при движении не выходил за определенные границы, допустим стены? Не могли бы вы показать на примере 1 линии?

    • admin

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

      • Artas

        Спасибо,но я вроде как и делаю так как в уроках,но все равно не получается.Если время будет,сделайте пример на 1 стену,буду очень благодарен.

  5. Вячеслав

    Здравствуйте, Евгений! Как при каждом клике по кнопке, генерировать помимо цифр, фраз, еще и мувиклипы? Для самого низкого шанса (Best) генерировать airStrike, для Medium – artillery, и для Shit – nailGrenade. Вот исходник: https://yadi.sk/d/dRTWd3orexLEH

  6. Вячеслав

    Спасибо огромное! И еще вопрос, как сделать так, чтобы при каждой новой генерации предмета, предыдущий исчезал?

    • admin

      Для этого, при добавлении нового объекта, пихаешь его в массив (как в примере с инвентарём), а тот, что был в массиве (если он там был) – удаляешь.

      • Вячеслав

        А можно как-то проще реализовать удаление предмета?

        • admin

          можно сложнее :) каждому добавляемому клипу задаёшь имя. параметр name. а когда добавляешь новый, удаляешь объект по этому имени с помощью getChildByName. Такой принцип реализован в косынке.

          • Вячеслав

            Всё еще не очень понятно )) Можете показать на моем исходнике? https://yadi.sk/d/szRRv9Nxf3w6Y

        • admin

          https://yadi.sk/d/-LzXiJs1f494f
          Дальше давай сам :) у тебя детские вопросы совсем. посмотри уроки 1-16, 28-33 и пинг-понг. :) должно помочь :)

  7. Вячеслав

    Огромное спасибо!

  8. Вячеслав

    Здравствуйте! Это опять я. Вчера написал вот такой код:

    function craft_respirator_Fuzy(e:MouseEvent)
    {
    var rand:Number = Math.random();
    if(rand >= 0.50)
    {
    var legendrespirator = new best_respirator();
    addChild(legendrespirator);
    legendrespirator.x = 629,95;
    legendrespirator.y = 383,35;
    weapon.push(legendrespirator);
    }
    else if(rand >= 0.5)
    {
    var shitrespirator = new shit_respirator();
    addChild(shitrespirator);
    shitrespirator.x = 634,95;
    shitrespirator.y = 381,35;
    weapon.push(shitrespirator);
    }
    } else {
    trace(‘other thing!’);
    }
    objClose.play();
    fuzy -= 1200;
    fuzy_field.text=fuzy.toString();
    objUpgrade.play();
    }

    Почему мне выбило ошибку “1083: Синтаксическая ошибка: else не ожидается”, если этот же код в другой игре работает идеально и без ошибок?

    • admin

      Всё он правильно выдаёт. Тут даже думать не надо, у тебя перед вторым else 2 фигурные скобки “}”, должна быть одна.

      • Вячеслав

        Убрал фигурную скобку и выдало это: 1084: Синтаксическая ошибка: rightbrace перед end of program.” – как бы отсутствие той скобки, которую я удалил.

        • admin

          Посмотрел повнимательнее. у тебя ещё к той 2 ошибки.
          • одинаковые условия if(rand >= 0.5)
          • запятые в дробных значениях

          • Вячеслав

            Исправил те 2 ошибки, но все равно осталось “1084: Синтаксическая ошибка: rightbrace перед end of program.” :(

        • admin

          Ну пипец :D Сказал наоборот…
          legendrespirator.x = 629,95;
          legendrespirator.y = 383,35;
          shitrespirator.x = 634,95;
          shitrespirator.y = 381,35;
          Точки должны быть тут, а не запятые, как и там… Бессонные ночи на меня нехорошо влияют..
          2 ночи сна из 4 дней…

        • admin

          fuzy_field.text=fuzy.toString();
          интересно зачем это? я бы сделал так
          fuzy_field.text=String(fuzy);

          • Вячеслав

            АААААААА Евгений! Не стоит себя так изматывать :) Изменил код так, как вы посоветовали, но детская ошибка “1084: Синтаксическая ошибка: rightbrace перед end of program.” так и осталась ><

        • admin

          скинь мне файл. :D Мне уже самому интересно где косяк.

          • Вячеслав

            Вот: https://yadi.sk/d/nEtQ8xwqf7ZJU
            И еще вопрос на засыпку: как сделать так, чтобы после покупки противогаза (1 шапка) и инопланетного шлема (2 шапка) активировалась кнопка “собрать”?

  9. admin

    https://yadi.sk/d/VLKoySb1f7cxs
    Исправил ошибки.
    • как сделать так, чтобы после покупки противогаза (1 шапка) и инопланетного шлема (2 шапка) активировалась кнопка “собрать”
    Добавить условие. Изначально кнопка заблокирована (какая-нибудь переменная типа false. А при покупке деталей, становится true и можно собирать. Аналогично меняется вид кнопки. Можно сделать так – на одном месте 1 кнопка, и 1 клип. Клип – неактивная кнопка. КЛИП видно когда нельзя собрать предмет, и невидно кнопку. Когда предмет собрать можно, делаем клип невидимый, а кнопку видимой.
    p.s. код без комментариев, поэтому разбираться лень, хоть и немного вник в суть. Но если в игре будет много предметов, код выйдет запутанный. А может и нет :)
    p.p.s. Если графику рисовал ты, то очень круто!!! :)

    • Вячеслав

      Спасибо большое за помощь! :) Графику я успешно спионерил из игры Вормикс :)

      • admin

        аа:) для тренировки любая графика пойдёт :) главное не продавать такую игру, а то будут проблемы с законом :D

        • Вячеслав

          Хех, это верно ) Кстати, как правильно воспроизводить анимацию из библиотеки при каждом клике по кнопке 1 раз? 1 клик = 1 воспроизведение анимации. А то что-то не могу понять (

          • admin

            Что-то я не совсем понял вопроса :) 1 клик = 1 воспроизведение анимации. А у тебя что? Что должно быть после первого клика? ЧТо будет при втором и далее кликах?

  10. Вячеслав

    Сейчас объясню подробнее. Человек заходит в игру, покупает вещи для крафта, и наконец нажимает на кнопку “собрать”. Мне нужно, чтобы когда он кликнул по кнопке, воспроизводилась анимация “вы прищемили ухо тисками. собрать предмет не удалось”! Я вот тупо не знаю как из библиотеки проигрывать с помощью кода всякие заготовленные анимации при каждом клике по кнопке ( Вот небольшой исходник, чтобы стало чуть понятнее https://yadi.sk/d/iS5zHVvbfFKd5 .
    В библиотеке есть анимации с кодовыми именами noUpgrade, noUpgrade2, noUpgrade3, noUpgrade4, noUpgrade5. Мне бы хоть одну из них научится воспроизводить с помощью кода, а то что-то не доходит до меня :)

    • admin

      Во-первых, ты не добавил эту анимацию на сцену. Ты не можешь с ней ничего делать.
      showAnim.addEventListener(MouseEvent.CLICK, animShow);

      function animShow(e:MouseEvent)
      {
      var anim = new noUpgrade();
      addChild(anim);
      anim.x= stage.width/2;
      anim.y = stage.height/2;
      anim.play();
      }
      Когда анимация проигралась, её надо удалить. Это можно сделать по-разному.

      • Вячеслав

        Например removeChild(anim)?

        • admin

          к примеру да, только нужно удалять в нужный момент.

          • Вячеслав

            спасибо за помощь, намотаю на ус :)

  11. Merklar

    И снова привет, уважаемый Евгений) Опять нужна твоя помощь) Собрал инвентарь для игры на тех же принципах, на которых ты написал свой (сам дашел до них=) + там АС2(( ), но вот оказывается надо было делать инвентарь на подобии как в Диябло, Сталкер. (типа квадратики, итемы имеют еще и габаритные характеристики). И вот тут я застопорился…. Как это реализовать? Точно двумерный массив… А вот как туда помещать разные предметы… В общем, если поможешь – буду благодарен)

    • admin

      Привет :) была у меня задумка сделать сложный инвентарь. Даже массивы сделал, но вот некогда этим мне сейчас заниматься. В общем, принцип таков – в первый массив пихаешь названия элементов, во второй двухмерный пихаешь разные характеристики объекта – тип, урон, хп, сколько таких предметов может быть в инвентаре, как этот предмет можно использовать и т.д. :) можно, конечно, в один массив запихнуть всё… каша получиться :D

  12. artur

    можешь сделать монополию? на видео или исходник кинуть

  13. artur

    добры день, как сделать чтобы при наведении мыши картинка увеличивалась?

    • admin

      scaleX, scaleY

      • artur

        можешь пример привести?

        • admin

          Merklar, 24.03.2015, ответил тебе ниже :)

        • admin

          https://yadi.sk/d/yWNFEslkfUYyT
          Но всё же внесу поправки к Merklar :)
          1 – сначала надо сохранить scalе, который был, потому что в данном примере он рандомный.
          ob.scale = scale;
          2 – в функции addObjects, добавляем ещё 2 обработчика
          ob.addEventListener(MouseEvent.MOUSE_OVER, mOver);
          ob.addEventListener(MouseEvent.MOUSE_OUT, mOut);
          3 – расписываем эти функции. В первой всё, что происходит при наведении мышь на предмет. Во второй, когда убираем мышь с предмета.
          // функция – наводим мышь на предмет
          function mOver (e:MouseEvent) {
          // ссылка на объект
          var mc:MovieClip = e.currentTarget as MovieClip;
          // делаем размер 120% от библиотечного размера
          mc.scaleX = 1.2;
          mc.scaleY = 1.2;
          }
          // функция – убираем мышь с предмета
          function mOut (e:MouseEvent) {
          // ссылка на объект
          var mc:MovieClip = e.currentTarget as MovieClip;
          // возвращаем в исходное состояние – размер, который был на сцене.
          mc.width = mc.scale;
          mc.height = mc.scale;
          }

  14. Merklar

    Привет) Да я с характеристиками то разобрался) Вод долго реализовывал размещение предметов в мешке(сундуке/земле). Типа сколько квадратов занимает, помещается или нет, мешаются ли другие предметы (как в сталкере)). Но в конце победил и вроде как реализовал).
    Уважаемый artur, можно это сделать как кодом, так и на таймлайне.
    1. Вариант:
    ваш_клип.addEventListener(MouseEvent.MOUSE_OVER, название_вашей_функции);

    function название_вашей_функции (e:MouseEvent) {
    while (ващ_клип.scaleX <= 3) {
    ващ_клип.scaleX += 0.1;
    }
    }

    ВРоде так… Писал по памяти, поэтому пробей в поисковике правильность написания обработчика события мыши.

    Вариант 2:
    Создаешь в мувике, который тебе надо увеличить анимацию прям на таймлайне. Потом задаешь метку кадра, с которого начинается анимация (или запоминаешь номер) и в обработчике просто пишешь проигрывать с такого-то кадра

    ваш_клип.addEventListener(MouseEvent.MOUSE_OVER, название_вашей_функции);

    function название_вашей_функции (e:MouseEvent) {
    ващ_клип.gotoAndPlay("название_метки_кадра");
    }

    Есть еще множество вариантов как ты это можешь сделать, но вот тебе 2 как для примера.
    П.С. Понял что не уверен в первом… Возможно там вместо цикла надо было вводить событие ентер_фреим с условием по ограничению увелечения. Евгений, думаю, если что – поправит)

    • admin

      вариант
      while (ващ_клип.scaleX < = 3) {
      ващ_клип.scaleX += 0.1;
      }
      не прокатывает :D пробовал иscaleX += 00000.1. Сначала предмет одного размера секунды 2, а потом резко большой. Только анимацию запускать, либо ентерфрейм.
      И ещё MouseEvent.MOUSE_OUT забыл. :) Сделал ремонт – убери инструменты :D (увеличил – уменьши обратно)

  15. Merklar

    Согласен) Но не просили пример обратного уменьшения) Кстати непонятно, почему цикл не работает( Вроде как должен) Надо бы через фор попробовать, как доберусь до компа с флешем – пробну). Евгений, а ты что нить делал для ФГЛа? Просто интересно глянуть)

    • admin

      по факту цикл работает, но показывает только конечный результат. а чтобы была анимация, надо в MOUSE_OVER добавлять обработчик ентер_фрейм и там двигать, а в MOUSE_OUT удалять этот ентерфрейм :)
      Про фгл. Делаю один интересный проект nelf, но как делаю.. иногда :D
      В основном занимаюсь изучением тем питания, тренировок на массу/сушку, рецепты. Сейчас я на ратационной диете :) Летом сушился ей на 12 кг. Опять надо :) Также изучаю воду. Рублю в state of decay :D Затянула блин :)
      Для фгл самое время делать на самом деле! Доллар вырос, а там платят иностранцы, в долларах, разумеется :) как-то так :) мне бы художника, тогда дело пошло бы раз в 40 быстрее :D
      Скачал плагин для cubase, на котором можно собирать дендишные звуки :) Вот пипец “чёкнутые” ребята, которые писали музыку на денди) жесть ваще)))

  16. Дмитрий

    Здравствуйте, если не ошибаюсь Евгений, простимулируйте нас, ваших читателей, расскажите про опыт работы с фгл!

    • admin

      Привет. Доллар вырос в 2 раза, а на фгл платят в долларах, так что руки-в-руки и фигачь игры! :D У меня нет опыта на фгл, у меня только опыт работы под заказ. Сейчас делаю для фгл. Как будет готово, так сделаю пост об этом.

  17. Merklar

    А вот по факту художников – полностью с тобой согласен. В данный момент лежат четыре законченных игры (в плане механики). А оформить некому( Одну вот вроде нашелся художник, но как то третий месяца, а результата нету(

  18. дмитрий

    Подскажи, как ты вставляешь swf на вордпрессе плагином или кодом, если плагином, то как?

    • admin

      я вставляю флешки и видео одной и той же командой.

      <iframe width=”600″ height=”372″ src=”http://adres.swf” frameborder=”0″></iframe>
      <iframe width=”658″ height=”370″ src=”http://www.youtube.com/ ” allowfullscreen=”" frameborder=”0″></iframe>

      Кстати сказать, пробовал разные плагины, не подошел ни один. Флешку по факту вставляет, но границы меняет только по горизонтали, а по вертикали обрубает, т.е. масштабирует до 200 пикселей или сколько там есть, а больше никак. Пробовал даже поменять код самого вордпресса. Не прокатывает. Помог только iframe :) ) Можно подогнать флешку под любой размер и никакие плагины не нужны :)

      • Дмитрий

        Интересный подход, я тоже столкнулся с проблемой, бился с плагинами и плюнул. Классическим кодом вставляю, а про iframe впервые слышу, надо будет поэкспериментировать. Спасибо

  19. artur

    Добрый день. С друзьями делаем монополию и попали в тупик. как при попадании на купленную клетку владельцу прибавлялись очки, а у соперника они отнималиьс?

    • admin

      Привет. Элементарно: владельцу – прибавить очки (score1 += x) , а у соперника – вычесть (score2 -= x).

  20. Андрей

    Здравствуйте, Евгений!
    В первых строках своего письма спешу сообщить, что с Ваших уроков начал свой путь к познанию Флеша, да и программированию вообще (не считая школьной программы ) ), за кои Вам безмерно благодарен!
    А теперь, собственно, вопрос ).
    Пишу текстовый “симулятор”, предполагается множество кнопок на сцене. Графику решено минимизировать, в связи с чем нарисовал 1 прямоугольник, назвал Buttons и сохранил в библиотеку как кнопку. Внутри Buttons имеется txtButton:TextField.
    При программном создании экземпляров класса, например:

    var btnCashFriend:Buttons = new Buttons();
    addChild(btnCashFriend);
    btnCashFriend.x = 250;
    btnCashFriend.y = 170;

    код работает корректно.
    Однако, при попытке подписать кнопку, присвоив значение текстовому полю, например:

    btnCashFriend.txtButton.text = “Занять денег у друга”;

    выдает ошибку:
    TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект “null”

    Экземпляр btnCashFriend класса Buttons текстовое поле txtButton вроде как наследует, но, почему-то, со значением null.
    Уверен, что есть способ не прописывать каждую кнопку заново. Прошу, подскажите решение.

    • admin

      привет, Андрей :) На здоровье :)
      По вопросу: Это обычное явление для флеша, внутри кнопки ничего нельзя поменять. ПО крайней мере я не знаю как, и в АС2 было точно так же. Я допустим когда-то думал как сделать тогда подсветку для кнопки, Типа навел мышкой и через секунду анимация и подсказка.
      Как решается эта тема – Вместо кнопок используешь клипы. Добавляешь клип на сцену, и пишешь для него обработчики событий – наведение курсора на клип, нажатие на клип, убирание курсора с клипа и чего только душе угодно. Ну, и соответственно, если есть разные кадры в клипе. 1 кадр – основное состояние, когда наводишь мышь на клип – делаешь активным другой кадр, когда нажал – другой, когда отвел мышь с клипа – опять первый. Что хорошего тут, так это можно в клип-кнопку напихать что угодно, анимации, текст, да и вообще можно сделать убиваемую кнопку, типа нажал раз она стала с трещинами, нажал ещё она вообще исчезла. С обычной кнопкой ничего такого не сделаешь. Единственное можно добавить, чтобы курсор при наведении мыши становился в виде руки. По-моему так: название_клипа.useHandCursor = true;
      Вот как-то так :) Забудь про кнопки короче :D Они годны только для кнопок с постоянной графикой (в т.ч. анимацией) и 3 состояниями (навёл, нажал, увёл). Хотя, я не Колин Мук, и всего знать не могу :D

      • Андрей

        А ларчик, значит, просто открывался!
        Поскольку, благодарность моя не может быть исчерпана приветствием в предыдущем письме, обяжу себя сейчас поделиться с первой проданной игры )))
        И, отделное спасибо за скорый ответ! )

  21. Merklar

    ПРивет Евгений) Хотелось бы, чтоб ты рассказал подробно о пуле объектов. Ибо читаю адобовские хелпы – ну очень тяжело идут)

    • admin

      привет, Merklar :) Да. адобовский хелп идиотский :D сам его часто не понимаю толком…
      А что за пул объектов? :D

  22. Merklar

    О_О… Я думал ты знаешь все))) Да типа не создание и удаление объектов (это в последствии памяти много сжирает, да еще и уборщик мусора постоянно работает)), а постоянное использование одних и тех же объектов (таская их из массива типа вектор)). Что то в этом роде. В общем нужная вещь для оптимизации… Это то как я это понял))))

    • Merklar

      Называется “пуллинг”

    • admin

      я не знал как это называется :D Знает всё только Колин Мук xD
      Про “создание и удаление объектов”. А зачем их удалять? (О_о ) Они и используются для того, чтобы с ними ничего не делать! Создаёшь объект, где храниться инфа о клипе, сам клип и все причендалы. Допустим, зомбачок идущий в караул. Все данные храним в объекте. Потом он ушел за пределы экрана и чтобы не жрал память мы тупо удаляем клип с экрана и всё. Объект при этом остаётся – все параметры зомбака. Потом он должен выйти из пределов экрана и чтобы ничего не грузить, просто добавляем картинку в те координаты, что хранятся в объекте с параметрами из объекта. Насчёт перетаскивания объектов по массивам ничего сказать не могу, не практиковал такую вещь :)
      А вообще, лучшая оптимизация – starling xDDD

  23. Merklar

    Хм…. Ну вот например ситуация – в игре типа Товер дефенс на тебя прут толпы врагов))) Ты их уничтожаешь – соответственно удаляешь ентерфреймы на них и их самих…А добавляются они Эддчаилдом… Или я что-то не то делаю?)

    • admin

      Добавляются аддчайлдом само-собой. Но, к примеру, можно сделать объект который будет хранить всю инфу для них. Типа циклом добавляешь толпу и каждому цепляешь параметры из объекта (они ж буду одинаковые). Хотя тут надо отталкиваться от того, какой товер дефенс.
      Потом, не обязательно ж делать ентерфрейм для каждого. Можно сделать один. Я Эти оба варианта делал для дудла чтобы убрать лаги. Работают они почему-то одинаково. И тормоза конечно от самого флеш плеера, а не от кода. Но смысл таков. Когда добавляешь врагов, тупо закидываешь их в какой-то массив. А в единственном ентерфрейме находится цикл по всем врагам, который и движет всех врагов. Удаляются они ремочайлдом и сплайсом из массива. Но я не думаю, что такой вариант даст особую прибавку в производительности. Где-то я читал что о производительности стоит думать когда памяти жрет больше 100 Мб или даже больше. Векторные тормоза убираются растеризацией. В общем как-то так :)
      Если при удалении есть тормоза, можно применять разные хитрости, типа того, что когда убиваем врага – мы не удаляем клип, а делаем невидимым и перемещаем за экран. А когда убивал всех, то удаляем их разом всех. Такая просадка фпс (если она будет будет вообще, будет разовой и между волнами, к примеру).
      Я как-то хотел делать что-то подобное. Но не товер, а платфомер, в котором должны двигаться персонажи. Вот их движуху я думал реализовать через массив координат. Откуда и куда им двигаться. Но пока не делал и может сделаю как-то не так. :)

  24. Merklar

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

  25. Merklar

    Хорошо, новый вопрос) Посоветуй уроки по использованию Старлинга… Ну там как его интегрировать во Флеш Айди. Или он только с Билдерами и Девелоперами? И, на сколько я понял там нет понятия ключевого кадра… что ставит меня в тупик по адресации начала анимации в мувиках. В общем, поделись инфой, помниться ты что то пробовал писать с использованием старлинга

    • admin

      Про старлинг ничего сказать не могу. Единственное, могу посоветовать посмотреть движок Citrus Engine http://citrusengine.com/ в связке со старлингом.:) Сам я не собираюсь изучать старлинг. Мне сейчас стал очень интересен unity3d ;) )) вникал в лицензии вчера. Ещё тут думаю стоит ли осваивать air или нет. (О_о )

  26. Merklar

    Продолжаю тебя мучить) Такая ситуация. Допустим мне нужно, чтоб пуля вылетала из ствола оружия персонажа (вид сверху). Для этого я в мувике пушки добавил еще один прозрачный мувик, просто маленький кружок. И Пытался привязать координаты пули к координатам кружка. Но возникла проблема. Координаты расщитывались не в системе координат рута, а в системе мувика, где был расположен кругляшек. Можно ли как то сделать, чтоб координаты были не локальные, а глобальные? Хм… Как то непонятно я написал)) И вот еще вопрос. Перерисовка клипа поверх другого. Вот например игра ТоверДефенс. Бегут бусурмане, башни их бьют – остаются пятна крови. Часто они бывают выше по глубине, чем враги. Как вариант, я делал циклом проверку на ХитТест с пятном, и если он есть – перерисовывал врага. Можно ли как то сделать это другим путем, более оптимизированным? Потому как постоянное перерисовывание – достаточно грузит комп, если врагов много? Заранее благодарю

    • admin

      На первый вопрос ответ вот: http://xitri.com/2009/03/19/crimsonland3_survival_with_actionscript.html
      Я же в примере со снайпером (О_о флешку сделал, а урок так и не сделал xD ) делал привязку пули через угол поворота+синусы+косинусы https://yadi.sk/d/D-uSbPi6dkQDy . Не помню как решаются глобально-локальные проблемы. Но, как вариант – пересчитай координаты с учетом расположения самого персонажа на сцене.
      На второй вопрос: Добавляй пятна крови сразу через AddChildAt() и пихай их на уровень который будет ниже чем у врагов.)

  27. Merklar

    Типо в виде addChildAt(my_mc) ?

    • admin

      Да ёклмн, хорош лениться :D

      http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#addChildAt()

      addChildAt () метод
      public function addChildAt(child:DisplayObject, index:int):DisplayObject
      Язык версии: ActionScript 3.0
      Версии среды выполнения: AIR 1.0, Flash Player 9, Flash Lite 4
      Добавляет экземпляр дочернего элемента DisplayObject к экземпляру DisplayObjectContainer. Дочерний элемент добавляется к указанной позиции индекса. Индекс 0 представляет собой заднюю (нижнюю) часть списка отображения для объекта DisplayObjectContainer.

      Так, в следующем примере представлено три объекта отображения с метками а, b и c в позициях индекса 0, 1 и 2 соответственно.

      b над c над a

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

      Пример: container.addChildAt(circle2, 0);

    • admin

      отличие addChild от addChildAt в том, что в первом случае мы добавляем объект на самый верх, а во втором мы выбираем сами на какую позицию его припихнуть.Чем выше индекс, тем выше объект в отображении.

  28. Didisa

    Кому нужна помощь в графике для игры обращайтесь…изучаю 3 скрипт(скачал флешь cs3 ) к сожалению пока с трудом… приспособился к корявому “Аллигатору” со своиm искаженным 2 скриптом увы много времени на изучение теперь 3го, а хочется что то создать достойное хотя бы общими усилиями…
    Didisa@bk.ru

    • admin

      Слушай, а у тебя есть примеры твоих графических работ? Хочу посмотреть в какой стиле ты рисуешь и делаешь анимацию. Возможно провернём что-нибудь)

  29. Merklar

    Эх друг) где ты был месяц назад) Почти пол года искал художника) Сейчас уже нашел)

  30. Didisa

    Ладно буду переделывать свои квесты из аллигатора в abob на 3 скрипт…если, где зависну спрошу у Женьки он вообще монстер скриптов. Спасибо админу за уроки красаучег ;)
    если кто будет искать на форуме движение клавиатурой, исходник скрипта танк башня едем стреляем.
    https://yadi.sk/d/A_g-C79mgnhpY

  31. Didisa

    Да и делайте пожалуйста примеры прям на форум, скаченные файлы из диска яндекс выдают ошибку “непредвиденный формат файла” качать кучу версий adob под каждый пример жесть.

  32. Didisa

    Ну вот и вопрос уже !!! пишет не верно из за &lt во всех строчках и выражение &amp&amp
    вот в этой строчке “if (dist < 25 && !placed)”

    //массив хранит список всех противников которые бегают по сцене в данный момент
    var spiders = new Array();

    //добавляет паука на сцены и задаёт для него поведение
    function placeSpider() {
    lev++;
    var d = spider.duplicateMovieClip(“z” + lev, lev);

    //случайным образом выбираем с какой стороны экрана ему появиться
    if (Math.random() < .5) {
    d._x = ground._x + Math.random() * ground._width;
    if (Math.random() < .5) {
    d._y = ground._y – d._height / 2;
    } else {
    d._y = ground._y + ground._height + d._height / 2;
    }
    } else {
    d._y = ground._y + Math.random() * ground._height;
    if (Math.random() < .5) {
    d._x = ground._x – d._width / 2;
    } else {
    d._x = ground._x + ground._width + d._width / 2;
    }
    }

    //первоначальный поворот на цель и определение скорости
    var dx = hero._x – d._x;
    var dy = hero._y – d._y;
    d.a = Math.atan2(dy, dx);
    d._rotation = d.a / Math.PI * 180;
    d.speed = Math.random() * 2 + 2;

    //поведение противника
    d.onEnterFrame = function() {
    //смещается туда куда смотрит
    this._x += this.speed * Math.cos(this.a);
    this._y += this.speed * Math.sin(this.a);

    //постоянно корректирует своё направление движения на главного героя
    var dx = hero._x – this._x;
    var dy = hero._y – this._y;
    this.a = Math.atan2(dy, dx);
    this._rotation = this.a / Math.PI * 180;

    //проверка на достижение цели
    var dist = Math.sqrt(dx * dx + dy * dy);
    if (dist < 25 && !placed) {
    //запустить спецэффект
    placeBlood();
    //запустить клип с сообщением о проигрыше
    //в этом примере не описан, но можете иметь ввиду
    _parent.black.play();
    delete this.onEnterFrame;
    }
    };
    //добавляем новосозданного паука в список
    spiders.push(d);
    }

    //функция удаления паука из списка противников
    //вызывается при попадании пули
    function removeSpider(s) {
    var i = spiders.length;
    while(i–) {
    var curS = spiders[i];
    if(curS == s) {
    //удаляём поведение, т.к. мёртвые уже ничего не решают
    delete curS.onEnterFrame;
    spiders.splice(i, 1);
    }
    }
    }

  33. Didisa

    блин скинул на сайт и увидел…это ж тоже самое что && нда вот лошарик)))

  34. Didisa

    короче установил adob cs6 закатал туда этот скрипт все та же проблема с этими выражениями &lt и &&amp вот весь код:
    //переменная таймера для добавления противников на сцену
    var spiderCount = 0;
    //хранит уровень куда добавляются объекты
    var lev = 0;

    onEnterFrame = function(){
    //функция действия главного героя
    actionHero();

    if(spiderCount++ > 50) {
    spiderCount = 0;
    //добавляем паучка
    placeSpider();
    }
    }
    var step = 3;
    var rotDirSpeed = 6;
    var rotToMouseSpeed = 7;

    function actionHero () {
    if (Key.isDown(Key.LEFT)) {
    hero._rotation -= rotDirSpeed;
    } else if (Key.isDown(Key.RIGHT)) {
    hero._rotation += rotDirSpeed;
    }

    var mDx = _xmouse – hero._x;
    var mDy = _ymouse – hero._y;
    //угол поворота между клипом hero и мышкой в градусах
    var mAngleD = Math.atan2(mDy, mDx) / Math.PI * 180;
    //угол поворота между башней и мышкой в градусах
    var dAngleD = hero._rotation + hero.body._rotation – mAngleD;

    //без этой проверки башня будет неправильно крутиться
    //при переходе границы -180 и +180 градусов
    if (dAngleD > 180) {
    dAngleD = -360 + dAngleD;
    } else if (dAngleD < -180) {
    dAngleD = 360 + dAngleD;
    }
    //поворачиваем башню с нашей скоростью
    if(Math.abs(dAngleD) < rotToMouseSpeed) {
    hero.body._rotation -= dAngleD;
    } else if(dAngleD > 0) {
    hero.body._rotation -= rotToMouseSpeed;
    } else {
    hero.body._rotation += rotToMouseSpeed;
    }
    //проверка на реализм поворота корпуса человека
    if(hero.body._rotation < -90) {
    hero.body._rotation = -90;
    } else if(hero.body._rotation > 90) {
    hero.body._rotation = 90;
    }

    var dirAngle = hero._rotation / 180 * Math.PI;
    if (Key.isDown(Key.UP)) {
    hero.foot.play();
    hero._x += step * Math.cos(dirAngle);
    hero._y += step * Math.sin(dirAngle);
    } else if (Key.isDown(Key.DOWN)) {
    hero.foot.play();
    hero._x -= step * Math.cos(dirAngle);
    hero._y -= step * Math.sin(dirAngle);
    } else {
    hero.foot.stop();
    }

    //стреляем если зажата клавиша мышки
    if(Key.isDown(1)){
    hero.body.play();
    }
    };

    //скрываем эталонный клип, все дубликаты при этом будут видимы
    blood._visible = false;

    //дублирует спецэффект и располагает поверх героя
    placeBlood = function() {
    lev++;
    var d = blood.duplicateMovieClip(“b” + lev, lev + 20000);
    d._x = hero._x;
    d._y = hero._y;
    }
    //скорость полёта пули
    bulletSpeed = 18;

    //функция добавляет пулю на сцену, перемещает к дулу пулемёта,
    //поворачивает по направлению выстрела и прописывает для неё алгоритм движения
    placeBullet = function (tgt) {
    lev++;

    //пересчитываем координаты конца дула в координаты текущего клипа
    var p = {x:tgt._x, y:tgt._y};
    tgt._parent.localToGlobal(p);
    globalToLocal(p);

    //создаём дубликат клипа с пулей, позиционируем и поворачиваем
    var d = bullet.duplicateMovieClip(“b” + lev, lev);
    d._x = p.x;
    d._y = p.y;
    d._rotation = hero._rotation + hero.body._rotation;
    d.a = d._rotation / 180 * Math.PI;

    //алгоритм действий пули
    d.onEnterFrame = function() {
    //смещение
    this._x += bulletSpeed * Math.cos(this.a);
    this._y += bulletSpeed * Math.sin(this.a);

    //проверка на выход за границы сцены
    if (this._x < ground._x – this._width || this._x > ground._x + ground._width + this._width || this._y < ground._y – this._height || this._y > ground._y + ground._height + this._height) {
    this.removeMovieClip();
    }

    //проверка попадания в противников
    //ВНИМАНИЕ: в коде проверяется пересечение клипа текущей пули с ВНУТРЕННИМ клипом hit текущего противника
    var i = spiders.length;
    while (i–) {
    var curS = spiders[i];
    if (curS.hit.hitTest(this)) {
    this.removeMovieClip();
    curS.gotoAndStop(2);
    removeSpider(curS);
    }
    }
    };

    };
    //массив хранит список всех противников которые бегают по сцене в данный момент
    var spiders = new Array();

    //добавляет паука на сцены и задаёт для него поведение
    function placeSpider() {
    lev++;
    var d = spider.duplicateMovieClip(“z” + lev, lev);

    //случайным образом выбираем с какой стороны экрана ему появиться
    if (Math.random() < .5) {
    d._x = ground._x + Math.random() * ground._width;
    if (Math.random() < .5) {
    d._y = ground._y – d._height / 2;
    } else {
    d._y = ground._y + ground._height + d._height / 2;
    }
    } else {
    d._y = ground._y + Math.random() * ground._height;
    if (Math.random() < .5) {
    d._x = ground._x – d._width / 2;
    } else {
    d._x = ground._x + ground._width + d._width / 2;
    }
    }

    //первоначальный поворот на цель и определение скорости
    var dx = hero._x – d._x;
    var dy = hero._y – d._y;
    d.a = Math.atan2(dy, dx);
    d._rotation = d.a / Math.PI * 180;
    d.speed = Math.random() * 2 + 2;

    //поведение противника
    d.onEnterFrame = function() {
    //смещается туда куда смотрит
    this._x += this.speed * Math.cos(this.a);
    this._y += this.speed * Math.sin(this.a);

    //постоянно корректирует своё направление движения на главного героя
    var dx = hero._x – this._x;
    var dy = hero._y – this._y;
    this.a = Math.atan2(dy, dx);
    this._rotation = this.a / Math.PI * 180;

    //проверка на достижение цели
    var dist = Math.sqrt(dx * dx + dy * dy);
    if (dist < 25 && !placed) {
    //запустить спецэффект
    placeBlood();
    //запустить клип с сообщением о проигрыше
    //в этом примере не описан, но можете иметь ввиду
    _parent.black.play();
    delete this.onEnterFrame;
    }
    };
    //добавляем новосозданного паука в список
    spiders.push(d);
    }

    //функция удаления паука из списка противников
    //вызывается при попадании пули
    function removeSpider(s) {
    var i = spiders.length;
    while(i–) {
    var curS = spiders[i];
    if(curS == s) {
    //удаляём поведение, т.к. мёртвые уже ничего не решают
    delete curS.onEnterFrame;
    spiders.splice(i, 1);
    }
    }
    }

  35. Didisa

    был бы рад получить рабочий вариант скрипта…даже переделанный во as2 вообще

  36. Didisa

    все из танка сделал что хотел вот скрипт похож на as2 по этому допетрил;)
    (ездит стреляет пуля враг попал враг исчез надо через Null прописать и чтоб приследовал сделать или тож стрелял, как закончу переделывать квест скину…)
    var step = 1;
    var rotDirSpeed = 2;

    onEnterFrame = function () {
    if (Key.isDown(Key.LEFT)) {
    hero._rotation -= rotDirSpeed;
    } else if (Key.isDown(Key.RIGHT)) {
    hero._rotation += rotDirSpeed;
    }

    var mDx = _xmouse – hero._x;
    var mDy = _ymouse – hero._y;
    var mAngle = Math.atan2(mDy, mDx);
    hero.body._rotation = -hero._rotation + mAngle / Math.PI * 180;
    if(hero.body._rotation = 90) {
    hero.body._rotation = 90;//ограничение поворота вправо
    }

    var dirAngle = hero._rotation / 180 * Math.PI;
    if (Key.isDown(Key.UP)) {
    hero.foot.play();
    hero._x += step * Math.cos(dirAngle);
    hero._y += step * Math.sin(dirAngle);
    } else if (Key.isDown(Key.DOWN)) {
    hero.foot.play();
    hero._x -= step * Math.cos(dirAngle);
    hero._y -= step * Math.sin(dirAngle);
    } else {
    hero.foot.stop();
    }
    };
    onMouseDown = function () {
    hero.body.play();
    bulletSpeed = 18;

    //функция добавляет пулю на сцену, перемещает к дулу пулемёта,
    //поворачивает по направлению выстрела и прописывает для неё алгоритм движения
    placeBullet = function (tgt) {
    lev++;

    //пересчитываем координаты конца дула в координаты текущего клипа
    var p = {x:tgt._x, y:tgt._y};
    tgt._parent.localToGlobal(p);
    globalToLocal(p);

    //создаём дубликат клипа с пулей, позиционируем и поворачиваем
    var d = bullet.duplicateMovieClip(“b” + lev, lev);
    d._x = p.x;
    d._y = p.y;
    d._rotation = hero._rotation + hero.body._rotation;
    d.a = d._rotation / 180 * Math.PI;

    //алгоритм действий пули
    d.onEnterFrame = function() {
    //смещение
    this._x += bulletSpeed * Math.cos(this.a);
    this._y += bulletSpeed * Math.sin(this.a);
    //проверка на выход за границы сцены
    if (this._x > 800 || this._x 600 || this._y < 0) {
    this.removeMovieClip();
    }
    //проверка попадания в противников
    //ВНИМАНИЕ: в коде проверяется пересечение клипа текущей пули с ВНУТРЕННИМ клипом hit текущего противника

    if (spiders.hitTest(this)) {
    this.removeMovieClip();
    spiders.gotoAndStop(2);
    removeSpider(curS);
    }

    }
    }

    };

  37. Илья

    Добрый день. А не могли бы вы сказать на чем вы пишите программы (в смысле среда разработки)? Много ли существует других сред, и почему именно эта программа?

    • admin

      Программы я писал на delphi 7. Игры во Adobe Flash CS6. Сейчас ещё Unity 5 осваиваю. :)
      • Много ли существует других сред. – Много!
      • почему именно эта программа? – Это первая моя программа, в которой я мог рисовать мультики, а потом научился делать игры ещё в 2004 году. Выбор тогда был никакой, и вообще мне повезло найти книгу конкретно по разработке игр во флеше. Ну как повезло, я ходил по библиотекам и пиратским рынкам с дисками и искал инфу по этой теме :) Сейчас флеш не так популярен, как раньше. HTML5 стал игродельным, C#, Java, JavaScript и т.д. Рекомендую для ознакомления – http://gamedevblogs.ru/ Тут увидишь кто на чем пишет, в чем рисует, где продаёт, сколько зарабатывает т.д. и т.п.:)

  38. Didisa

    Начал писать в “Alligator falsh” очень НЕ рекомендую он на основе As 2.0 но многие команды не понимает или прописываются по другому. Если начать с него то очень потом трудно привыкнуть к настоящему языку As2 или As3 в принципе они похожи только As3 поинтересней тем что может все импортировать и крутить как хочет без постоянной прописки объекта к которому хочешь привязать свойства. Вот тебе 2 файла качай читай делай. Adobe Flash Cs3 и учебник As 2 можешь As3 найти но игру и на 2 можно накатать. Особенно стратегию. As 2 учебник закидывай прям на гугл он откроется(даже без подключения интернета)…если не в курсе конечно.

    • Илья

      AS это вроде как язык, его освою без проблем. Вот только не знаю какую среду выбрать, может Adobe Flash Builder? на сайте нашел только Adobe Flash Professional CC, но он похоже платный, интересно у них есть что-то бесплатное?

      • admin

        у Adobe бесплатный только флеш плеер xD Тогда уж выбери Flash Develop. ;) Обычно пользуются им для кода, а рисуют во флеше.

  39. Илья

    спасибо )

  40. Didisa

    не смог закинуть файл с кряком да найди сам все можно найти если не лениться …скачал, получил вирусню мудасню , сделал откат винды все запустил скаченый файл там инструкция причем чем старее версия проги тем лучше кряк

  41. Didisa

    О великий джадай Женя! помоги унукаю ;)
    Вопрос как проще написать скрипт чтобы “сократить частоту возможных выстрелов”
    (Я сделал так отдельный-отдельное преобразование в мувик в нем 2 кадра бесконечно сменные там прописал n++ ну и условие если n100 то F=1 а на главной сцене к выстрелу приписал условие что если клик мыши если F>1 то выстрел…как то бы проще и в главный сразу воткнуть а не из вне доставать)

    • admin

      уменьшить частоту выстрелов через альтернативный таймер. Посмотри урок про таймеры. Это решается через нулевой остаток от деления на число.)

  42. Didisa

    кстати скинул все свои первые потуги по скриптам на сайт если кому интересно спрашивайте скрипт из любого момента скину прописку полную (сделано в аллигаторе на As2 там все скрипты деревянные без затей)
    http://didisa5.wix.com/didisa

  43. Didisa

    ок спасиб мастэр ;)
    сегодня инвент буду делать, корабль затягивает предмет…еще нарисовать надо, думаю попробовать применить инвет вот для какой штуки-разделить корабль на 6 мувиков при попадании в каждый мукик (часть корабля) 1)отображать на чертеже в углу повреждение 2)как инвент накапливать количество попаданий ну и прописать условие тип при 4-5 или скорость снизить или оружие уменьшить количество выстрелов в минуту…

  44. максим

    Я хочу запихать панель инвентаря в контейнер но у меня выдаёт кучу ошибок. надо ведь прописать путь для него и я прописываю но всё равно не получается. как сделать правильно если панель не на главной сцене ?

    • admin

      Не понял в какой контейнер ты хочешь запихать панель. Если ещё в один клип, то нужно поменять все места в коде где используется panel.
      panel.put = false;
      var box:MovieClip = panel["box"+n] as MovieClip;
      и т.д.
      Если же, и предметы не на сцене, то тоже поменять нужно. Вместо addChild(ob); нужно так contayner_s_predmetami.addChild(ob);
      и т.д.

  45. Alex

    Добрый день. Очень познавательный материал. Скажите, как можно связаться с Вами?
    Есть несколько коммерческих предложений, и мы открыты для диалога.

  46. Haraulf

    Добрый день. Чудесный материал, огромное спасибо вам за него. Но вот один вопрос, увы не освещён в нём. Допустим, я хочу сделать так, чтобы ячейки инвентаря располагались не горизонтально, а в два или три ряда по центру экрана, и чтобы он появлялся и исчезал по нажатию клавиши. Вы не могли бы вкратце рассказать о том, как это реализовать?

    • admin

      Добрый вечер, Haraulf :)
      https://yadi.sk/d/LBsvUYupj2sPX
      • Расположить ячейки можно как угодно и сколько угодно штук.
      • Чтобы изменить положение панели в центр экрана, просто передвинь клип panel в центр экрана.
      • Чтобы расположить ячейки в 2,3 ряда (и вообще как угодно, хоть раскидать по сцене), зайди в клип panel и передвинь клипы box1, box2 и т.д. как тебе нужно.

      • Чтобы добавить ещё ячеек, добавь новые боксы box8, box9, box10 и т.д. сколько тебе нужно, главное чтобы они шли по порядку. Так же нужно будет поменять код.
      for (var n:uint = 1; n<=7; n++) {
      Этот цикл есть в 2 местах, нужно изменить цифру 7 (количество мест в инвентаре) на ту, сколько у тебя ячеек.

      • Чтобы “инвентарь появлялся и исчезал по нажатию клавиши”. Добавишь это

      stage.addEventListener(KeyboardEvent.KEY_UP, f_up);
      function f_up (e:KeyboardEvent) {
      if (e.keyCode == 73) {
      if (panel.visible) {
      panel.visible = false
      } else {
      panel.visible = true;
      // делаем его выше всего на сцене
      addChild (panel);
      }
      }
      }

      • Работает код так: Если панель видно – скрываем, если не видно – показываем.
      73 – это код клавиши I(Ш). В помощь по клавиатуре – codeforgames.ru/4-klaviatura

      Так же после удаления любого предмета нужно дописывать строчку stage.focus=stage;
      чтобы фокус сместился на сцену, иначе инвентарь нельзя будет открыть, фокус так и остаётся на клипе. Ещё один бред as3.

      Сейчас делаю инвентарь для квеста, вот это жесть получается вообще xD

      • Haraulf

        Огромное спасибо вам за ответ! С flash и as3 недавно начал знакомство, поэтому многие вещи непонятны пока. Буду потихоньку учиться. :)

  47. Haraulf

    Здравствуйте, admin.
    Прошу прощения за беспокойство, но у меня возникли ещё некоторые вопросы, на которые я никак не могу найти ответ. Вопросы, прямо скажу, отчасти нубские, а отчасти – нет. Буду рад, если вы сможете ответить хотя бы в двух словах.

    1. Какой тип предпочтительнее использовать для отображения элементов интерфейса в играх: Sprite или MovieClip? Или же это зависит от поставленных задач?
    2. Момент с тем же инвентарём: у вас это MovieClip, и заполнение его ячеек сделано на основе смены кадров. А мне также попадался на глаза видеоурок Гэри Розенцвейга (Flash Game University), где он использует для создания инвентаря Sprite, и добавляет предметы как бы “в него” или “на него” (прошу прощения за кривое объяснение). Ваш способ мне кажется более простым, а способ Гэри (лично для меня) более интересен, поэтому у меня возник второй вопрос. У Гэри этот спрайт создаётся как “inventorySprite = new Sprite();”, и на сцене никакого изображения нет. Спрайт “пустой”. А как же тогда создать инвентарь, используя картинку? Логика подсказывает, что с помощью addChild. Но вообще, стоит ли создавать его таким методом? Или же лучше создать для элементов интерфейса отдельный слой на таймлайне, и помещать всю графику сразу в кадр игры?
    3. Допустим, я хочу чтобы визуально инвентарь был в виде круглой коробки (вид “сверху”, мы как бы смотрим внутрь неё), в которую игровые предметы будут укладываться не один за другим в ряд (так у Гэри), а хаотично, будто их бросили туда (один в одной стороне “коробки”, другой – в другом…). Подозреваю, что это реализуется заданием координат x/y для каждого подобранного предмета. Но вот в рамках “круглой коробки”… пока не могу понять как это сделать. Не могли бы хотя бы намекнуть на то, как реализовать такое?
    4. Какой метод предпочтительнее использовать для скрытия различных элементов на экране? У вас в отношении панельки инвентаря это реализовано с помощью panel.visible и addChild, но мне встречалось мнение о том, что использование такого метода не очень хорошо сказывается на ресурсах приложения. Предлагают альтернативу в виде alpha = 0. И как же лучше поступить?

    Извините, пожалуйста, что так много написал. Заранее благодарю за ответы.

    • admin

      Привет.
      1. Зависит от задач. Отличие Sprite от MovieClip в том, что в спрайте 1 кадр.
      2. Я за простоту, хочешь сложностей, делай всё в классах тогда :) Антона Карлова набери http://www.ant-karlov.ru.
      2.1 “У Гэри этот спрайт создаётся как “inventorySprite = new Sprite();”, и на сцене никакого изображения нет. Спрайт “пустой”. А как же тогда создать инвентарь, используя картинку? Логика подсказывает, что с помощью addChild”. Всё правильно. addChild добавляет картинку. Тоже самое если добавлять мувиклип. Разница только в количестве кадров внутри. Мувиклип – сколько хочешь, Спрайт – один.
      2.2 “Но вообще, стоит ли создавать его таким методом?”. Как хочешь. Можно сделать проще, но больше кода, либо меньше кода, большее ООП, но запутаннее, Можно спрайтами, можно мувиклипами, можно классами, можно не классами. Можно помещать графику в кадры, можно загружать в коде. Как тебе нравится и как удобнее в конкретном случае. При наличии рестарта в игре, нужно что-то подгружать, что-то можно добавлять сразу.
      3. Хочешь круглую – нарисуй круглую. Сделай ячейки внутри круглой коробки невидимые к примеру. И сделай код по поиску рандомной ячейки и пихай туда предмет. Пример, если круглый инвентарь с 30 ячейками, типа пчелиные соты и подобран предмет, то ищем рандомное число от 1 до 30 и если ячейка с таким номером свободна, пихаем туда предмет в координаты ячейки, которая может быть невидимой. Если занята ячейка, то ещё раз ищем рандомное число. Естественно проверяем сначала есть ли вообще свободное место. Ну и другие ограничения какие нужны.
      4. Можно использовать и alpha = 0, если под инвентарём ничего нет , что нужно нажимать мышкой. Либо добавить параметр отключающий действия мыши на изображение.
      Невидимые экранные объекты отключаются. Например, если visible=false для экземпляра InteractiveObject, то он не реагирует на щелчки мыши.
      Если alpha=0 для экземпляра InteractiveObject, то он реагирует на щелчки мыши.

      • Haraulf

        Большое спасибо! Многое теперь прояснилось. Очевидные вещи, как выясняется, но вот как-то не получалось своей головой дойти. :)

  48. Demon

    Добрый вечер, admin. Ваши уроки просто откровение какое-то, но все же я пришел вот к такому тупику, как сделать стрельбу, если у меня плавно вращается башня за мышкой. Ну никак не врублюсь как их связать. Не могли бы вы мне помочь туголобому https://drive.google.com/open?id=0B27aH1IKH4DiWEV6MzA2V2g2R3c

  49. Demon

    УУУ спс огромное с танком ето в самую точку я тут уже все до дыр вычитал и не мог дойти var kY = Math.sin(bashnya.rotation*Math.PI/180);
    var kX = Math.cos(bashnya.rotation*Math.PI/180);
    //trace(kY, kX);
    // поворот пули равен повороту башни
    pulya.rotation = bashnya.rotation;

  50. vitalik

    Пытаюсь разобраться с методом getRemote()

    var myRemoteSO:SharedObject = SharedObject.getRemote(“mo”,nc.uri,false);
    myRemoteSO.connect(nc);
    var nc:NetConnection = new NetConnection();
    nc.connect(“rtmfp://p2p.rtmfp.net”, “”);

    Но при запуске кода выдает ошибку:

    TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at new_fla::MainTimeline/frame1()

    ключ я получил на по адресу :
    https://www.adobe.com/cfusion/entitlement/index.cfm?e=cirrus

    Помоги пожалуйста

    • admin

      Не работал с getRemote(), но насколько я понял нужно писать в “rtmfp://p2p.rtmfp.net/KEY” вместо КЕУ свой ключ, полученный у адоб.
      http://www.flasher.ru/forum/showthread.php?t=166131&goto=nextnewest#post1033258
      Так же думаю нужно поменять местами строчки. 3,4 сделать 1,2 чтобы сначала создавался var nc, т.к. он используется в myRemoteSO.
      Большего сказать не могу.

      • vitalik

        (строки я случайно поменял местами когда писал сообщения).Но я понял в чем проблема раньше я писал nc.connect(“rtmfp://p2p.rtmfp.net”, “”);
        а правильно было nc.connect(“rtmfp://p2p.rtmfp.net/”);

        • vitalik

          а правильно было nc.connect(“rtmfp://p2p.rtmfp.net/ключ”);

  51. dev

    Как передавать значения переменных по сети с одного компьютера на другой

  52. Demon

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

    https://drive.google.com/open?id=0B27aH1IKH4DiMmNsNUxqbG5Ba0U

    • admin

      Привет. Нету доступа к файлу. Требуется разрешение

    • admin

      Тупил, тупил, но так и не догоню, косяк тут:
      //ограничение угла поворота Башни
      if(masPuha_heavy_prot_Verh[i-1].rotation > -55 + masHeavy_prot[0].rotation) {
      masPuha_heavy_prot_Verh[i-1].rotation = -55 + masHeavy_prot[0].rotation;
      } else if(masPuha_heavy_prot_Verh[i-1].rotation < -125 + masHeavy_prot[0].rotation) {
      masPuha_heavy_prot_Verh[i-1].rotation = -125 – masHeavy_prot[0].rotation;
      }
      Но вот как его переделать не пойму, видимо нужно для каждой четверти писать свои условия. Т.к. Пушки проскакивают координаты -180 на 180, как и сам корабль, и получается что они дергаются и вообще противоречивые условия получаются.

    • admin

      В общем, тебе нужно расписать уравнения поворотов башен для каждого из условий:
      Корабль.rotation >= 0 && башня.rotation >= 0;
      Корабль.rotation < 0 && башня.rotation < 0;
      Корабль.rotation >= 0 && башня.rotation < 0;
      Корабль.rotation < 0 && башня.rotation >= 0;

  53. Demon

    Так и не разобрался я как в том варианте сделать нормально, сделал как тут http://xitri.com/2009/03/19/crimsonland3_survival_with_actionscript.html
    Все в заранее подготовленом клипе где все пушки руками поставлены тоесть клип в клипе и тогда избавился от глюка с дерганьем башен. Вот, что получилось
    https://drive.google.com/file/d/0B27aH1IKH4DiVFlRV18tZTgtQ0E/view?usp=sharing

    • admin

      делай тогда так. У меня файл вообще выдаёт кучу ошибок. :)

  54. vitalik

    Будут ли новые уроки?И если будут то когда ?Хотелось бы узнать как создать браузерный видеоплеер.

    • admin

      уроки будут, а вот когда сказать сейчас не могу. В ближайшее время не планировал. Уроки по видеоплеерам есть в интернете. Но советую сделать html5 видеоплеер всё таки.

  55. PA3DOP

    Аффтар, нужен совет, точнее даже помощь.
    Короче создаю игру в жанре Top Down Shooter (правда пока что на AS 2.0). В общем все бы ничего, но столкнулся со следующими проблемами:
    - как создать автосохранение (нужно чтобы сохранялось к примеру количество денег даже после закрытия игры)

    - как сделать так, чтобы переменная var moveSpeed, отвечающая за скорость персонажа, увеличивала этот показатель персонажа на главной сцене (чтобы скорость возрастала на том кадре, где находится сам персонаж)

    - как сделать, чтобы количество нажатий на кнопку увеличения характеристики было определенное количество раз (к примеру, в данном случае, увеличение характеристики можно было сделать только 5 раз)

    Вот собственно код для системы магазина:

    var money = 500000;
    item1.t_name = “скорость”;
    item1.t_price = 1000;
    btnn.onPress = function()
    {
    if (money >= item1.t_price)
    {
    money -= item1.t_price;
    var moveSpeed= + 5;
    }
    };

    • admin

      - Как сделать сохранения на as 2.0 не знаю. На 3.0 вот так http://as3coder.blogspot.ru/2010/08/sharedobject.html Вероятно на 2.0 примерно так же. Почитай тут http://www.flasher.ru/forum/showthread.php?t=209271
      - (чтобы скорость возрастала на том кадре, где находится сам персонаж). Не совсем понял структуру сцены, но добавь условие “если активный кадр равен тому, в котором персонаж” if (currentFrame == 5).
      - Добавь счётчик кол-ва нажатий
      var money = 500000;
      var t = 0;
      item1.t_name = “скорость”;
      item1.t_price = 1000;
      btnn.onPress = function()
      {
      if (money >= item1.t_price && t<5)
      {
      money -= item1.t_price;
      var moveSpeed= + 5;
      t += 1;
      }
      };

  56. Денис

    Здравствуйте, очень хочется учиться заниматься во флеше ( Кодировке ) Что посоветуете изучить для более комфортного понимания “кода”. Пару вопросов : Есть локация, на ней должно лежать допустим 3 кнопки, мало того у каждой кнопки должен быть свой FID, возможно ли сделать так, что при наведении на одну, две других исчезает( Со всеми) И еще вопрос, возможно ли назначить клавиши клавиатуры, как условие для нажатия клавиши, к примеру. Есть клавиша Q – 1 кнопка (A), Нажимаешь на клавишу Q и происходить нажатие на кнопку A, и две другие медленно переносятся к кнопке A сливаясь в одну и такой фокус со всеми 3 кнопками. С уважением Денис!

    • admin

      Привет, Денис. Сразу вопрос, почему во флеше? Зачем? Во флеше логичнее рисовать векторную графику/мультики. А кодить уже поздновато для флеша. К 2020 его вообще перестанет адоб поддерживать. Лучше смотри в сторону unity 5, unreal engine.
      По твоему вопросу “возможно ли сделать”. – Возможно. Если бы делал мои уроки, смог бы такое провернуть. Но если не знаешь флеш, лучше не лезь. Очень советую сразу юнити. Он будет проще и удобнее!

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

Ваш 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="">