Пинг-понг в Action Script 3.0

Приветствую вас, люди нашей планеты :) Сегодня будет урок по созданию самой простой игры во флеше – ПИНГ-ПОНГ. Хотя, наверное, не самая простая, проще пятнашки и крестики-нолики. Скажем так, самая простая из тех, в которых что-то движется и чем-то нужно управлять.

Небольшой гайд по созданию игр:
1. Придумываем идею игры.
2. Определяем целевую аудиторию и корректируем игру под неё.
3. Определяемся с графикой, звуком.
4. Отбрасываем всё лишнее.
5. Создаём игру.
6. Тестируем игру.
7. Доделываем.

1. Придумать идею игры проще всего и веселее всего :) Однако, если вы новичок, сильно не загоняйтесь с первыми играми. Чем проще, тем лучше. Я даже читал как наипростейшие игры, типа – сверху что-то падает, внизу что-то это ловит ( и так до бесконечности), продавали ребята до 1000$.  Ну так вот. Придумываете идею игру и расписываете все правила, которые в ней есть. Это желательно сделать, чтобы потом не переделывать код, если на ходу что-то новое будет появляться.

К примеру, для игры пинг-понг, правила такие:

  • игра до 5 очков
  • игра на доске прямоугольной формы 600 х 400
  • 2 игрока. Игрок – слева, комп – справа.
  • шар отбивается от ракеток и от верха и низа поля.
  • когда шар а пределами ракеток, то счет меняется в пользу забившего
  • при ударе о ракетку скорость мяча увеличивается, а скорость ракеток меняется
  • (хотел ещё добавить элементов арканоида, типа увеличивалок шара, досок, прилипалок, огня, но думаю для этой игры они ни к чему. Лучше уж в арканоиде их и сделаю.)

2. Целевая аудитория. Если вы делаете игру для себя, забудьте этот пункт :) А так, если вы делаете игру для детишек, то цвета должны быть приятными, звук весёлый и т.д. Если для старичков, то тоже море крови не надо, если для любителей треша, то чем больше мяса, тем лучше :) Вообщем понимаете что где должно быть.

3. Графика и звук. Опять, для себя что угодно. А так отталкивайтесь от аудитории. Звуки ужаса в тетрисе ни к чему, и весёлые картинки в боевике тоже. Хотя тут можно и попробовать пойти против пристрастий целевой аудитории…

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

5. Создать игру. Тут сначала удобнее собрать в кучу всё что есть по игре: графику, звуки, информацию.  Потом собственно делаете игру и тестируете.

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

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

С ответами на эти вопросы будете знать что делать:)

7. Доделываете в соответствии с ответами на вопросы тестеров, и, конечно же, того человека, который покупает у вас игру. ;)

Теперь собственно по игре ПИНГ-ПОНГ. Смотрите видео. :) Так как код там нарастает не по порядку, а в разным местах, удобнее будет привести весь код целиком, а не описывать каждый пункт по-отдельности, хотя если будет нужно, то распишу некоторые аспекты. В комментариях тогда напишите)).

Исходник: yadi.sk/d/i3jXwmoBHKbyi
Код ActionScript 3.0 из урока:

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

 

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

    Уважаемый автор, спасибо вам за ваши уроки – очень помогли. Теперь вопрос…. Я решил написать на основе вашего пинг-понга игру теннис. Ну там где шариком блоки сшибаешь и т.д. Вопрос… сами кирпичики как делать? через эддзечаилд? или отдельно каждый рисовать и прописывать отражение со всех сторон… Как это можно упростить, иначе слишком много кода получается. Заранее благодарю

    • admin

      Кирпичи, блоги, бонусы можно сделать либо самому и разместить на игровом поле, и при столкновении, допустим, менять кадр на следующий если блок составной, либо удалять, но кирпичи нужно разместить вручную и задавать каждому клипу имя, либо с помощью кода и addchild – ов. Но! Обычно в такой игре много кирпичей, и вариант проверять на столкновение с каждым кирпичом в каждом кадре не очень хорош, игра будет тормозить при количестве кирпичей более 100, а то может и более 50 О_о. Лучше всего было бы сделать плиточный мир. Т.е. разделить игровое поле на n количество плит с названиями blok1_2, blok5_8, ну или как-то так. и задать соответствие координатам. допустим если мяч в координате 450 < х < 550, а 750 < y < 850, то мяч находится в блоке blok5_8 и нужно искать столкновение именно с 1 кирпичем в этом блоке. Т.е. Вместо проверки 100 столкновений, проверяется только 1. Можно плитки сделать через массив или объект.
      А если у вас 20 кирпичей можете попробовать addchild -ами. соединить эту игру и добавлять и удалять кирпичи, как я добавлял шарик в уроке “снег и пули”. как раз пулю можно считать мячом, а шарик кирпичом. Единственное что ещё – нужно будет проверять, скорее всего, 2 столкновения, когда кирпичи близко друг к другу, чтобы определить кто из них был первым при ударе. :) Надеюсь, хоть примерно понятно.

      p.s. А сколько это много кода?:) Я сейчас озвучиваю косынку. там 1200 строк. :)

  2. Merklar

    Спасибо за своевременный ответ. Значит не много) Да я про то, что приходиться на каждый кирпич описывать столкновения с 4 сторон и отражение мяча… Нельзя сделать допустим, 1 раз прописать столкновение (допустим если объект определенного класса тогда ищи столкновение), чтоб на каждый кирпич не прописывать?

    • admin

      ни то что можно, нужно! :) )
      например, напиши функцию с параметром типа function detect (kirpich) { };
      и в коде уже для каждого разного кирпича вызываешь функцию как:
      detect (block1);
      detect (block2);
      detect (block3);
      А если создать переменную типа var block = “block” + i ; то можно и циклом все функции вызвать:) Ну, это один из вариантов :)
      Только вот как писать это в as3, надо проверять. Вероятно, как в as2:
      detect (this[block]);
      но может быть нет :) я думаю об этом будет в следующей, после косынки, игре – дудл джамп. там как раз платформы добавляются и удаляются, и все, с разного рода столкновениями :)

  3. Merklar

    Спасибо за совет. Жду дудл джамп

  4. Merklar

    Вот еще нужен ваш совет. Вот у меня в функции определения столкновения с кирпичами используются координаты кирпича, которые я задаю заранее… Например:
    var bricket = {};
    bricket.clip = bricket1;
    bricket.w = bricket.clip.width;
    bricket.h = bricket.clip.height;
    т.е. используются координаты bricket. Как модно циклом задать чтоб bricket.clip был не только bricket1, но и bricket2, bricket3…

    и еще… Кнопка начала новой игры… Как можно прописать, чтоб после удаления их в пред идущей игре с помощью null и removeChild они появлялись на прежних местах. При чем на всех уровнях(фактически перезапуск приложения). Заранее благодарю

    • admin

      http://yadi.sk/d/0uKPBuNwKoR2D
      это по первому вопросу.
      var kolvo = 5;
      var game = {};
      // game – объект, в котором хранятся другие объекты с кирпичами
      for (var i=1; i< =kolvo; i++) {
      var bricket = “bricket”+i;
      game[bricket] = {};
      // эта строка создаст объекты game.bricket1, game.bricket2 и т.д.
      game[bricket].clip = root[bricket];
      game[bricket].w = game[bricket].clip.width;
      game[bricket].h = game[bricket].clip.height;
      }
      // —– Далее примеры обращения к объектам напрямую и через цикл —–
      // изменение положения по оси Х кирпичу 1
      game.bricket1.clip.x = 400;
      // поворот кирпича 2
      game.bricket2.clip.rotation = 30;
      //цикл для обращения к кирпичам
      function bricket_go() {
      for (var i=1; i<=kolvo; i++) {
      var kirpich = game["bricket"+i] as Object;
      kirpich.clip.x = 500;
      }
      }
      bricket_go();

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

    • admin

      p.s. как создавать клипы циклом с разными именами я не знаю, и нигде ответа найти не смог. в as 2.0 это делалось легко. Но вот создавать циклом объекты с разными именами в объекте я научился :)
      Вообще, вместо разных имен клипов, предлагают засовывать клипы просто в массив… Неудобно это как-то.. :) Мне с объектами неплохо живётся пока :D

  5. Merklar

    Спасибо, попробую обработать :) Если что, буду опять вам надойдать

  6. Merklar

    Чет выдает ошибку( посмотрите, если у вас будет время http://yadi.sk/d/_lrbCnakKpT7w

    • admin

      ошибка 1: нужно у надписи вверху выбрать use default fonts,
      ошибка 2: отскок сделан неправильно, т.к. если убрать удаление объектов, то мяч проваливается в кирпичи! видимо где-то перепутали +ы и -ы.
      ошибка 3: С нижней границей неправильные расчеты, кирпич удаляется когда мяч пролетает снизу доверху, т.е. как бы с обратной стороны.
      ошибка 4: удалять клипы нужно вот так:

      removeChild(bricket.clip);
      bricket.clip = null;
      bricket = null; // можно и без этой строки, обнулять объект необязательно.

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

      ошибка 5: условие должно быть
      if (bricket.clip) { };
      т.е. проверяем если этот клип на сцене. :)

      Вот, http://yadi.sk/d/9S_-S7d1KpgqL
      Дальше сам ;)

  7. Merklar

    Доброго времени суток, уважаемый) Дайте свою консультацию, почему может не срабатывать участок кода:
    bricket.clip.gotoAndPlay(“boom_start”);
    if (bricket.clip.currentFrame==8) {
    removeChild(bricket.clip);
    bricket.clip = null;
    }
    с бум_старт все норм. Но почему то условие с удалением объекта не хочет выполняться. Уже и так, и через карентфраймлейбл пробовал… оно просто не срабатывает. Вбивал trace(1234145125); так оно даж не пишет ничего. Что можеш подсказать?

    • admin

      сложно сказать без исходника… скорее всего клип не бывает в кадре 8, либо ещё что, но нужен исходник.

  8. Merklar

    http://yadi.sk/d/-xPW3ijML5Aks – вот исходник)

    • admin

      http://yadi.sk/d/pK67kARvL5UTi
      1. добавил условие if (bricket.clip) { для проверки столкновения с каждой стороной. Итого: нет ошибки при удалении кирпича, т.к. остальные условия проверялись когда кирпича уже нет, потом, теперь правильно работает столкновение с нижней границей, так же из-за этого.
      2. По поводу if (bricket.clip.currentFrame==8) {.
      Он и не должен работать. Ты 1 раз проверяешь столкновение и просто указываешь чтобы проигрывался клип. А условия выполняется 1 раз в момент столкновения, а не в каждом кадре. Поэтому надо создать enter_frame для убиваемого кирпича и обнулить ссылку на него, чтобы больше не детектировать удары с ним :)
      Я сделал вот так:
      bricket.clip.gotoAndPlay(“boom_start”); bricket.clip.addEventListener(Event.ENTER_FRAME, animate);
      bricket.clip = null;

      А саму функцию расписал так:
      function animate (e:Event) {
      var blok:MovieClip = e.currentTarget as MovieClip;
      if (blok.currentFrameLabel == “boom_stop”) {
      trace(“Последний кадр анимации разрушения кирпича”);
      blok.removeEventListener(Event.ENTER_FRAME, animate);
      removeChild(blok);
      }
      }
      Кстати, если не удалять блок с removeChild(blok);, то получаются прикольные развалины на поле :) ) но тут уж на твой вкус :) А, да, в кирпиче в кадре boom_stop я добавил stop(); :) как-то так )

  9. Merklar

    Спасибо тебе) Где ты учился то так программировать? Я больше по Делфи выступаю)

    • admin

      на здоровье)
      как так?:) учился сам. года эдак с 2005..
      Я и на дельфи тоже могу :) я диплом в универ фигачил на дельфи + openGL.:) при том что, мы его не проходили вообще. научился за 2 недели этому оpengl..
      мне просто по кайфу программить :) тут главное 2 вещи. 1 – понимать логику того, чего ты делаешь, и 2 – программа сама делать и додумывать ничего за тобой не будет. :D я бы даже вынес это на 1 место :) ))

  10. Merklar

    Доброго времени суток. И снова вопрос возник. Попытался сделать кирпичи, которые уничтожаются после 2 попаданий. Возник ряд проблем.. 1. – Все нормально, после 1 попадания кирпич трескается, после 2 уничтожается.. правда только сам клип, но не инфа о нем и мяч по прежнему отражается от пространства;
    2. – Другой вариант, после 1 попадания кирпич трескается и удаляется инфа о нем, но сам клип остается, но мяч пролетает через него… Прям карпоскулярно-волновой дуализм( 3. – вариант… Все норм, все удаляется и все отражается.. правда только с 1 кирпичем этого типа(. Подскажи чего) Или может предложишь более изящное решение, а то я через такие буераки его напрограммировал) вот исходник, посмотри, если время будет http://yadi.sk/d/LnckrYFgLHft8. Функция destroy_two().

  11. Merklar

    А в чем дело было? Почему у меня это не получалось) Спасибо те

    • admin

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

  12. Merklar

    О) Действительно интересное решение) я как то не додумался(

    • admin

      в общем:
      1. ты задавал параметр var step_two = 8; в начале функции, и потом дальше у тебя условие было:
      if (step_two < 8) {
      step_two = 8;
      } else { bricktwo.clip.addEventListener(Event.ENTER_FRAME, animate_two);
      }
      у него никогда не выполняется первая часть, ибо у нас степ всегда 8.
      2. Ты отправляешь клип сразу в 8 кадр bricktwo.clip.gotoAndPlay(step_two);
      поэтому нет анимации с 1 по 8 кадр поломки плиты. Причём в первый раз анимация не проигрывается дальше потому что ты задал команду проиграть с кадра 8, а там написан stop();, а при втором ударе уже есть анимация с 8 кадра, потому что из 8 кадра ты отправил опять в 8 и стоп уже не срабатывает.
      3. Ты обнуляешь ссылки командой if (touch == 2) {
      bricktwo.clip = null;
      }
      touch += 1;
      первая плита удаляется потому что touch сначала 1 потом 2, а при ударе о 2 плиту уже touch = 3 и 4. и т.д. В твоём случае нужно создавать какую-то переменную для каждого клипа, которая будет принимать значения 1 и 2, и от неё исходить что делать. touch здесь не подойдёт. т.к. touch = 2 может быть при 1 ударе по 1 кирпичу и 1 ударе по 2 кирпичу. и получится черти что :)

  13. Merklar

    Доброго времени суток, Евгений. Можете помочь в одном деле… http://savva.morozovsky.com/panoram – вот эта панорама на флеше сделана? И если да, то где можно информацию найти о коде. Заранее благодарю

    • admin

      привет :) не на флеше. Жмёшь ПКМ и видишь – Created with Pano2VR. И ссылка сюда: http://ggnome.com/pano2vr
      Pano2VR – это приложение для преобразования сферической или цилиндрической формы панорамных изображений в Adobe Flash 10, HTML5 (WebGL/iPhone/iPad), или QuickTime VR (QTVR) с такими функциями, как…

  14. Merklar

    Спс те.. А хотяб теоретически реально такое на флеше сделать?

    • admin

      даже практически возможно. т.к. файл может экспортироваться в Adobe Flash 10, значит там есть алгоритм работы на флеше.) тут главное написать правильный код. у них что-то вроде натяжения картинки на сферу, в центре которой мы находимся. только это надо грамотно запрограммировать) формулами по геометрии запастись и формулами натяжения поверхности :)

  15. Merklar

    ооо блин) тяжко)

    • admin

      ну да :) это тебе не обычная круговая панорама :)

  16. Merklar

    Привет) У меня опять к тебе ряд вопросов. Если время будет – посмотри пожалуйста… И так:
    1. Переход на следующий уровень… При переходе остается информация о всех переменных, обьектах и т.д. Нельзя ли, чтоб каждый новый кадр со всеми новыми переменными, за исключением некоторых. Если нельзя, то как это можно еще реализовать;
    2. Кнопка активации стрельбы. Я ввел, что после нажатия она на 20 сек неактивна (свойство enable = false) и она действительно неактивна.. вот только клик на нее все равно запускает обработчик событий.. А, кроме того никак не могу сделать, чтобы пока она неактивна она или меняла цвет/прозрачность/тон… хоть как ни будь менялась в общем( свойство alpha почему то не влияет()
    3. Собственно сама стрельба. Как можно реализовать попадание огнешарика в кирпич? При чем с уничтожением кирпича и присуждением очков. Просто у нас же на каждый кирпич свой цикл и названия там внутренние, поэтому не получается задать условие ХитТестОбджект ( как я сделал с доской и получением бонусов)
    4. Можно ли как то программно перезапустить ролик ( чтобы обнулить все значения, что то типа ресета)
    Заранее благодарю и извиняюсь за такое количество вопросов. Вот исходник http://yadi.sk/d/zu8MU2PbMBZNF

    • admin

      попозже тогда. по 2. Кнопку сделай не кнопкой а мувиклипом. alpha меняется от 0 до 1. ставь не 40 а 0.4, и условия другие. короче вот http://yadi.sk/d/thw0rjAcLKrFL
      1. лучше уровни (все объекты) загнать в один мувиклип. и по завершении уровня менять кадр внутри клипа.
      3. да так же можно сделать отдельный цикл. почему нет? тут главное знать количество плит, какие у тебя есть. для этого удобнее было бы засовывать их в массивы, и цикл делать по длине массива. Сложно звучит, но такой вот наиболее простой выход.
      4. Можно, но загонно, надо всё засунуть в отдельные функции, запомнить все объекты (сохранить инфу о координатах и т.д., чтобы потом можно было их вернуть на место), и по одной функции добавлять. опть же звучит сложно, но выход именно такой. :)

  17. Merklar

    И снова привет) Появилась идея другую игру создать. И сразу же возникли проблемы) в интернете не нашел решения. Вот исходник http://yadi.sk/d/A98y9fLeMTN2g 1. не основное)) как сделать скорость движения объекта к цели равномерной? Потому как по твоим урокам она под конец замедляется. И 2. В функции полета ракеты в цель (прицельчик такой)) проблема. Если задать лететь от ZRK до mouseX(y) он всегда следует за курсором, а не там, где он был нажат( можно как то сделать чтоб он летел к координатам курсора в текущий момент времени) Или же другой вариант… брать не координаты мыши а прицельчика.. Но как тогда сделать чтоб ракета летела именно к своему прицельчику?) + координаты прицела и ракеты лежат в разных функциях… Можно ли как то локальную переменную из одной функции вызвать в другой? Заранее благодарю

    • admin

      привет.) да тут всё просто. ты считаешь скорости в каждом кадре, поэтому они меняются. Нужно их посчитать в момент добавления ракет. Вторая проблема вытекает из первой. ты в каждом кадре считаешь скорость ракеты, которая зависит от позиции мыши. Вот они и следуют за ней. А следуют все, потому что V500R_fly выполняется в каждом кадре для каждой ракеты.
      Итого, надо рассчитать для каждой ракеты СВОЮ скорость В МОМЕНТ добавления ракеты. :)
      http://yadi.sk/d/vaubOIRUMUhUr
      p.s. если хочешь одинаковую скорость ракет, независимо от расстояния полета, то:
      rocket.rotation = Math.atan2(mouseY – rocket.y, mouseX – rocket.x)*180/Math.PI;
      rocket.xmov = speed*Math.cos(rocket.rotation*Math.PI/180);
      rocket.ymov = speed*Math.sin(rocket.rotation*Math.PI/180);

  18. Merklar

    Спасибо)) А по поводу второго вопроса? Есть способы взаимодействия разных локальных переменных? В смысле из одной функции вызвать локальную переменную другой функции. И вообще взаимодействия между двумя разными объектами разных аддчаилдов? ( в моем случае столкновение вертолета и ракеты)

    • admin

      есть способы. Во-первых, если переменная была объявлена вне какой-либо функции, т.е. var чего-то там был снаружи всех функций, это получится глобальная переменная, которая может использоваться локально.
      Во-вторых, конкретно про addchild, такие объекты могут взаимодействовать, т.к. они не локальные. Они добавляются на сцену. Но тебе надо как-то к ним обращаться. Либо задавать параметр name, и обращаться через getChildByName (как я делал в косынке, либо использовать стандартное имя (instance какой-то там), либо через индекс клипа на сцене, либо – запихнуть клип в массив, и по индексу массива. Этот способ лучше всего! Т.к. ты будешь использовать дальше циклы.
      Пример. Ты все вертолеты пихаешь в массив. 0 индекс – 1 вертолет, 1 – 2 вертолет и т.д. А в функции полета ракеты сделаешь цикл от 0 до длины массива – 1, на проверку столкновений со всеми вертолетами. Используя массив, ты всегда знаешь сколько у тебя вертолетов, проще обращаться и при добавлении новых, ничего менять не нужно :)

  19. Merklar

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

    • admin

      а что там сложного? имя_массива.push(название_мувика). Вот тебе и мувик в массиве :)
      объекты появляются в произвольной точке, двигаются к цели и т.д – у тебя и так уже реализовано. Только не самонаводящиеся ракеты, для них надо по-другому писать путь движения. Столкновения я тебе сделал, ну и прочие вещи, посмотри, разберись ;)
      http://yadi.sk/d/MUhD-XQNMa4ft
      Я уже даже объекты не использую, пихаю все данные в мувик.:D Но это не всегда хорошо. В общем, если удалённый мувик больше не появится никогда в игре, то объект ему ни к чему, нам не надо сохранять данные о нем, когда его нет. :)

  20. Merklar

    Блин, спасибо тебе огромное) Я тебя не задолбал еще вопросами? Ща книг накачал, погружаюсь в чтение)

    • admin

      пожалуйста :) нафига тебе куча книг не пойму :) Разве что делать xml-редактор для уровней или ручной рендер. :) Хотя… кто знает :)

  21. Merklar

    Слушай, а обучение Бокс2Д тож твоя работа?

    • admin

      работа? xD эт хобби :) я думал по quickbox2d сделать :) это упрощенная версия бокса. :)

  22. Merklar

    И снова нужна твоя помощь) http://yadi.sk/d/A98y9fLeMTN2g Не могу разобраться в глюках. В принципе все как я и задумывал, но… Периодически уничтожаются по 2-3 цели одновременно(причем не только те, по которым попала ракета). Периодически не пропадает прицел(и там проигрывается клип взрыва). Часто резко меняется скорость полета самолетов/вертолетов(появилось после того как стал менять их альфа). А, и еще иногда вылазит ошибка(при уничтожении стелса) но опять таки не всегда. Посмотри, если есть, время, ок?

    • admin

      не можешь разобраться, потому что их у тебя полно! :) Намудрил… :) В общем, долго объяснять кучу ошибок, вот переделал, разбирайся :) ))
      http://yadi.sk/d/U_boTbKuMiadn

  23. Merklar

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

    • admin

      да так с лёту и не скажешь. Главный косяк был в том, что ты и так делаешь для каждого летающего объекта enter_frame, так внутри них ты ещё запускаешь циклы по всем этим летающим объектам. Прицел не пропадал, потому что было противоречие. Когда ракета взрывается после достижения прицела, она может сбить самолет. Потом косяк с удалением самолетов и добавлением их ракет, когда они достигают зоны уничтожения, а ты их сбиваешь своей ракетой. Т.е. самолета уже нет, но его пуля может добавиться, и тут флеш вываливает ошибки, что нет родительского объекта. Сбивание 2 и более самолетов по той же причине. У тебя проигрывается анимация взрыва, но ракета может и дальше сбивать всё, пока она не удалиться со сцены. Поэтому прилепил условий. Ну и массивы лишние что ли были. Параметр index каждого летуна соответствует его индексу в массиве. Поэтому при уничтожении самолетов идет цикл for, для изменения индексов на 1 меньше :) Вот как-то так :)

  24. Merklar

    Спасибо) т.е. я сильно нагружал комп? Какие еще вещи могут нагрузку сильную давать?

    • admin

      да не в нагрузке дело. Нагрузка будет, когда будет больше 50-100 двигающихся объектов на сцене. У тебя была проблема в противоречиях – некоторые вещи выполнялись по 2 раза, некоторые делались там, где уже не должны.. Отсюда и ускорения, и ошибки :)
      Нагрузку дает всё. Больше строк кода – больше расчетов – больше нагрузка. Больше объектов на сцене – больше расчетов – больше нагрузка. Главное в этом деле – писать более-менее оптимизированный код, и обязательно удалять всё то, что не нужно с помощью removeChild и removeEventListener. ;)

  25. Merklar

    Снова привет) Опят не могу найти причину ошибки) Вижу как выдает, но не могу устранить… После чего начинает тормозить игра. http://yadi.sk/d/Junx4bobN7dob
    Посмотри пожалуйста, если время будет. Конкретно где то – здесь
    function mouse_pzrk (e:Event) {
    if (kurs == 1) {
    var pz:MovieClip = e.currentTarget as MovieClip;
    pz.x = mouseX;
    pz.y = mouseY;
    Mouse.hide();
    } else {
    Mouse.show();
    pz.removeEventListener(Event.ENTER_FRAME, mouse_pzrk);
    removeChild(pz);
    }
    }

    • admin

      Прикольная игра выходит у тебя ;) ошибка в следующем:
      В функции function pzrk_1_plased (e:Event) { ты устанавливаешь kurs = 0;, но в функции function mouse_pzrk у тебя для kursa = 0 или любому другому значению не равному одному, выполняются действия:
      else {
      Mouse.show();
      pz.removeEventListener(Event.ENTER_FRAME, mouse_pzrk);
      removeChild(pz);
      }
      Проблема тут в том, что у тебя не объявлено что такое pz! Для условия if (kurs == 1) { объявлено, а для else нет.
      Итого, надо вынести строчку
      var pz:MovieClip = e.currentTarget as MovieClip;
      в начало функции :)
      http://yadi.sk/d/ttzUSd6WN9stz

  26. Merklar

    Спасибо) действительно мелочь такая, а сколько мне крови попила) Даж незнаю что у тебя еще поспрашивать) когда делаю – вопросов много, а ща чет ни одного придумать не могу…

  27. Merklar

    Привет) Снова за помощью к тебе… Из глобальных проблем. Как можно, после прохождения уровня уничтожить все цели/ракеты/пзрк? я понимаю что циклом(касательно целей) но чет не выходит( а вот что делать с летящими ракетами? Можешь чиркануть пример такого цикла…
    Не из глобальных) Сделал чтоб пзрк стреляли ракетой по вертолетам, когда дистанция ниже заданной… все норм, задавал обычным циклом встречу.. вот только если после пуска ракеты(пзрк) я успеваю сбить ее цель, то ракета(пзрк) автоматически находит другой вертолет где бы он ни был.. (я так понимаю при уничтожении индекс элемента массива меняется… Не могу придумать условие, чтоб устранить это) Но это не критично… А вот с удалением всех объектов это да) А, и еще, просто совет спросить. Я сделал перезарядку пзрк 10с… было два варианта, с помощью таймера или как сделал я задав длину клипа в (10с с ползущей полоской) и написав условие) Какой вариант предпочтительней и не будет ли мой вариант слишком загружать игру? Заранее благодарю

  28. Merklar

    И снова привет. Реально нужна помощь( в инете ничего не нашел, хотя вот уже пару дней лажу… http://yadi.sk/d/Junx4bobN7dob
    1. Как можно изменить свойства таймера( я количество повторов задаю переменной, но он воспринимает только ее первое значение) или на худой конец удалить таймер (нулл и делет не работают();
    2. Уничтожение циклом самолетов/вертолетов… (получается удалить только инфу из массива, а вот ремовеЧайлд пишет что объект не может быть пустым);
    3. Как сделать так, что клип, добавляемый чайлдом был всегда сверху (реализация помехи прикрытия);
    4. И так, для дальнейшего развития, как можно задать случайную траекторию к точке. Заранее благодарю

    • admin

      ох и ох. я уж думал ты всё сам порешал. У меня сейчас времени не особо есть. Как будет, так посмотрю :)
      Навскидку: 1. таймеры объявлять через var не вначале а в функции, где он используется, ибо он воспринимает только первое значение переменной. Я так делал с функциями Data(); Minutes(); и т.д.
      2. если пишет, что ремов чайлд пуст, то ты удаляешь чего нет. в чем сложность не знаю. удаление в 2 строки должно быть. удалил клип, удалил ячейку массива, и так по кругу.
      3. чтобы клип был всегда сверху, как вариант добавлять его в другой слой, где есть клип, в который ты его запхнешь. Но ест ьвариант проще. Когда добавляешь что-то новое на сцену, то в конце пишешь аддчайлд(тот_объект, который должен быть выше)
      4. Какую случайную траекторию. У тебя и так всё летело случайно. или ты хочешь хитроумный путь? тогда либо через формулы, либо через траекторию рисованную (но так я не делал ни разу). Но так точно можно, ибо есть игры типа Zuma, и там именно траектория движения. Либо она сделана по контрольным точкам. Либо ещё как-то. :) Блин, а и правда по контрльным точкам легко сделать Зуму :) создать массив с координатами на каждый левел. Достиг одной координаты – дуй в другую, и так далее. :)

      Надо идти рисовать разметку на баскетбольном поле :)

  29. Merklar

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

    • admin

      1. Клип добавленный в другой клип, соответствует координатам того клипа, а не сцены. Значит привязка того клипа не в верхнем правом углу. Почему бы тебе не прилепить её к самому самолету? или вообще сделать в самолёте?
      2. Если таймер не меняется переменной, значит нельзя менять параметры.
      3. Когда ждать не знаю :D Я сейчас вообще другими делами занят: ремонт машины/баскетбол/магазины/фото/видео и т.д..
      Скинь последний вариант, где ты починил таймеры уже :)
      1. Пятна должны быть выше вообще всего? или самолета? Смысл их?
      2. Когда надо удалять все самолеты (и только ли самолеты)?

  30. Merklar

    http://yadi.sk/d/ILZth_l4PYzHY – о конечный вариант) Смысл пятна – закрывать другие самолеты))) т.е. выше всего) с привязкой думаю разберусь) А удалять все воздушные цели – типа уровень кончился) тут вот какой вопрос… если таймеры у меня в функции, то смогу ли я их остановить или запустить из другой функции? Спорт и машина – это важно) Сам на работе в свободное время прогаю)

  31. Merklar

    А) прочитал внимательно твой вопрос) Удалять надо после нажатия кнопочки НЕКСТ, когда прошел уровень) И кроме всего прочего нужно еще пзрк удалять все(такие штуки, что ракеты по самолетам пускают). И вопрос с теми же пзрк… После пуска ракеты(пзрк) я успеваю сбить ее цель, то ракета(пзрк) автоматически находит другой вертолет где бы он ни был.. (я так понимаю при уничтожении индекс элемента массива меняется… Не могу придумать условие, чтоб устранить это)

    • admin

      http://yadi.sk/d/aTPHuqLHQ5h6r
      В общем, я не хочу загоняться, чтобы заставить всё работать правильно. Нужно много времени, чтобы переделать игру. Не знаю почему вылетает ошибка
      at ZRV_prototip2_fla::MainTimeline/V500R_fly()
      TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект “null”.
      Даже когда эта функция не добавляется в принципе… Хотя, я знаю в чем дело. В том что у тебя 3 функции:
      stage.addEventListener(MouseEvent.CLICK, VR_target);
      stage.addEventListener(MouseEvent.CLICK, pzrk_1_plased);
      stage.addEventListener(MouseEvent.CLICK, pzrk_2_plased);
      А надо бы одну для клика на сцене, а уж внутри функции определять что делать, размещать пзрк или добавлять ракеты. Противоречия у флеша короче!
      Удаление самолетов и помехи я сделал, чтоб помеха была сверху тоже.
      Тебе ещё надо будет сделать удаление всех пуль, и всех функций с ними связанных. Опять же нужны массивы и загоны с массивами…

    • Кирилл

      Не хочешь вместе обучаться AS 3 ?Так легче будет намного потом может игру какую создадим

      • Кирилл

        Это адресовано Merklar

        • admin

          вместе обучаться невозможно :) Разве что по скайпу… И то, проблематично. Вместе можно только собирать игру, и то, если один из вас будет художник/геймдизайнер/звуковик, а другой кодер :)

        • Merklar

          Хех))) а как вместе? Мы тут все походу вместе обучаемся))

    • admin

      тебе тут предложение поступило :)
      http://codeforgames.ru/ping-pong/#comment-398
      http://codeforgames.ru/ping-pong/#comment-399

  32. Сергей

    Я понимаю,что я здесь не совсем в тему .Но вот создал свое первое подобие на игру .Возможно игровой процесс слишком глупый ,но все же прошу исправить ошибки скриптовые.Там совсем немного кода строчек на 70.И еще я не могу понять одну вещь.Почему то когда я прописываю hiTestObject обычному мувиклипу то пересечение работает ,но когда на обьект созданный с помощью addChild ничего не работает .Вот ссылка на исходник http://yadi.sk/d/yVy_fHVnPeN6d .Буду благодарен за помощь

  33. Сергей

    Суть игры сосотоит в том чтобы не задевать колоны

      • Сергей

        Спасибо.А как тебе сам игровой процесс?Он еще совсем ни о чем ,но впринципе есть игры и по проще ,flаppi bird например

        • admin

          Да причем тут мне) Делай как тебе нравится ;) Flappy bird – это гениальная игра! При всей её элементарности, она была сделана за 3 дня, в неё сыграло полмира и паренёк зарабатывал с неё по 50.000 $ в день. :)

          • Сергей

            Звучит дико немного.

          • Сергей

            Кстати если я не буду спрашивать ,что другие думают о моей игре то никогда не пойму на сколько игра убога и что в ней нужно доделать

  34. Merklar

    Вот еще вопрос)) я как бы теперь сам стараюсь выход найти, но тут фиг знает в чем дело… Вроде таймеры объявляются в одной функции и тут же пытаюсь их остановить при выполнении условия… но мне пишет что таймер нулл( я уже и трейсом пытался отследить где он пропадает, в итоге получается первый кадр он(таймер) есть, а во втором уже нету… хотя событие таймера по прежнему выполняются..
    function Pusk_samoletov() {
    if (GO == 1) {
    if ((level < 20) && !(level%10 == 0)) {
    var time_Su:Timer = new Timer(3000+Math.random()*3000, 9+level);
    time_Su.start();
    trace(time_Su)
    time_Su.addEventListener(TimerEvent.TIMER, time_Su_run);
    }
    //Запуск босса каждый 10 уровень
    if (level%10 == 0) {
    var time_Boss_1:Timer = new Timer(1000+Math.random()*5000, 1);
    time_Boss_1.start();
    var time_boss_attack:Timer = new Timer(6000, 1);
    time_boss_attack.start();
    vint1_hp = 4 + level/5;
    vint2_hp = 4 + level/5;
    vint3_hp = 4 + level/5;
    vint4_hp = 4 + level/5;
    time_Boss_1.addEventListener(TimerEvent.TIMER, time_Boss_1_run);
    time_boss_attack.addEventListener(TimerEvent.TIMER_COMPLETE, boss_attack_lonch);
    }
    if ((level =20) && !(level%10 == 0)) {
    var time_Mig:Timer = new Timer(3000+Math.random()*3000, 9+level);
    time_Mig.start();
    time_Mig.addEventListener(TimerEvent.TIMER, time_Mig_run);
    }
    if ((level =10) && !(level%10 == 0)) {
    var time_St:Timer = new Timer(5000+Math.random()*10000, 9+level);
    time_St.start();
    time_St.addEventListener(TimerEvent.TIMER, time_St_run);
    }
    if ((level =5) && !(level%10 == 0)) {
    var time_Mi:Timer = new Timer(3000+Math.random()*3000, 9+level);
    time_Mi.start();
    time_Mi.addEventListener(TimerEvent.TIMER, time_Mi_run);
    }
    if ((level =15) && !(level%10 == 0)) {
    var time_PAP:Timer = new Timer(5000+Math.random()*13000, 2);
    time_PAP.start();
    time_PAP.addEventListener(TimerEvent.TIMER, time_PAP_run);
    }
    GO = 0;
    } trace(time_Su)
    if (progres >= 9+level) {
    /*delet();*/
    next_l.x = 350;
    next_l.y = 350;
    next_l.level_labe.text = level;
    level ++;
    lvl.text = level;
    next_l.width = 700;
    next_l.height = 700;
    addChild(next_l);
    fon.nextFrame();
    progres = 0;
    ind_z = 9;
    zapas_ind.gotoAndPlay(ind_z);
    frags = 0;
    HP = 100;
    /*if ((level =5) && !(level%10 == 0)) {
    time_Mi.stop();
    }
    if ((level =20) && !(level%10 == 0)) {
    time_Mig.stop();
    }*/

    trace(time_Su) – вот, уже таймера нету… хотя таймер же объявлен в этой функции(

    /*if ((level =10) && !(level%10 == 0)) {
    time_St.stop();
    }
    if ((level =15) && !(level%10 == 0)) {
    time_PAP.stop();
    }*/
    HP_zrdn = 100;
    HP_status.text = HP;
    zrdn_status.text = HP_zrdn;
    Aes.x = 100 + Math.random()*200;
    Aes.y = 550 + Math.random()*100;
    RVZ.x = Aes.x;
    RVZ.y = Aes.y;
    ZRK.clip.x = 400 + Math.random()*200;
    ZRK.clip.y = 550 + Math.random()*100;
    PU.x = ZRK.clip.x;
    PU.y = ZRK.clip.y;
    RVZ_1.x = ZRK.clip.x;
    RVZ_1.y = ZRK.clip.y;
    zona_obn_nzc.x = ZRK.clip.x;
    zona_obn_nzc.y = ZRK.clip.y;
    zona_obn.x = ZRK.clip.x;
    zona_obn.y = ZRK.clip.y;
    frag.text = frags;
    }
    }

    • Merklar

      хм… чет тут знаки иногда не отображаются(( вместе <= пишет =)

    • admin

      может потому что в тот момент, когда ты проверяешь условие
      if (progres >= 9+level) {, у тебя переменная level = 10,
      а если так, то у тебя по условию таймер не создаётся !(level%10 == 0)

      Может в этот момент переменная GO = 0. Может ещё что-то.
      Но лучше бы ты выключал таймер из самого таймера… Как клипы из клипов :) Типа вот такого варианта:
      http://yadi.sk/d/8HpJDxgIQdkRC

      • Merklar

        т.е. если условие не выполняется, то таймер виден не будет??? Даже если визуально он работает…

        • admin

          у тебя визуально работает другой таймер!!! Он с таким же названием, но он другой. Конкретно в этом кадре ты можешь не создать новый, поэтому и обратиться к нему не сможешь. :) Но таймер, созданный ранее буде работать) чего бы ему не работать :)

          • Merklar

            ок, твой совет помог) Почти все проблемы с таймерами решены. Спасибо большое

  35. Merklar

    блин( сорри длинный комент получился( удалиш если что…

  36. Merklar

    и вот еще вопрос)) Нельзя ли остановить таймер, объявленный в другой функции?

  37. Кирилл

    Я никак не могу понять как полностью удалить обьект со сцены .Не так чтобы с листа отображения ,а вообще полностью .Вот ссылка на исходник ,где я попытался http://yadi.sk/d/_O9LrWXBQkHyz .Пожалуста помоги

    • admin

      я вообще не пойму что ты хочешь удалить… Ты бы пояснил это)

      • Кирилл

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

        • admin

          http://yadi.sk/d/s7rZGixgQyEnq
          “Но когда я пытаюсь их обнулить ничего не выходит ,выдает ошибку”. Это ошибка вылетает потому что ты не проверяешь наличие объекта, перед действиями с ним, поэтому когда его обнуляешь, вылетают ошибки :) Флеш пытается с ним что-то делать, а его нет :D Допустим:
          TweenLite.to(k,1.5,{y:mouseY,x:mouseX,ease:Elastic.easeOut});
          detect (gran);
          detect (gran2);
          Когда ты обнулил k, то эти штуки работать не могут, потому что k уже нету, а флеш пытается с ним делать действия, поэтому нужно проверять, есть ли он у нас вообще, таким способом:
          if (k) { }.
          Однако, т.к. мы не используем классы, переменную k нужно создать заранее.
          var k;
          Вот, собственно и всё :) Об этом всём, я, кстати, говорил во втором уроке “снег и пули” :) Когда пули сталкиваются с шаром и взрывают его. Там шла проверка на наличие шара. :)

          • Кирилл

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

  38. Кирилл

    Обьясните пожалуста хоть кто то .Возможно это с помощью массивов делать нужно

  39. Merklar

    можно так –
    removeChild(имя_объекта);
    имя_объекта = null;
    Если он у вас в массиве, то соответственно нужно удалить элемент массива.
    С помощью removeChild вы удаляете визуальную составляющую объекта, но информация о нем(координаты, границы и т.д.) никуда не девается. А вот null как раз это и удаляет

    • admin

      я думаю у него проблема в другом. :) “Но когда я пытаюсь их обнулить ничего не выходит ,выдает ошибку”. Та же, что была у тебя :) Не проверяет наличие объекта, перед действиями с ним, поэтому когда его обнуляешь, вылетают ошибки :) Прога пытается с ним что-то делать, а его нет :D

  40. Merklar

    ОК) слушай, а ты можешь уроков сделать по XML во флеше и по использованию классов? Интересно же) А у тебя отлично получается объяснять. И еще вопрос… можно ли паузу сделать? Причем не останавливая все процессы циклами, а просто, как на плеере?

    • admin

      Паузу сделать легко. Добавляешь глобальную переменную onPause = false;
      ну или как хочешь называешь. И в местах, где у тебя что-то движется, добавляешь условие if (!onPause) { //то выполняем }; и в местах добавления объектов так же. Чтобы ты не мог на паузе размещать свои ПЗРК, хотя тут на твоё усмотрение. :) Главное – только в нужных местах разместить условие! :)

      Зачем тебе XML? :) Редактор уровней собрался делать?:) Обычное использование xml элементарное :) А вот для уровней посложнее код. По классам миллионы уроков и книг :) Тем более я их не люблю :D Если только по основам сделаю… И то не факт. Мне бы дудл доделать xDDD Я сейчас вообще не во флеше, я на баскете, в кино, в ремонте, в покупках всего, запись песен, клипов :) Только вот на вопросы отвечаю иногда :)

      • Кирилл

        Да ты гиперактивен .А какие песни записываешь ?

        • admin

          Активность нормальная :D Свои песни в основном :) Бывает и чужие играю/пою :) Сейчас стол делаю) для удобства сбора и рисования игр :)

  41. Merklar

    ок, спс, попробую состряпать паузу) Игра подходит к концу)) Ну я про механику… Еще ждет графика, звук и т.д.(

  42. Merklar

    А XML ну так, для общего развития) мало ли, когда пригодится. И классы для того же) А ты дудл на плиточном мире делаешь? (ну типа массив, где каждый элемент – определенный блок) И будут ли уроки по дудлу?

    • admin

      для общего развития xD Для сайтостроения если :) Ну или редакторов :) А так.. делать им нечего :) По класса я думаю сделаю основы только :) Ну может ещё мелкую игру на классах покажу как сделать. Надо, кстати проверить насколько быстрее классовая игре, чем кадровая. Разница в чём. Когда игру пишешь в классе (именно весь код в файле as, к которому подключаются другие классы as), то этот класс, и саму флешку мы можем объявить как Sprite, а не MovieClip. Ещё читал, что при написании в кадрах код получается динамическим, а при классах статическим (т.к. мы можем указывать static function), и это как бы влияет на быстродействие. Но пока не соберешь одну и ту же с игру (с одинаковым кодом) в классах и в кадрах, так и не узнаешь о реальности быстродействия. По крайней мере, я точно знаю, что движение в as2 плавнее, и там цифры считаются правильно :) Не удивлюсь, если использование классов ещё и замедляет as3 :D Поэтому лезть в классы не охота, тем более я скоро соскачу на юнити :) ))

    • admin

      Дудл – это не плиточный мир. Там нет плит :) А платформы засовываются в массив, это да :)
      Плиточный мир – мир, в котором ты карту разбиваешь на одинаковые блоки, где каждый блок может принимать какой-либо объект. Как марио, танчики. Блок может быть травой, землей, камнем, лесом, пустотой и т.д.
      А в дудле просто фон, куда мы периодически добавляем рандомно плиты. :)
      Кстати, посмотри как у тебя будет работать анимация движения плит:
      http://yadi.sk/d/nNEXzl_AQzPvh
      Во время игры можно нажать ПКМ, и выбрать Show Profiler. Он показывает частоту кадров, и график загрузки памяти в реальном времени. Когда синяя линия обрывается вниз, это работа мусорщика :) Он удаляет всё ненужное и обнуленное за какой-то период времени. Поэтому, когда я рассказывал про баг, когда мы удаляем объект и пишем null, то код внутри объекта работает, это потому что мусор удаляется не сразу, а когда контейнер накопит много чего, чтобы разом удалить всё :)
      Ну так вот, у меня почти всегда 60 кадров, а анимация рывковая есть. Может только у меня так…

  43. Merklar

    Да не, вроде норм анимация, рывков не заметил) Ты сам рисуешь для игр?

    • admin

      реально нет рывков? (О_о )
      А у меня анимация, то шикарная, то с маленькими рывками.
      Шикарная – это вообще настолько плавно, что даже не думаешь, что это кадры :)
      А рывками – это когда думаешь, что некоторые кадры проскакивает :)
      Надо затестить на другом компе ))) Может реально только у меня так…
      В эту игру я ничего не рисовал. Всё вырезал в фотошопе из картинок:) Ну и сохранял в PNG разные запчасти)

      Но для своих игр в любом случае рисовать самому, либо покупать у кого-то картинки. :) Авторское право и всё такое… :)

    • admin

      А так-то, да :) Пока сам рисую :)

  44. Кирилл

    А интересно узнать ,как сделать чтобы время в игре и все процессы шли даже после выхода из нее ?Чтобы она шла как бы в реальном времени

    • admin

      типа как в фермах вконтакте?:) Да легко. Сохраняешь время, когда выходишь из игры. А когда заходишь в игру прописать код, который будет сравнивать дату/время выхода с игры с моментом, когда зашёл. И если прошло там больше 2 часов, то выросла картошка, если больше 4 часов – завяла картошка. :)
      В таких играх всё равно ж есть сохранение. Просто для каждого объекта сделать ещё параметр состояния, который будет зависеть от времени :) Вот так просто :)

      • Кирилл

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

        • admin

          “как ты так качественно вырезаешь героев и обьекты из других игр и вставляешь в свои ?”
          С помощью фотошопа :) Для качества, во-первых, нужна качественная картинка из которой вырезаешь. Потом нужно грамотно стирать резинкой с разными параметрами сглаживания, также нужно сохранять в PNG в приемлемым качеством, и ОЧЕНЬ ВАЖНО сохранять картинку в том масштабе, в котором она будет в игре!!! Т.е. ты изначально делаешь картинку игрового размера. Если ты во флеше начнёшь изменять размер, то всё качество улетит… Вот так :) Так же, если нужно, объект разбивается на несколько частей и каждая сохраняется отдельно. Допустим дудл у меня состоит, кажется, из 9 частей (тело, ноги1, ноги2, голова1, голова2, пропеллер, ракета, щит, дым ракеты).

  45. Кирилл

    А жаль.Я хотел бы хоть немного украсить игру

  46. Кирилл

    Спасибо большое

  47. Кирилл

    А как вырезать фон из этой картинки http://yadi.sk/d/T5T88uxwRvD5b ?

    • admin

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

  48. Merklar

    Привет! А подскажи, как можно игруху во флеше перевести на Андройд( ну там чтоб можно было установить как приложение и т.д.) И вот еще, как можно встроить плеер в файл? Как то непонятно спросил… ну вот чтоб на компах, на которых даже не установлен адоб плеер можно было его проигрывать (при чем, не в браузере). Заранее благодарю

    • admin

      про андроид подсказать не могу. у меня нет такого телефона, чтобы проверить. Либо flash lite, либо air.
      По второму вопросу: скачай любой swf to exe converter :)

  49. Кирилл

    Все лето началось.Теперь мы дудл джамп точно не дождемся …

    • admin

      :D дело даже не в лете) ко мне Бро приехал, которого почти год не видел :) зависаем тут в кооп-играх)

  50. Merklar

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

    • admin

      1. Можно. Но как это сделать именно в твоей программе неизвестно. Разные способы есть. К примеру просто добавить булеву переменную. Или через массив.. Или через параметры.
      2. Можно. Даже на щелчок колеса можно. Но это не из стандартных функций. Поищи в интернете. В книге секретов флеша или советов по флешу был такой код.
      3. Сейчас не делаю. Делал раньше на заказ. Выставлять буду на FGL, но недолго)
      Подробнее о продажах читай тут http://gamedevblogs.ru/ ;)

      • Merklar

        Спасибо) Ты как всегда мне помогаешь)

  51. Merklar

    Блин, не могу найти норм SWF to EXE конвертера( То последняя версия не флеша не поддерживается, то не работает( Сам то каким пользуешся?

    • admin

      Я сейчас не пользуюсь ими. А что мешает экспортировать игру под раннюю версию флеша?:) там же можно выбрать под какой плеер.

  52. Alexandrn

    Всем привет!
    admin пишет: “Выставлять буду на FGL, но недолго)”
    Почему не долго? Могут украсть идею? )))

    Да эти последние версии флешплеера глючные какие-то, я с 10 не слезаю.
    Вчера глюк был на самом адобе флеш. Один из предметов для игры поменял окраску, без всяких моих манипуляций. Он соответственно перекосячил все мувики связанные с ним. Ну, думаю, вернусь к раннее сохранённой версии и перекопирую в эту. Открываю, а там таже картина и так во всех остальных до первой. Вот блин, а это не просто однотонка а градиент с кучей оттенков.
    Был глюк, когда исчезли рисунки (не зависимые друг от друга) в мувиках. Тогда копипаст из ранних версий спас.

    • admin

      недолго, потому что в планах перескочить на мобильные платформы :) Хотя, по-первости думаю и мобилки на fgl продавать, а дальше хочу сам, либо через паблишера типа Neversoft, alawar, steam. :) В общем, хочу всё опробовать :)

  53. Merklar

    И снова привет) У меня осталась 1 одна не решенная проблема, которая, хоть редко, но выскакивает…
    Когда ПЗРК пускает ракету по самолете, но я успеваю уничтожить этот самолет раньше прежде чем ракета долетит – было 2 случая:
    1. Если есть еще самолеты из этого массива, то ракета переключалась на него и летела, как бы далеко он не находился. (Проблема решена условием на дистанцию).
    2. И вторая, если больше не было элементов этого массива – выдает ошибку… Я уже и условие на длину массива задавал, мол если ракета пущена, но тут резко длинна массива равна 0 то уничтожение. Не помогает.. Как можно задать условие на то, если элементов не будет…?

  54. Merklar

    Да, кстати, как выяснилось, сам адоб флеш может сохранять сфв как ехе)

    • admin

      до чего дошёл прогресс :D
      “Как можно задать условие на то, если элементов не будет…” – if (massiv.length == 0) {}
      А в чём ошибка с лёту и не скажешь. Надо проверять весь код… И искать где у тебя используются пропадающие переменные от сбитого самолета. Они просто где-то используются у ракеты, а так не надо. Лучше бы эти данные сохранить в переменную ракеты, и использовать их, тогда удаление самолетов никак влиять не будет)

      • Merklar

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

        • admin

          понял. у тебя самонаводящиеся ракеты. решение такое: когда сбиваешь самолет за которым летит ракета, ты добавляешь на место этой ракеты другую ракету (т.е. она полетит дальше, но не будет преследовать самолёт), а ту ракету и самолёт удаляешьт. и всё :) Смысл удалить ту ракету и в том же месте добавить другую со своими параметрами, полёт которой уже не зависит от самолета и той ракеты :) Надеюсь понятно выразился. Если так сделать, то решиться и проблема 1 без добавления условия на дистанцию :)

          • Merklar

            так вот как ее удалить то? В этом вся и проблема…

        • admin

          если слушатель ENTER_FRAME прилеплен к ракете, я думаю ты знаешь как удалить и ракету и этот слушатель. а если нет, то непонятно как там у тебя это реализовано. Если через цикл, а ракета в массиве, то удалить её с массива. :)

          • Merklar

            Как удалить то я знаю) Но вот условие на это не могу задать… проповал if (samolet.killed = true)
            if (plane_1.lenght == 0)
            if (!plane1[i]) и т.д. Ну вот не получается и все(

          • Merklar

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

        • admin

          не разобрался) я разбираюсь со штукатуркой на стене в ванной :) ремонта ещё вагон…
          Думается мне что надо делать растровый рендер для анимации. И то не факт что поможет. Я так смотрю во многих играх есть эта прерывистость. Но ведь есть игры такого же плана и плавные. Вероятно в отрисовке всё дело.

  55. Alexandrn

    Привет всем! Приветствую тебя админ, создатель интересных скриптов ))).
    Очень нужна помощь, запутался опять в трёх соснах.
    Вот исходник https://yadi.sk/d/ZB4b0y04TX2et
    Даны три шара: сталь бьёт > стекло и пластик,
    стекло бьёт > пластик,
    а стального никто не бьёт.
    Проблема такая
    1.Не могу остановить функцию столкновений, когда стеклянный шар разбит, ибо при наведении на осколки пластиковым, последний разбивается об него.
    2. В задумке хотел оставлять мусор на сцене до конца уровня. Или попробовать тогда удалять, но не сразу, а с задержкой небольшой.
    3. Как сделать, чтобы взятый объект был выше всех на сцене?
    4. Как и куда воткнуть условие, что если все шары разбиты (кроме не бьющихся), то тогда переходим на следующий уровень?
    Спасибо!!!
    Зы: тож мечтаю в планах дудл джамп делать, и персонаж уже есть, в общем, ждём урока.

    • admin

      Привет, Саня:) Держи, разбирайся) https://yadi.sk/d/j-pgidFYTfwSm
      1. Ничего останавливать не надо)
      2. Оставил мусор
      3. addChild () для этого объекта
      4. В скрипт отжатия кнопки после того как разбил шары

      з.ы. Дудлик вообще сейчас не делаю, ремонтом занят)


      Создатель интересных скриптов :)

      • admin

        хотя это не лучший вариант кода… Надо переделать определение столкновений. Иногда не видит пересечений.

  56. Alexandrn

    Спасибо тебе, скриптовых дел мастер! )))
    Буду разбираться. У меня, так вообще столкновения срабатывают с третьей-четвёртой попытки столкнуть шары в твоём коде. Попробую поиграюсь со скриптом.
    Код вообще штука непредсказуемая (может только для меня), иногда что делаю всё по правилам и уверен на все сто, что будет работать, а оно нет. А бывает наоборот, тычешь вообще наобум, вставляешь кучу малу собираешь, тестишь- блин, работает, невероятно ))).
    Вчера просидел до пол четвертого ночи, уже решил отказаться от перетаскивания, пробовал на примерах клика по объекту с движением и движение с трением. Так получилось, что шары бьются, но осколки можно продолжать двигать, а пока они в зоне пересечения друг с другом, музыкальную какафонию слушаешь.
    Ещё раз большое спасибо, друг! Не буду тебя отвлекать, делай ремонт качественно ))). Интересно, дудлик у тебя небось на десятки тысяч строчек разрастается в скрипте!?

    • admin

      лови полностью рабочий вариант) https://yadi.sk/d/QVgRCdhZTzSqp
      единственное что тут не работает, так это если поднять шар и унести мышку за пределы приложения, то по возврату шар не отлипнет. но это уже технические штуки. решаемо. но сам код по приложению рабочий вроде как получился)

      В дудлике пока что строк 200 наверно. А всего будет думаю не больше 1000 :)

  57. Alexandrn

    Спасибо, друг!!! Вот что у меня выскочило в окне ошибок:
    Scene 1, Layer ‘Layer 1′, Frame 1, Line 85, 94, 103 Warning: 1092: Negative value used where a uint (non-negative) value is expected.
    Как раз те строчки, что ты маркером отметил. Сама флешка работает, на сцене по 16 шариков разной величины, я понял, это ты так задумал вижу g<=15 в коде. (А попервой подумал- глюк проги ))))))) ))
    Класс!!! Раз эта ошибка не смертельная, то просто супер!!!
    А то бывает когда не правильный код, флешку даже закрыть невозможно, только через диспетчера задач.
    Тогда сразу вопросик напрашивается: как правильно составить конструкцию для того, чтобы из массива рандомно выводился на сцену один из трёх объектов?

    • admin

      да я знаю что это за ошибка) она была и у меня) флеш недоволен что я i делаю отрицательным числом :) т.к. длина массива не может быть меньше нуля :) но -1 там нигде не используется, а при дальнейшем проходе цикла i увеличивается на 1 и уже = 0 :) можно попробовать впихнуть строчку break; чтобы не выдавал ошибки)

  58. Merklar

    И снова привет) Подскажи, можно ли добавить музыку в игру, так чтоб по определенному событию она останавливалась. Заранее скажу, смотрел как ты это делал в косынке (перетасовка карт), но у меня треки по минуте, по полтары… Очень длинные клипы получаются, если потоком пускать. А нельзя ли как то событие остановить… ну или сразу в музикбоксе в таймлайне на 3 минуты сделать дорожку? Заранее благодарю)

    • admin

      привет, ребята :)
      1. Смотреть надо было не в косынке, :D а в уроке 30. :)
      2. Не обязательно запускать потоком, если непрограммный звук, можно сделать событие Start вместо Stream, и не надо 1500 кадров..
      3. Программный звук можно остановить командой kanal_zvuka.stop();
      4. Чтобы сделать паузу вместо стопа, нужно сохранить позицию звука kanal.position и потом при запуске передать её song.play(kanal.position);.
      5. Все звуки в игре можно остановить командой SoundMixer.stopAll();
      6. Зачем тебе в таймлайне дорожка на 3 минуты?:) Делай событие старт в 1 кадре и всё.:) Я в косынке делал Stream, т.к. я привык ставить стрим для мультиков, т.к. идёт точное соответствие звука кадрам :) При событии старт в мультике идёт рассинхронизация со временем. Либо звук отстаёт, либо видео :)
      7. Чтобы звуки не накладывались, нужно остановить прошлый (либо все) и запустить какой надо. Да вот и всё :)

      • Merklar

        Спасибо большое, ты как всегда выручаешь)

  59. Alexandrn

    Присоединяюсь к вопросу Merklar про управление звуковыми треками. Как сделать так, чтобы можно было поставить трек на паузу, вызвать следующий трек, и чтоб звуки не накладывались один на один. Это я про фоновую музыку. Думаю, тут темы для размышления ещё на один небольшой урок набирается. С короткими то звуками всё ясно, они там не больше секунды ))) Бах, бум, стук, тарарам ))) Спасибо, мастер!!!

  60. Merklar

    Уважаемый, автор, давненько вам не писал. Подскажите, как закрыть приложение с помощью АС? Ну, чтоб на кнопку выход нажал – и закрыл

    • admin

      Давненько. И пока что такого желания даже нет :) Вообще в мыслях забросить этот проект :) Не приносит он столько удовольствия. Скажем так – игры делать люблю, но монтировать и записывать уроки нет. На это уходит в 2 раза больше вермени, чем на саму игру, а выхлоп практически = 0. Так что сейчас занят производством самих игруль.

      Ответ на твой вопрос: Приложение закрывается командой fscommand(“quit”);
      Есть ещё другие fscommand. К примеру fscommand(“fullscreen”) развернёт приложение на весь экран.

  61. Дмитрий

    Здравсвуйте, подскажите пожалуйста в чем проблема, выдает ошибку “TypeError: Error #1010: A term is undefined and has no properties.at ball_fla::MainTimeline/frame1()”
    при запросе trace (e);

    вот код:
    var up:Boolean = false;
    var down:Boolean = false;
    var left:Boolean = false;
    var right:Boolean = false;

    var board = {};
    board.clip = board_mc;
    board.speed = 3;
    board.w = board.clip.width;
    board.h = board.clip.height;

    var pc = {};
    pc.clip = board_mc2;
    pc.speed = 3;
    pc.w = board.clip.width;
    pc.h = board.clip.height;

    var ball = {};
    ball.clip = ball.mc;
    ball.radius = ball.clip.width/2;
    ball.speed = 3;
    ball.xmov = ball.speed;
    ball.ymov = ball.speed;

    stage.addEventListener(KeyboardEvent.KEY_DOWN, kd);
    stage.addEventListener(KeyboardEvent.KEY_UP, ku);

    function kd (e:KeyboardEvent) {
    trace (e);

    }

    function ku (e:KeyboardEvent) {

    }

    • admin

      Приветствую. Ошибка тут не при при запросе trace, а при запуске.
      Ошибка в строке 19:
      Нужно ball.clip = ball_mc;
      У тебя ball.clip = ball.mc;

  62. Ranex

    Привет! Разбираясь с уроком, встретился вот с такой фишкой:
    https://www.dropbox.com/s/dbldbfhwtf0033d/ping_pong.fla?dl=0
    Когда шар заходит за пределы игрового поля, противник получает не один бал, а как повезет :) Чего то не то может сделал, посмотри пожалуйста :)

    • admin

      Привет. Ошибка 1:
      if(ball.clip.x < – 20)
      {
      ….
      ball.xmove = 3;
      ball.ymove = 3;

      }
      Но это не так важно в твоем случае, т.к. скорость шара у тебя пока постоянная, но у тебя там написано ball.movex и ball.movey, в будущем скорость бы не менялась.
      А считает не один бал, и вообще неправильно себя ведёт игра при забивании гола, потому что в функции энтерфрейм функция goal(); должна быть последней.
      function ef(e:Event)
      {
      …….
      rander();
      goal();
      }

      • Ranex

        Спасиб! Скорость пока не волновала, вот и не обратил внимания :)
        А в интерфрейме, не придал значения положению последовательности запуска функций в кадре, считал что не принципиально…

        • admin

          это очень принципиально! :) Более того, порядок выполнения кода – самый важный момент! Это как сходить в магазин, купить продукты, поесть. Не можешь же ты поесть, купить продукты, а потом идти в магазин.

          • kakoy to rak v flash:C

            Блин,а я вообще почти ничего не понимаю в этих кодах – мне бы только узнать как делать:Жизни,очки,магазин,умение стрелять,создание бонусов…
            ____________________________
            и да,когда будут новые уроки? очень уж они хорошие =)

          • admin

            Уже отвечал, но да ладно :)
            \\ Не знаю. Если и будут, то сложные и платные. Просто сейчас не вижу смысла тратить кучу времени на создание игры, её пересоздание с записью видео, озвучку, монтаж. Потрачу месяц-два-три, и посмотрит человек 300. Причём, из этого всего, на первое создание игры уходит лишь 30% времени. Поэтому, если будут ещё уроки, то будут с небольшой платой. Смотря какие конечно.. Если же сделаю урок по игре на движке Starling, то это уже будет не символическая плата. Ибо эта хрень конкретная :D Как-то вот так :)

          • Ranex

            Хороший пример с магазином))
            Дошел до звука и не понял, откуда взялся непонятный параметр: “zvuk”?
            function playSound(zvuk) {
            if (soundOn) {
            musicbox.gotoAndStop(zvuk);
            }
            }

        • admin

          Да можешь назвать его как угодно. zvuk или traktor или как угодно. Тут фишка функции в том, что передавая параметр в функцию, мы начинаем проигрывание этого звука. К примеру, если мы вызовем функцию так :
          playSound(“звук летящего бобра”)

          , то по факту она сделает следующее:
          function playSound(“звук летящего бобра”) {
          if (soundOn) {
          musicbox.gotoAndStop(“звук летящего бобра”);
          }
          }
          Т.е. если параметр soundOn=true (звук в игре включен), то мы в мувике musicbox делаем активным кадр с меткой “звук летящего бобра”, в котором у нас и стартует этот звук. Т.е. мы перемещаемся не по номерам кадров, а по текстовым меткам.
          Если непонятно, то посмотри урок про звук. :)

  63. Alex

    Privet.Podskaji pojaluysta gde skachat adobe flash player na vsegda ato u menya probnaya versiya na 30 dney.Spasibo za uroki.YA sdelal pinpong.Jdu urokov na temu fighting

  64. Настя

    Здравствуйте, Евгений(admin). Хочу вас поблагодарить за уроки, посмотрев их я, примерно год назад всё таки осмелилась начать изучение action script.Очень качественные видеоуроки.
    Можно у вас проконсультироваться на счет кода? У Вас есть урок по теме “снег и пули”, в нём всё понятно. Вот только как можно решить ситуацию: пули вылетают от точки привязки по траектории пересечения с курсором например, и чтобы при вылете последующих пуль уже по другой траектории, предыдущие пули продолжали лететь по старой траектории.Если проще, то просто реалистичная стрельба из автомата например, где прицелом является курсор, но чтобы пули не останавливались в координатах курсора, а продолжали двигаться дальше.
    в поиске такая проблема встречается, но адекватных ответов на неё нет.

    • admin

      Привет, Настя :) Я только песню дописал, спать собираюсь)
      Может завтра днём помогу, или послезавтра :) Только скажите сразу, какой у вас флеш? У меня сейчас СС и он не сохраняет файлы в предыдущих версиях :(

      • Настя

        Спасибо за ответ:) У меня стоит CS6.
        А можно ещё спросить, только если решение с ходу знаете, не хочу отвлекать вас по пустякам…: решила сделать раскраску для детей, требуется локальные координаты mc2 преобразовать в глобальные, а как не знаю. Вот нашла пример перевода в инете (var global:Point = mc2.parent.localToGlobal(new Point(mc2.x, mc2.y));), но он не работает. Просто жалко времени, 2 дня рисовала и все забросила
        //current_color перемнная номера кадра мувиклипа для определения цвета
        //mc1 фрагмент рисунка
        //mc2 прозрачный мувиклип точка, привязанный к курсору

        var mc2:MovieClip = new Mc2();
        addChild(mc2);
        var global:Point = mc2.parent.localToGlobal(new Point(mc2.x, mc2.y));
        stage.addEventListener(Event.ENTER_FRAME, CurrentColorXY);
        function CurrentColorXY(e:Event):void{
        mc2.x = mouseX;
        mc2.y = mouseY;
        }

        //если мышь сталкивается с объектом, закрашиваем текущ. цветом
        mc1.addEventListener(MouseEvent.CLICK, ColorFun1);
        function ColorFun1(e:MouseEvent):void{
        if(mc1.hitTestPoint(global.x, global.y, true)){
        mc1.gotoAndStop(current_color);
        }

        • admin

          Настён, я тогда завтра установлю cs6 и расскажу, и про стрельбу и про раскраску (хотя кто меня знает… может и сегодня) :) Сейчас хочется встретить новый год под приятную музыку и весёлые фильмы :) Да ещё подарков надо прикупить :D
          С наступающим Новым Годом Вас! ;)

        • admin

          Открыл сейчас код раскраски :) Честно сказать не понял, зачем вам глобальные координаты мыши, если они изначально глобальные? И непонятен принцип по которому закрашивается что-то, и выбирается цвет) Тогда уж завтра соберу вам небольшую программку с выбором цвета и закраской человечка :)

          • Настя

            Жду с нетерпением. С новым годом!!!

          • Настя

            Привет, Евгений. Можешь ли ты меня проконсультировать по одному вопросу?
            Вот ссылочка контакта: https://vk.com/app4835291 Подскажи, пожалуйста, по какому принципу можно создать такой каталог с мини играми, чтобы из любой игры были видны все остальные и рейтинг игроков. Я правильно понимаю, что нужно сделать общую шапку на action script 3, которая будет взаимодействовать с базой данных своего сайта? И нет ли у тебя желания сделать свой подобный каталог мини игр вконтакте?

          • admin

            Привет, Настя. Никогда не делал каталогов и рейтинг тоже.
            Но “общую шапку на action script 3, которая будет взаимодействовать с базой данных своего сайта” правильное направление. Это касается рейтинга.
            А каталог игры можно сделать и обычными картинками со ссылками, база не обязательна.
            Делать каталоги желания у меня пока что нет. Я сейчас занимаюсь своим проектом, и мне сейчас не до этого всего :)

        • admin

          Раскраску я сделал бы так.))
          https://yadi.sk/d/iXuF1X0ldk3BA
          Надоела она мне, не хочу больше думать над курсорами… Надеюсь вам это поможет, с учетом того, что я не знаю как вы планировали реализовывать всё :) Про снайпера завтра наверно сделаю.

    • admin

      Вот вам, Настя, адекватный ответ про стрельбу:
      https://yadi.sk/d/D-uSbPi6dkQDy
      Я так загнался, что чуть ли не мини-игру сделал xD
      Думаю вы найдёте в ней ответ на свой вопрос ;)

      • Настя

        Привет, Женя. Вчера до поздна с кодом раскраски просидела, не успела отписаться. Твой вариант, как я и ожидала конечно, намного проще оказался. Даже несколько новых слов увидела:))). Спасибо большое:))), а теперь приступим ко второму примеру…

      • Настя

        Спасибо за “снайпера”, заставил улыбнуться)))))). И правда, прикольная мини игра получилась.

        • admin

          Привет, Настёна :) Пожалуйста ;) Я рад, что мой код оказался понятным (и более простым) для тебя :D Если будут вопросы – вэлком. :)

          • Настя

            Женя, можно получить адрес твоей странички вконтакте? пришли, пожалуйста его мне на anastasiya-yar@mail.ru

  65. Настя

    Женя, а что делать со всеми этими мини играми? Наверное у всех начинающих возникал такой вопрос… Куда их можно выкладывать, может даже монетизировать… Кроме ссылки на FGL ничего не попадается. Да и до уровня игр на FGL ещё далеко…
    Я пока в мечтах, что когда нибудь создам игровой сайт, но это ещё плюсом PHP и html надо учить, да и времени на разработку игр наверное совсем не останется, если всерьёз сайтом заниматься.
    А что ты делаешь со своими играми, куда выкладываешь, можно их где то посмотреть?

    • admin

      Со своими мини-играми ничего не сделаешь. Ну, если она реально хорошая, то fgl. Что мини, что макси. Можно пробовать обращать напрямую к тем кто покупает на fgl, но врят ли что выйдет из этого. А с выкладыванием и правда проблемно. Я, к примеру, хотел косынку выложить в вк, но не рискую… т.к. авторские права это моя любимая тема… :( В этом мире ничего нельзя использовать бесплатно, более того, даже изменять существующее. Исключение только одежда. Её можно резать, шить, рисовать на ней, и то там нюансы свои.

      Игровой сайт – это игровой портал. Их как раз держат те люди, которые покупают игры на fgl.
      Что касается меня. На fgl я ещё ничего не делал. Я года 4 назад делал пару игр для одной московской фирмы. И кучу баннеров. А с 2006 года я просто ради интереса делал свои игры, я даже не знал что их можно продавать… С учетом того, что тогда игры покупали за 500к…. но у меня даже интернета не было.
      В вк куча требований на игры. Да и на раскрутку ХОРОШЕГО приложения сейчас надо от 300к рублей и выше.
      Начинать, думаю, лучше всего с fgl. Я сейчас делаю одну игру туда, правда медленно, т.к. художник из меня медленный :D
      Но, справедливости ради, мини-игры могут принести ошеломляющий доход! :) Мой любимый пример это flappy bird. По 50.000 $ в день… На флеше она делается за день-два. Но она под мобилы сделана, не знаю на какой платформе.
      Братья, сделавшие Doodle jump тоже очень много заработали, но тут сыграл фактор того, что они были одними из первых кто сделал игру в play market (или App Store). Тоже самое с приложениями в вк, с сообществами в вк и т.д.
      По поводу продажи игр советую посмотреть это :)
      • Георгий Заркуа: – http://www.youtube.com/watch?v=sUQzqZ4qVCs
      • Георгий Заркуа: – http://www.youtube.com/watch?v=YcvSpsFHN1Y
      И почитать это http://gamedevblogs.ru – очень мотивирует :) Особенно, когда продают простенькую игру за 1000-2000 $ :)

  66. Merklar

    Привет! Смотрю, ты все еще проявляешь здесь хоть какую-то активность:) Хотелось бы выразить тебе огромную благодарность за твои уроки. Жаль конечно, что перестал дальше выпускать уроки, но на это действительно много времени уходит.
    Теперь вопросы… Ты графику сам делаешь? Потому как уже готова механика двух игр (да, да, все благодаря твоим урокам) и все упирается в графику. В одной игре – она еще куда ни шло (ну всмысле для продажи конечно нет, а вот для личного пользования норм), а во второй просто накидал, чтоб была разница между объектами заметна. Вот кстати ссылки на них, если интересно https://yadi.sk/d/HewlNzd8doTqV
    https://yadi.sk/d/1JBNphwldoTs5
    Пришел к выводу, что все таки нужно осваивать работу с классами и сторонними движками (Бокс2д и т.д.) Если бы ты еще и по ним уроки наделал))) Ладно, в общем еще раз спасибо тебе

    • admin

      Привет :) Да, я активничаю только тут сейчас. Отвечаю на вопросы, помогаю что-то сделать. На ютюб сейчас желания нет делать что-то. Ибо ооочень много времени это занимает. По факту, из тех уроков что есть, можно сделать практически любую игру, просто многие не могут соединить разные уроки между собой.
      Теперь ответы) Графику сейчас сам рисую. Очень медленно скажем так, т.к. не художник вовсе. Посмотрю что получится. Как доделаю игру, выложу тут на блоге. Я вообще последние полгода занимался не флешем. Песни на гитаре, сейчас пианино))) Гулянки, тренажерка, баскетбол) Не до игр как-то :D
      Насчет работы с классами не знаю. Я сейчас пробовал в игру прилеплять quickbox2d, и без классов замечательно работает) Не хочу на классы переходить :D
      Сейчас вот думаю стоит ли учить box2d или сразу прыгнуть на starling…
      Благодарю за благодарность :) По поводу графики можешь обратиться на сайт фрилансеров) Там художников хватает) Я не пробовал, но некоторые флешеры так делают.

      Посмотрел твои игры :) С самолетами прикольно) Но графика да – не продажная, хотя, некоторые элементы прям отлично, -самолеты и некоторые объекты хорошо нарисованы)
      Снежки – так и не понял принцип игры… :D

  67. Merklar

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

    • admin

      Я не играл в Бивиса))
      “А как запретить изменять размер приложения?” – не помню. Но можно, как вариант, сделать такое:
      fscommand(“allowscale”, “false”);
      При изменении окна flash плеера ролик размеры не изменит.

      Либо написать так:
      stage.scaleMode = StageScaleMode.NO_SCALE;
      Эффект аналогичный.

      В идеале бы написать так:
      fscommand(“allowscale”, “false”);
      fscommand(“trapallkeys”, “false”);
      fscommand(“showmenu”, “false”);

      Но у меня не работают ни trapallkeys, ни showmenu… Почему? не знаю…

      Если ты про окно в браузере, то это уже не про флеш, а про код встраивания. Посмотри тут и тут:
      http://chargedweb.com/swfsize
      https://code.google.com/p/swfobject

  68. Alexandrn

    Привет, Женя!!!
    Ответь пожалуйста на такой вопрос:
    Есть два независимые табло-счёты. Нужно записать для них одно условие
    Если score1 = 100 и score2 = 100 , то выполнится переход в кадр такой-то.
    Как правильно записать такой код. Я как ни пробовал, не работает.
    Так ты музыку на гитаре пишешь и на фортепьяно? Для игр? А через какую прогу? Я когда-то тож писал на магнитофон через микрофон видеокамеры (когда ещё компов не было) с пианина )) или синтезатора. Щас иногда пописываю через прогу sibelius. Он правда в бесплатной версии не даёт сохранять не в каких форматах, кроме миди.
    Спасибо, дружище. За предыдущие коменты отдельное спасибо, вдохновило (это там, где разработчики и их успешные игры). А то родные мне уже советуют завязывать с разработкой и искать работу по профилю (грязно-рабочие ))).

    • admin

      Привет, Саш :)
      На первый вопрос тебе уже ответил Merklar ниже:

      “Я не автор, но думаю смогу ответить…
      if ((score1 == 100) && (score2 == 100)) {
      имя_клипа.gotoAndStop(номер_кадра);
      }

      Я в основном на гитаре пишу песни для себя, либо поздравительные:) Просто люблю это дело) Электропианино купил в ноябре. Всегда мечтал научиться играть Ludovico Einaudi и Fabrizio Paterlini :) )))))))))))) Уже 4 композиции нормально играю :) Через midi-выход ещё ничего не записывал. А так, при работе с музыкой я пользуюсь только Cubase 5. :) С подключенной библиотекой NEXUS 1 и 2 – огромный набор инструментов со звуками – для инструментальных и миди-дорожек. Для гитары стоит ещё плагин Native Instruments Guitar Rig 5, чтобы из моей акустической делать любые электро-гитары, дистошн, овердрайв и т.д. :)

  69. Merklar

    Я не автор, но думаю смогу ответить…
    if ((score1 == 100) && (score2 == 100)) {
    имя_клипа.gotoAndPlay(номер_кадра);
    }
    Вроде как то так. А теперь вопрос к Евгению) Возможно ли на AS написать онлайн игру? В смысле, например танчики (денди-подобные) на двоих. Второй игрок играет у себя на компе… Вообще поддерживает флеш такую технологию? Спасибо за внимание)

    • admin

      Всё верно)
      Написать онлайн-игру можно. Их же сейчас полно уже! Особенно в вконтакте.
      Тут главное сделать сервер под это дело и хорошую синхронизацию. Почитай на блоге Антона Карлова главу про онлайн игры. Из 12 глав:
      http://www.ant-karlov.ru/kak-sozdat-mnogopolzovatelskuu-igru-anons.html

  70. Alexandrn

    Спасибо, Женя и Merkal! И то верно. Теперь работает. Не пойму, я так тоже пробовал, но ругалась, наверно скобку где-то забыл поставить.
    Поздравительные, Жень!? Круто. Так ты и стихи сам пишешь? )) А у меня в основном грустные песни и мелодии выходят. Так что для игрушек нужно что-то новое придумывать.
    Я вначале яро взялся квест делать, потом забросил. Но скоро вернусь к нему. А потом и ещё один буду делать (вдохновился Empty Room Escape).
    Ну и ещё вопрос. Тут уже не раз спрашивали как сделать так, чтоб в игре сохранялись лучшие результаты. Точнее таблица рекордов из 10 штук. Как вообще сохранять что-либо во флеш играх. Хотя бы как запомнить число пройденных-открытых уровней?
    Спасибо ещё раз огромное!!!

    • admin

      Поздравительные, да)) Когда у кого-то из любимых людей день рождения, то могу “чиркануть” песню :) ) Грустные мелодии я тоже люблю, но на них я сверху делаю смешной текст :D Прикольно получается )
      Для игрушек надо плясать от жанра игры и скорости геймплея :)
      Сохранения и таблицу рекордов можно сделать через SharedObject. Почитай тут:
      http://as3coder.blogspot.com.tr/2010/08/sharedobject.html
      А вот мировую таблицу рекордов сделать так не получиться. Тут уже нужен сервер, где будет храниться информация с лучшими рекордами от всех сыгравших. Она же будет изменяться и загружаться из сети каждому в приложение, если надо конечно.:)

  71. Alexandrn

    Ага. Мировую рекордку мне пока и не надо, а остальное почитаю, попробую разобраться, Жень ))

    • admin

      и тут я вспомнил, что когда я отвечал на такой же вопрос про сохранения, я же сделал пример))) Нашёл. Вот он :)
      https://yadi.sk/d/TLT_XXT9Yv8wh
      Так, думаю, быстрее разберёшься ;)

  72. Alexandrn

    Ооо, отлично, Женя. Спасибо!!! С исходником куда проще )))
    Попробую привязать результат, только у меня не ко времени, а к счёту сбитых врагов. Думаю даже проще!? И останется вопрос с сохранением игрой уровня, на котором остановился. Так? )))

  73. Alexandrn

    Ой, я туплю или лучший результат в исходнике по времени- не за короткое время, а за длительное? Жень, а наоборот как сделать )) ?

    • admin

      наоборот делается наоборот) меняешь условие записи результата да и всё.
      к счету, времени, уровню – всё одинаково просто. Просто выбираешь момент в игре, когда ты будешь записывать данные. Фактически это когда игра закончилась, либо проиграл. Сохраняешь время, кол-во фрагов, номер уровня и всё что хочешь. Сохранять их можно вообще в разное время. Номер уровня когда стартовал новый уровень, кол-во врагов – когда проиграл, время – когда- лучшее время, или чекпоинт прошел.
      При следующем запуске игры просто считываешь эти данные и ставишь начальным уровнем – сохраненный. Можешь даже очки продолжать набирать и время чтобы дальше шло. Даже набор оружия можешь сохранять (в текстовом виде разумеется).
      В этом же файле и таблица рекордов. Просто все данные которые сохраняешь – записываешь в разные переменные. :)

  74. Merklar

    И снова привет. Тут такой вопрос возник… Я делаю реакцию на нажатие кнопки – переход на другой кадр клипа. После чего приложение не активно пока я не клацну мышкой на приложение. Поясню, что подразумивается под неактивностью: весь код продолжает исполняться, кроме реакции на нажатие клавишь. Например, в игре танчики двигаться клавишами возможно, только после нажатие мышкой на приложение. Как это избежать. Уж очень неудобно. Заранее благодарю

    • admin

      Привет:) и снова, по-идиотски сделанный AS 3… Как можно было из такой конфетки как AS 2.0, сделать такой бред…
      Проблема мне знакома. Ещё когда делал дудл, столкнулся с этим. Решается установкой фокуса в кадре. А именно:
      stage.focus=stage;

      p.s. пожалуйста ;)

  75. Merklar

    А подскажи нормально обучение по Старлингу. Ато в сети нашел только http://demiart.ru/forum/index.php?showtopic=183472 и все.

    • admin

      Что-то почитал, что-то просмотрел – вполне хорошее обучение :) Если не единственное… Дофигища надо всего выучить, чтобы пользоваться этим старлингом… И всё ради чего.. ради плавной анимации и всё…..

      Так и хочется сказать – UNITY, привет, я бегу к тебе :D Но и юнити довольно спорная платформа… Хотя сколько смотрел семинаров DEVGamm, многие флешеры перешли на юнити и говорят, что он гораздо лучше. Но опять же, мне не понравилось, что сами люди в юнити, решили в новой версии убрать поддержку старых мобильных телефонов, т.е. игры можно будет сделать только на новые. Обещали ещё сделать работу своих приложений без установки плагина, чего пока что не наблюдается. Хм…

  76. Merklar

    Привет, все никак от тебя отстать не могу. Первое. Чем отличается программирование во Флеш СС от Флеш билдер? Смотрю все советуют писать именно там, но мне гораздо удобнее СС. И второе… Это так, размышление и заготовка на новую игру. Как можно (и можно ли вообще) реализовать эффект слепой зоны. Например вид с верху, гг ходит вокруг колоны, и соответственно за колонной область, которую он не может видеть закрашивается черным. Блин, непонятно объяснил(

    • admin

      Привет :) Флеш СС – это просто очередная (последняя пока что) версия флеша, а флеш билдер, это программа для сборки флеш приложения. Очень странно, что советуют её, а не flash develop.
      В ней ты должен обязательно собирать игру в классах, подключать разные библиотеки, в том числе с графикой игры (SWC-библиотеки), тайлы, и прочие вещи. В общем, всё что ты там делаешь – это пишешь код игры и собираешь всё в кучу.
      Во флеше СС, КС и т.д. ты и рисуешь и пишешь код либо в классах, либо в кадрах, либо комбинированно. Мне так удобнее :) Для тех кто работает в команде скорее всего билдер или девелоп удобнее, художник рисует отдельно, код собирают отдельно, каждый программист пишет свои классы для игры, делает редактор уровней, левелдизайнер отдельно собирает уровни в XML-файлы, музыкант делает музыку, и потом в билдере собирает ещё какой-то программист всё воедино :) Хотя кто его знает… И, вообще, мне удобнее AS 2.0 :) ))

      Про эффект слепой зоны понял сразу, но вот как сделать… Вообще зависит от того какая часть темноты должна быть. Ели половина, то можно сделать тупо по координатам героя, если слева от колонны, то справа колоны – темнота. Если герой с фонариком, или темнота по полю зрения, то сложнее. Можно внутри клипа с колонной сделать темноту на 1/4 квадранта допустим. При движении ГГ вычисляем угол поворота отрезка из координат персонажа и колонны, и на такой же пропорциональный угол поворачиваем темноту.

      Если тень динамическая и, допустим, герой с фонариком приближается к колонне и тень должна увеличиваться, т.к. угол обзора падает, то можно провернуть такую вещь – В клипе с тенью внутри клипа колонны сделать клип в котором тень состоит из множества кадров и начинается с узкой тени и дальше расширяется как веер.
      И запрограммировать так, что когда человек подходит к колонне, в зависимости от расстояния менялся кадр внутри тени, и тень становилась шире, и наоборот :) Удобнее даже номера кадров с тенями подстраивать в ходе тестирования под расстояние. :) ) вот такие мысли у меня как можно такое провернуть :)

  77. Merklar

    Ок спс) это все реализуемо, если колона одна…. а если лабиринт? Да еще с возможностью уничтожения стен… Думаю на флеше тяжеловато реализовать. Возвращаясь в билдерам. Я так понимаю, если в дальнейшем допустим, есть желание работать в команде (ну например официально куда нить трудоустроиться), то все же изучать работу в билдере или девелопере придется?

    • admin

      Если у тебя лабиринт, то просчитывай тени от нескольких ближайших колонн, от всех не надо. Тут надо от игры исходить, что видно, что не видно, может проще сделать наоборот – определять участок со светом, а остальное всё темнота.

      Насчёт работы в команде не знаю… Думаю, зависит от фирмы.

  78. Merklar

    А вот еще что может сказать по такому поводу. У меня уровни в новой игре представляют собой двухмерный массив 30 на 30. Где их можно хранить. Если в теле игры, то много много символов – не скажется ли это на производительности и т.д. И вот например я сделал редактор уровней (я оптимист)), как можно сделать, чтоб он сохранял матрицу уровня допустим в тхт формате в виде матрицы 30 на 30?

    • admin

      А какая разница хранить их в игре или в отдельном swf/xml/txt/as и т.д. файле? Ведь в игре ты из отдельного файла будешь загружать их обратно в игру. На производительности сказывается только то, что работает непосредственно в данном кадре. Т.е. если у тебя 1кк объектов, и ты каждый кадр определяешь реакции с 10 из них, и двигаешь тоже 10, то игра будет летать. Если же ты двигаешь сразу 100-200, то тут уже проблемы начинаются у флеша, такие как проседание фпс, и это не зависит от того, отдельно ты их хранил или в самой игре :) Моё мнение: у as3.0 проблемы с движением даже 1 объекта и без просидания кадров… xD

      p.s. По поводу движка, я сейчас очень пристально смотрю в сторону Citrus Game Engine :) http://citrusengine.com/
      Хоть по нему и нет уроков на русском, но думаю оно того стоит!
      Фактически это Starling + Box2d или Starling + Nape. Там ещё есть вариации, но не столь важные. Там даже урок есть стандартный, по которому ты сможешь перейти на Flash Builder, если хочешь :) В ютюбе есть нерусские уроки по нему + DragonBones (рисование тайлов для игры).
      Вот ещё мини презентация: http://www.slideshare.net/IT_Share/citrus-game-engine
      Удобно, что всю эту движуху можно вставить в AIR и вот тебе кросплатформенное приложение, и без юнити :D
      В общем, советую присмотреться :) Из всех движков какие я нарыл в интернете, это самый то что надо, пока что :) На днях начну пробовать что-то делать на нём.

      Про редактор уровней. А не проще использовать готовый редактор, раз ты хочешь хранить уровни отдельно?:) Например, Ogmo editor. По нему даже уроки есть. Частично вот тут о нем под движок FlashPunk: http://demiart.ru/forum/lofi/index.php/t176492.html

    • admin

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

      Смотрел флешки свои какие надо удалить, и дошёл до дудла. И произошло невероятное!!! Запускал разные версии его, с разным принципом работы, ни 1 лага!!!!!! всё как по маслу. я в шоке. запускал несколько раз. Нашёл свой fla-файл с фонтаном, где я точно определял глюки каждого 4-5 кадров. их нет! О_о Вероятно, эту хрень исправили в новой версии адобовского пакета СС. Наверно всё дело в нём. Пробовал запускать из исходника, подтормаживает иногда (запускает в Adobe Flash Player 16.0.0.235 NPAPI). Пробовал публиковать в браузер (также Adobe Flash Player 16), подтормаживает ещё больше. А если запускать с компа – идеально гладко. С компа – это Adobe Flash Player 11.4 r402, который в \\Adobe Flash CS6\Players\FlashPlayer.exe

      Получается, если адобовцы доведут до ума плагины для браузеров, то там тоже будет гладко и никакие старлинги не нужны :D

  79. Alexandrn

    Жень, так это ж супер!!! Флеш снова будет жить ))).
    Я заметил, что каких-то пару строк текста(шрифты) флешку грузят так, что фпс с 60 до 10 падает через 2-3 цикла. Убрал текст- снова всё летает. Картинки и фотки ему проще кушать.

    • admin

      :) Сложный какой-то у тебя текст :D Не припомню такого в своей практике. Флешу проще кушать картинки и векторные рисунки с галочкой “Cache as bitmap“. А ещё лучше ручная растеризация векторной графики с помощью BitmapData. Флешу будет ещё приятнее :D Кстати, если у тебя текст не динамический (постоянный), можно его преобразовать в картинку, и не будет никаких падений фпс ;) Либо с помощью Ctrl+B, Ctrl+B, F8, и в свойствах поставить “Cache as bitmap“, либо с помощью растеризации кодом с помощью BitmapData, но это посложнее дело :)

  80. Merklar

    Слушай, а ведь реально. Я пересмотрел свои игры и действительно, лаги пропали) Вчера вот понял почему ты обычно используешь псевдотаймер(ну там ++кадр%60*3) и т.д. Наверно часа 2 пытался остановить стандартный таймер в функции из другой. Вставлял его в массив, присваивал глобальной переменной – нифига не выходило) Плюнул и сделал в ентерфрейме твой таймер и вуаля)

    • admin

      Таймер использую такой по 2 причинам :) Во-первых, так проще, меньше писанины, и не нужно рассчитывать миллисекунды. Во-вторых, он точно привязан к кадрам!, и я знаю что ожидать от объектов. Такого не скажешь об обычном таймере, он там сам по себе работает. Даже в моём уроке заметно как они чуть-чуть по-разному двигают объекты. А при просадке fps вообще получаться очень разные результаты :D

  81. Merklar

    Так что, получается, что с растровой графикой Флешу легче работать при рендеринге, чем с вектором?

    • admin

      Вообще-то, да :) Векторная графа – это же графика на куче математических формул, которые нужно просчитывать. А растр – просто картинка. Поэтому в большинстве игр делают растеризацию. Это огромный плюс к производительности. Более того, в некоторых движках графика обязательно должна быть растровой!

  82. Merklar

    Евгений, подскажи, сильно ли АС 2.0 отличается от 3.0? Просто предложили заказ – а там движок только вторую версию поддерживает. Смогу разобраться в нем?

  83. admin

    Да как сказать. Принцип у всех языков программирования один и тот же – Паскальный. Но разная реализация. Если сумеешь находить ответы в интернете на то, как сделать то, что ты хочешь в ас2, то сможешь разобраться :)

  84. Merklar

    Так, я опять тебя решил вопросами доставать)
    1. Как реализуется загрузчик в игре. А именно, вот например я нажал в меню “старт” и грузиться уровень. Появляется какая нить картинка и уровень загрузки. Ну как мувик вставить туда, я думаю догадаюсь, а вот к чему привязать уровень загрузки?
    2. Ты работал с CryEngine 2 или 3? Там просто ХУД и главное меню на акшене.

    • admin

      1. Если файл один, то загрузчик делается только в начале. Если игра состоит из нескольких отдельных файлов, то можно делать загрузчики по мере добавления отдельных файлов. Я где-то выкладывал пример с дудлом. Там загрузчик в начале стоит.
      2. Нет и не собираюсь :)

  85. Merklar

    И еще… ВОт посмотри игрушку http://flashh.ru/game/mirovye-voyny. Есть идеи как реализовано поле? Я понимаю что там двухмерный массив.. А вот каким образом реализовано что несколько рядом стоящих элементов объединяются в одну группу… еще и границами очерчивается.

    • admin

      Посмотрел, не увидел объединения в одну группу, просто меняется цвет, и границы постоянны, меняется цвет. Не знаю как сделано, я бы сделал так:
      • Каждый участок – отдельный мувик, внутри которого сама область разных цветов, и границы 2 цветов.
      • Для каждого участка свой объект, в котором параметры: ссылка на мувик, принадлежность кому-то, количество техники, пехоты, цвет, с кем граничит и т.д.
      • Запихнул все объекты в массив для удобства.
      • Нападать можно на пограничные участки с другим цветом.
      • Тут раскидывание костей, изменение цвета границ и свой алгоритм победы
      • По итогу меняем цвет границ обратно, меняем параметры своего участка, и атакуемого.
      Да вот как-то и всё :) Я бы сделал так) Хотя, вместо объекта можно использовать массивы с разными типами данных, и получится двухмерный массив. :) Как удобнее…

  86. Merklar

    Хех…. там как бы при каждой загрузке – меняются формы… Никакой закономерности не заметил( И вот еще вопрос… Как в АС2 добавить клип из библиотеки? addChild, как я понял – не катит)

    • admin

      загрузил игру снова) и правда, генерит разные карты. Какой-то алгоритм сбора территорий из шестиугольников. Если подумать, можно придумать. :)
      Всё что я бы изменил по сравнению с предыдущим вариантом это генерация территорий каким-то умным кодом, типа мин/мах по длине, мин/мах по ширине и мин/макс на количество шестиугольников.. Как вариант сначала генеришь первый участок любого цвета, и границы шестиугольников, граничащие внутри участка, делаешь невидимые. Потом второй участок и т.д. :)
      Добавление в АС2 так:
      _root.attachMovie(ссылка на клип в библиотеке, новое имя объекта, глубина на сцене)
      Пример:
      _root.attachMovie(“poll”,”poll”, 10);
      poll._x = 10;
      poll._y = 20;

      Добавит клип класса poll, будет называться тоже poll, на 10 уровне глубины.

  87. Merklar

    хм…. А есть команда, чтоб сделать невидимые границы? Но спасибо за ответ, буду думать))) Все таки мне AS 3 больше нравиться чем 2( И подскажи, что это за _root? я его и в 3 встречал.

    • admin

      ты просто не работал в as2 :D не понимаешь всей его прелести и простоты :)
      Команда невидимости 1 – visible, 2 – alpha.
      root – что-то вроде абсолютного расположения (тянуть всё с главной сцены)
      this – относительное (внутри каких-либо объектов)
      Я как-то на демиарте находил статью про root, там целая куча инфы про него…
      В ас3 его не используют в основном, тут используют stage. У которого тоже куча инфы и в разных ситуациях он разный.

  88. Merklar

    Так, хорошо… Вот я добавляю объект, но управлять им не могу( Как в ас3 было – потом добавляешь энтерфрейм к объекту и через него можешь управлять им, а потом удалить. Тут мне даже энтерфрейм не далось добавить(

    • admin

      в ас2 нет никаких энтерфреймов к объекту. есть только _root.onEnterFrame = function() {………. }
      Хотел тебе пару игр своих скинуть, но там туча кода :D Поэтому вот этого я думаю хватит, чтоб ты разобрался:
      https://yadi.sk/d/YB3MlC4weMvDT

  89. Merklar

    Блин( все таки как не привычно с АС 2( А вот за ролики спасибо ! Ну почему старый Scaleform не поддерживает 3 версию языка(

  90. Валерий

    Всем Привет не знаю ответит кто нибудь или нет,у меня такая проблема
    :небольшое слайд шоу ,вставил в кадр музыку ,играет,при возврате на 1 кадр музыка играет заново и накладывается.и не пойму как кнопка может управлять звуком ,включать или отключать звук в слайд шоу.Изучаю язык пару недель так что многого еще не усвоил.И уроки 29 и 30 пересмотрел и пока не понял как это работает. Вот исходник https://yadi.sk/d/q1asPdVOeSPbb помогите если не трудно.

    • admin

      Привет. :) Не знаю что ты хочешь получиться в итоге, но если ты хочешь чтобы музыка играла дальше при прокрутке фотографий, то просто поменяй событие для звука на “начать”.
      Выбираешь кадр со звуком/свойства и в пункте Синхр: выбираешь вместо первого (событие), второе (Начать). Тогда музыка будет играть дальше и не будет накладываться другая, пока эта не закончится.
      Ниже выбираешь количество повторов какое надо. 1,2,3.. или ставишь Цикл, песня будет повторяться вечно.)

      • Валерий

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

        • admin

          https://yadi.sk/d/ZPgRUJikeSw5t
          Думаю подойдёт такое. Если нужно начинать песню сначала после включения звука, тогда нужно делать программный звук (не в кадрах).

          • Валерий

            Спасибо, сижу разбираюсь в скриптах

  91. Валерий

    https://yadi.sk/d/rxwiIAvueSjSy
    звук в первом кадре и играет во всех кадрах,не могу связать звук с кнопкой вкл и выкл .

  92. Merklar

    И снова привет) Вроде чуток разобрался с АС2 ) В некотором роде даже удобнее чем более новая версия. Вот очередная задачка. Как можно сделать чтобы проигрывались видео одно за другим. Но любое из них можно было сбросить например ескейпом. В общем. когда игра запускается – идем видео одной фирмы, потом другой, третей… Если не тяжело конечно) Ну или направь, где почитать можно)

    • admin

      ПРивет:) Вот, ты всего неделю разбираешь АС2, а уже говоришь, что удобнее :D А я его знаю почти 10 лет… он намного удобнее этого глючного ас3.. :)
      ПРо вопрос. А в чем проблема? Сделай условие “если нажата клавиша escape, то переместить кадр в начало следующего видео, если опять нажата, то следующее видео и т.д.
      Хотя зачем тебе это.. обычно видео от фирмы прилепляют с помощью их API и обычно пропустить это видео нельзя. :) Видимо у тебя что-то типа начального ролика в игре и нужна кнопка SKIP.:)

  93. Merklar

    Что то вроде)) Но там игра не флешка) Я там ХУД делаю и главное меню) ВОт и надо прилепить видосы. С скипом я поняла, а вот как сделать, когда видео кончилось – чтоб на новый кадр шло. Я просто с видио не работал пока вообще)

  94. Merklar

    Черт))) написал “поняла”) всмысле понял)

    • admin

      а я уж было подумал что ты девчонка, а я всё время думал неправильно :D Про видео, которое прям видео, ничего сказать не могу :) Тоже не работал с ними. Была у меня как-то книга, где были уроки по созданию видеоплеера, но даже не вспомню кто автор.. По идее должна быть функция по типу “конец видео”, которое возвращает true/false. Но я не знаю.(

  95. Merklar

    Ок) Процесс задалбывания тебя вопросами продолжается… Меня интересует, а есть ли аналог var name_peremenoy = e.currentTarget as MovieClip; только для АС2? В чем собственно дело. Надо прописать функции для изменения настроек клавиш для одной игры. Как в любой игре, когда захотел сменить управление. В общем, чтоб не делать мильен функций ко всем действиям (бег,шаг влево, присесть e.t.c.) хочу сделать одну, но вот никак не могу обратиться к объекту, вызвавшего эту функцию. Пытался сделать это назначением аргумента функции(any_function(обьект)), но у классов scaleform – свой синтаксис написания функции( ПРимерно так:
    моя_кнопка.addEventListener(“click”, this, “название_функции”);
    название_функции() {
    бла бла бла
    }.
    Так, это первое) и второе… Если в АС3 я мог задать кейкод на любую клавишу и при нажатие с таким кодом – тогда вот эта буква, с другим – пробел. Каким образом в ас2 я могу перечислить все клавиши? Да, понимаю, функция будет большая, но а что поделаешь)
    И на последок, пока проблем с этим не было, но на всякий случай. Как удалять функции в ас2? Чтоб допустим на других кадрах она не выполнялась)?
    Фуххх… Извини что навалил столько текста))

  96. Merklar

    Хм.. Тема на актуальна) Вроде все вопросы решил с горем пополам)

    • admin

      Ну вот ты и научился пользоваться гуглом и яндексом :D Хвала Небесам :D Решил и хорошо.)

      • Merklar

        Хех))) Да тут не в этом дело. И если по кодам клавиш – действительно можно найти, то по первому вопросу – нифига. Все излазил)

        • admin

          По поводу смены управления, если бы я захотел, я бы загнался над этой темой и сделал, но менять управление на флеше…. Даже не припомню таких игр. Обычно управление дублируют, не более того. Например, прыжок на кнопку “вверх”, “w” и “пробел”.
          Я, ни scaleform, ни addEventListener никогда не пользовался :D К чему эти загоны в райском ас2 :)
          Почитай тут ещё по теме: http://xitri.com/2009/06/16/simple-platform-flash-game-engine.html
          Тут как раз рассматривается функция
          Key.addListener(this);
          onKeyDown = function () {

  97. Merklar

    Да не) Ты не понял))) Я же не игру делаю) Тут флеш выступает в роли… я даже и не знаю) В общем на нем делаются элементы интерфейса, главное меню, инвентарь и т.д. А scaleform позволяет передавать команды с флена на С++ например (или Луа, Питон и т.д.). Вот и делал игровое меню и настройки)
    П.С. Не знаю, интересно тебе, а может знаешь это, но на флеше с использованием скалеформа сделаны ХУДы WoT, Dragon Age2-3, Ведьмака 2… да и многих других)

    • Merklar

      мда… флена))) флеша

    • admin

      ПОнятно :) Насколько я помню, WoT изначально были на флеше, смотрел выступление их на флешгамме. А потом они решили изменить платформу, чтобы охватить весь рынок и многое поменяли там. Ну да не суть :) Хотя я не знал что, когда пишут игры на С++ ещё подключают флеш xD Он вроде и сам всё умеет делать.
      Ты сейчас описал ситуацию как делаются игры во флеш на старлинге :D Обычным флеш-кодом “делаются элементы интерфейса, главное меню, инвентарь и т.д.”, а вся движуха на Stage3D. :)

  98. Merklar

    И снова привет) Чего то не нашел такого на просторах интернета. Пытаюсь перейти на сайт с помощью getURL(“http://www.site_adress.ru”, _blank); Все в порядке, в самом флеше нормально запускается. Но вот открываю опубликованный фалй (тот, что отдельно СВФ файлом идет, после контр+ентер) – ссылка не открывается( Не пойму почему( Книги перелопатил – не могу найти

    • admin

      Привет.) вопрос это as2 ?
      Если он, то я щас решил этот вопрос тупо убрав http://
      Я думаю что при запуске swf, флеш думает что // это уже комментарий идёт дальше, поэтому ничего не происходит. Хотя фиг знает…

  99. Merklar

    Но ты же понимаешь, что это будет относительный путь((( И он будет открываться от места хранения файла(
    Ладно, буду разбираться(

    • admin

      ахаха :) откуда я знаю, что там относительный путь?) у тебя там написан конкретный сайт :)
      “он будет открываться от места хранения файла”. ну ка поясни, где хранится файл, и что будет открываться?

  100. Merklar

    Не не… тут “не у меня”) Это особенность АС2) Если http:// не ставишь то он открывает – С:/место_хранения/www.lalala.com )) Это не я сказал, так в книгах написано) Ну собственно у меня так и есть) т.е. открываться не будет нифига, т.к. у меня на диске этого сайта нету)

    • admin

      Упс, я чёт не заметил, что он с компа открывает при этом :) Посидел покумекал минут 10, и придумал вот такой тебе ответ :D
      https://yadi.sk/i/XHGFT08Qew8Ya

  101. shoh

    Здравствуйте я бы хотел спросить на какой версии adobe flash cs… вы работаете потому что я пытаюсь писать на cs3 у меня объекты не двигаются.((( помогите пожалуйста, мне кажется что это именно из за версии программы

    • admin

      Привет:) Пинг-понг делал вроде на cs5.5, а сейчас работаю в cs6. вполне может быть из-за версий. В кс3 исходник вообще не откроется. Но если делать игру самому с нуля, то работать должно, потому что actionscript 3.0 один и тот же везде.

      • SHOH

        установил cs6 все делаю по видео, не двигается левая доска, открываю ваш исходник все пашет, такое впечатление что у обработчика движения досок нет доступа до левой ракетки ходя в функции когда в условии if(up) вписываю trace(“фывфыв”); он мне выводит это сообщение при нажатии клавиши вверх, и еще одно у меня выходила ошибка Монтажный кадр 1, слой “Слой 1″, кадр 1 1084: Синтаксическая ошибка: rightbrace перед end of program. пока в свойсвах ракетки не поставлю экспорт для actionScript но и после того как я это делаю мне выводится предупреждение “Определение для этого класса не найдено в каталоге классов Оно будет автоматически сгенерировано в SWF – файле при экспорте” помогите пожалуйста, а то у меня дипломная работа по flash мне еще надо туда бонусные уровни вставить и чуть чуть приукрасить эффектами. Заранее благодарен

        • admin

          Синтаксическая ошибка: rightbrace перед end of program. Не хватает закрывающей фигурной скобки, где-то ты её не поставил. Либо ошибка в знаках, типа: точка, запятые, плюсы и т.д. Экспорт для ракетки не нужен! Ищи ошибки в коде!

  102. Александр

    доброго времени суток admin))
    !!!я просмотрел все ваши уроки по флеш, СПАСИБО за ваш труд)) из всего что я смотрел именно ваши уроки лучше всего наглядно разложились по полочкам в голове..
    и вот решил повторить ваш пинг-понг..это оказалось сложно..но все ошибки раньше находил, а тут вообще ошибку не выдает никакую, и в коде, его внимательно перечитал, ошибок и опечаток нет..сравнил нумирацию строк, все так же как и у вас..
    https://fotki.yandex.ru/next/users/llavaletta/album/517304/view/1162516
    https://fotki.yandex.ru/next/users/llavaletta/album/517304/view/1162517
    доска двигается, ошибок нет, и вроде все нормально, однако, как у вас шарик не двигается, только сменил место положения и все..перезапускал (конт + интер) много раз, и всегда одна и та же картинка..
    остановил видео на 05,44, но сам разобраться и продолжить не могу..
    подскажите, пожалуйста, что я сделал не так?

    • admin

      Привет, Александр. Выложи исходник, по фоткам я ничего сказать не смогу.

      • Александр

        вот исходник ZRKtDhLbTR3sCG2
        спасибо, что ответили))

        • admin

          это не ссылка на исходник, а набор букв.

      • admin

        Вообще-то я просил исходник, а не код. Исходник – это .fla файл.
        Но всё равно ошибка твоя:
        ball.speed = 3;
        ball.xmov = ball.spid;
        ball.ymov = ball.spid;
        а т.к. ball.spid не существовало раньше, значит оно = 0, и мяч никуда не двигается. Тебе нужно ball.xmov = ball.ymov = ball.speed; , а не spid.

        • Александр

          и снова извиняюсь, всегда думал что исходник это код..
          поправил, но все по прежнему..может дело в самом редакторе? установил недавно, а настройки не трогал, все из коробки..но все ваши уроки он выполнял, хотя часто выдавал 1120 и 1084, но сейчас молчит..
          https://yadi.sk/d/RmvfQQA_saSiu
          посмотрите пожалуйста файл..

          • admin

            ошибка ещё вот тут:
            function moveBalls () {
            ball.tempx = ball.clip.x = ball.xmov;
            ball.tempy = ball.clip.y = ball.ymov;
            }
            а должно быть так:
            function moveBalls () {
            ball.tempx = ball.clip.x + ball.xmov;
            ball.tempy = ball.clip.y + ball.ymov;
            }

  103. Олег

    Уважаемый автор. Если бы у нас учителя пытались хотя бы процентов на 30 делать то, что сделали Вы – можно было бы считать, что образование реанимировано. Спасибо Вам.

  104. Hfactor

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

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

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