Главная ReadMe F.A.Q. Регистрация Форум




Что вы ищите?
flash игры
flash уроки
flash программы
просто серфлю
ничего
Система Orphus
Популярные новости!
» flash юмор:Animator vs Animation
» Flash программа: Flash Decompiler Trillix v4.0.0.7 ...
» flash журнал скоро!
» Идея проекта
» Браузерная flash игра (этап 1): Движек игры боевки
Случайные новости!
» Обучение к программе: Selteco Alligator Flash Desi ...
» Шаблон сайта Flash template Myflashxml cl1b
» новости сайта: Внимание на сайте сделан парсер код ...
» 19 способов повысить производительность actionscri ...
» статья: Все возможности нового Adobe Flash CS4 Pro ...
» flash урок: Анимация при помощи Bone Tool и Bind T ...
» flash игра: endless war 1, 2, 3 - Бесконечные войн ...
Архив
Июнь 2009 (30)
Май 2009 (18)
Апрель 2009 (15)
Март 2009 (24)
Февраль 2009 (23)
Январь 2009 (14)


Внимание! У Вас появился шанс изучить все секреты Flash анимации! Перейти из разряда новичка в разряд опытного пользователя даже без посещения дорогих репетиторов и толстенных толмутов "библий пользователя".

Более 100 уроков записанных с экрана компьютера в превосходном качестве помогут пройти, Вам, терни Flash анимации кратчайшим путём!

Подробнее!..

Браузерная flash игра (этап 1): Движек игры боевки

5 июня 2009

рабочая версия (параметры можно менять):







Вот так она выглядит. На премию лучший дизайн года она конечно не претендует, но от не это и не требуется.


 


Вот код самого движка:


var redW:Array = new Array;            //массив переменных Красного
var ylwW:Array = new Array;            //массив переменных Желтого
var hod:Timer;                        //Таймер хода
var kUdar:Number = 30;                //Базовое повреждение
var kBlok:Number = 18;                //базовая защита
 
start_btn.addEventListener(MouseEvent.CLICK, bitva, false, 0, true)//обработчик нажатия кнопки БОЙ!!!
 
function bitva(e:MouseEvent):void { //запуск битвы шариков
    ustanovka();        //начальные установки
    hod = new Timer(1000, 200);        //создаем таймер
    hod.addEventListener(TimerEvent.TIMER, vibor, false, 0, true);        //обработка событий при наступлении хода
    hod.start();        //вкл. таймер
}
 
function ustanovka():void { //установка начальных значений
    RedLife.LifeLine.width = 200;        //линия жизни красного в 100%
    YellowLife.LifeLine.width = 200;    //линия жизни желтого в 100%
    start_btn.visible = false;            //убираем кнопку до конца битвы
    info_txt.text = "";                    //очистка поля сообщений
    redW[0] = 1 + Number(pwrRed.text) / 10;                                    //коэф силы удара
    redW[1] = 1 + Number(rztRed.text) / 10;                                    //коэф блока
    redW[2] = 2 - Number(spdRed.text) / 10;                                    //прыткость
    redW[3] = 0.1 + Number(spdRed.text) / 100 + Number(rztRed.text) / 100;    //шанс уклонится
    redW[4]    = redW[2];                                                        //шкала хода
    ylwW[0] = 1 + Number(pwrYellow.text) / 10;
    ylwW[1] = 1 + Number(rztYellow.text) / 10;
    ylwW[2] = 2 - Number(spdYellow.text) / 10;
    ylwW[3] = 0.1 + (Number(spdYellow.text) / 100 + Number(rztYellow.text) / 100) * 1.4;
    ylwW[4] = ylwW[2];
}
 
function vibor(e:TimerEvent):void {     //запуск битвы шариков
    var udacha:Number;        //степень удачи при равном проворстве
    if (redW[4] < ylwW[4]) {        //если шкала красного меньше то его ход
        goRed();
    } else if (redW[4] > ylwW[4]) {    //если желтого то его
        goYellow();
    } else {            //если равны то жребий
        udacha = Math.random()* 4 -2;
        if (udacha <=0) {
            goRed();
        } else {
            goYellow();
        }
    }
}
 
function goRed():void {        //ход красного
    var udar:Number;        //удар
    var blok:Number;        //блок
    var uron:Number;        //урон
    var promach:Number;        //промах
   
    redW[4] = redW[4] + redW[2];    //увеличиваем значение шкалы красного
    udar = Math.round((Math.random()* kUdar) * redW[0]);    //расчет величины удара
    info_txt.appendText("Красный бьет Желтого на " + String(udar) + "n");
    promach = Math.random();        //расчет вероятности промаха
    if (promach <= ylwW[3]) {
        info_txt.appendText("... но промахивается" + "n");
        info_txt.appendText("" + "n");
        return;
    }
    blok = Math.round((Math.random()* kBlok + 1) * ylwW[1]);    //расчет кол-ва поглощенной энергии
    if (blok > udar) {
        blok = udar;
    }
    info_txt.appendText("Защита Желтого поглотила " + String(blok) + "n");
    uron = udar - blok;
    if (uron < 0) {
        uron = 0;
    }
    info_txt.appendText("Желтый ранен на  " + String(uron) + "n");
    info_txt.appendText("" + "n");
    if (YellowLife.LifeLine.width - uron * 2 > 0) {   //если после этого удара желтый жив то уменьшить полосу жизни
        YellowLife.LifeLine.width = YellowLife.LifeLine.width - uron * 2;
    } else { //если умирает то полосу в 0
        YellowLife.LifeLine.width = 0;
        info_txt.appendText("Желтый убит!!!" + "n");
        start_btn.visible = true;
        hod.removeEventListener(TimerEvent.TIMER, vibor);    //выключаем обработку событий от таймера
    }
    info_txt.scrollV = info_txt.maxScrollV;        //прокрутка поля сообщений
}
 
function goYellow():void { //ход желтого. Все также как и у красного
    var udar:Number;
    var blok:Number;
    var uron:Number;
    var promach:Number;
   
    ylwW[4] = ylwW[4] + ylwW[2];
    udar = Math.round((Math.random()* kUdar) * ylwW[0]);
    info_txt.appendText("Желтый бьет Красного на " + String(udar) + "n");
    promach = Math.random();
    if (promach <= redW[3]) {
        info_txt.appendText("... но промахивается" + "n");
        info_txt.appendText("" + "n");
        return;
    }
    blok = Math.round((Math.random()* kBlok + 1) * redW[1]);
    if (blok > udar) {
        blok = udar;
    }
    info_txt.appendText("Защита Красного поглотила " + String(blok) + "n");
    uron = udar - blok;
    if (uron < 0) {
        uron = 0;
    }
    info_txt.appendText("Красный ранен на  " + String(uron) + "n");
    info_txt.appendText("" + "n");
    if (RedLife.LifeLine.width - uron * 2 > 0) {
        RedLife.LifeLine.width = RedLife.LifeLine.width - uron * 2;
    } else {
        RedLife.LifeLine.width = 0;
        info_txt.appendText("Красный убит!!!" + "n");
        start_btn.visible = true;
        hod.removeEventListener(TimerEvent.TIMER, vibor);
    }
    info_txt.scrollV = info_txt.maxScrollV;
}
<p> </p>
 

где, RedLife и YellowLife - это одинаковые мувиклипы шириной 200 пикселей. Они содержат в себе мувиклип LifeLine (синяя полоска жизни) шириной 200 пикселей.


info_txt - текстовое поле внизу, в него выводится информация по значениям удара, блока и повреждения.


6 текстовых полей (pwrRed и другие) - поля для ввода значения соотв. пораметра (все они по умолчанию 3, но вы можете указать свое)


start_btn - кнопка запускающая бой.


Как работает:


Параметры шариков:


Сила удара - влияет на силу первоначального удара.


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


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


После того как пользователь выставит значения параметров шариков (если захочет) он для начала поединка должен нажать на кнопку БОЙ!!!


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


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


Задача: Персонаж с наибольшим параметром должен ходить чаще.


Реализация: Персонажи будут ходить в соответствии с собственными шкалами хода. Т.е. на этапе анализа хода, выбирается персонаж у которого значение шкалы хода ниже. Как только наступает ход к шкале хода данного персанажа прибавляется значение коэффициента хода (он у меня назван прыткостью)) и расчитывается он по формуле: прыткость = 2 - проворство / 10 , выше значение проворства, тем меньше значение прыткости и тем чаще будет ходить персонаж.


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


Думаю я все изложил! Если будут вопросы, обязательно задавайте, отвечу!


С уважением, Aloran.


Скачть исходник: battle.fla [53 Kb] (cкачиваний: 41)

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

Другие новости по теме:

  • flash урок: Молния на actionscript3
  • flash урок: Random Boxes Text Effect with Actionscript 3
  • flash урок: MP3-плеер c XML-плейлистом
  • flash урок: Обалденный эфект!!! ActionScript 2.0
  • Немного о журнале #4: вроде ошибка, а вроде и нет?



  •  (голосов: 2)
    Aloran | Просмотров:487 | Напечатать
    #1 написал: Fly (5 июня 2009 12:42)


    Группа: Администраторы
    Регистрация: 21.07.2008
    Комментариев: 186
    Публикаций: 41
    Республика Беларусь, Минск
    выложи исходник :)


    --------------------
    1) Админ всегда прав
    2) Если админ не прав, смотри пункт 1

    Мы в контакте - https://vkontakte.ru/club9573247
    ICQ: 207886769
    #2 написал: SarGun (5 июня 2009 13:47)


    Группа: Модератор форума
    Регистрация: 10.12.2008
    Комментариев: 26
    Публикаций: 7
    Украина,
    отлично! clapping


    --------------------
    https://vkontakte.ru/id11898899
    ICQ: 420260217
    #3 написал: TeT (5 июня 2009 15:37)


    Группа: Посетители
    Регистрация: 8.02.2009
    Комментариев: 47
    Публикаций: 5
    Украина, Евпатория
    Класс!


    --------------------
    Keyboard not found. Press any key to continue
    ICQ: 8096403
    #4 написал: Fly (5 июня 2009 16:36)


    Группа: Администраторы
    Регистрация: 21.07.2008
    Комментариев: 186
    Публикаций: 41
    Республика Беларусь, Минск
    Самый крутой скил выходит проворство :)

    Хотя если поставить сопротивление на 50, тогда попасть друг по другу не реально )

    В общем интересная штука, хоть и сырая


    --------------------
    1) Админ всегда прав
    2) Если админ не прав, смотри пункт 1

    Мы в контакте - https://vkontakte.ru/club9573247
    ICQ: 207886769
    #5 написал: Aloran (5 июня 2009 16:44)


    Группа: Журналисты
    Регистрация: 6.03.2009
    Комментариев: 78
    Публикаций: 10
    Россия, Ульяновск
    Цитата: Fly
    Самый крутой скил выходит проворство :)

    Хотя если поставить сопротивление на 50, тогда попасть друг по другу не реально )

    В общем интересная штука, хоть и сырая



    Ну это я указал. Есть замечательный выход из этих ситуации. Это изменить формулы. Я кое что сделал, но хотел бы что бы народ на сайте поломал голову слегка. Это полезно.


    --------------------
    Учитель достается тому, кто его достает!
    ICQ: --
    #6 написал: switcher (5 июня 2009 18:47)


    Группа: Посетители
    Регистрация: 14.05.2009
    Комментариев: 20
    Публикаций: 0
    Россия, Москва

    Хотя если поставить сопротивление на 50, тогда попасть друг по другу не реально )


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

    А выход из ситуации - первое что пришло в голову: ввести не показываемый параметр усталости, который это самое сопротивление будет постепенно уменьшать. Ведь нельзя ж вечно "свежим" в бою быть. smile А заодно до кучи - к силе и ловкости это можно припахать, просто в других пропорциях.
    ICQ: --
    #7 написал: Aloran (5 июня 2009 18:51)


    Группа: Журналисты
    Регистрация: 6.03.2009
    Комментариев: 78
    Публикаций: 10
    Россия, Ульяновск
    switcher,

    Ты предлагаешь усложнение. А есть способы, ограничившись тем, что уже имеем и только переписав формулу, сделать данный вариант игры более сбалансированным.


    --------------------
    Учитель достается тому, кто его достает!
    ICQ: --
    #8 написал: switcher (5 июня 2009 19:41)


    Группа: Посетители
    Регистрация: 14.05.2009
    Комментариев: 20
    Публикаций: 0
    Россия, Москва
    Aloran

    Ты предлагаешь мне подумать. А есть способы... а нет никаких способов, нужно думать xaxa xaxa
    Ча пораскинем мозгами umnik только код сперва разберу
    ICQ: --
    #9 написал: Aloran (5 июня 2009 22:57)


    Группа: Журналисты
    Регистрация: 6.03.2009
    Комментариев: 78
    Публикаций: 10
    Россия, Ульяновск
    switcher,

    Мой способ ты увидишь в первом видеоуроке от меня. Где данная программулина будет реализована несколько иначе... dance


    --------------------
    Учитель достается тому, кто его достает!
    ICQ: --
    #10 написал: switcher (5 июня 2009 23:50)


    Группа: Посетители
    Регистрация: 14.05.2009
    Комментариев: 20
    Публикаций: 0
    Россия, Москва
    На самом деле задачу изменения формул СИЛЬНО осложняет отсутствие четких основ и жизненных законов. Т.е. с одной стороны не понятно ДО каких высот может прыгнуть скилы сопротивления и проворства, а с другой стороны не понятны механизмы происхождения промаха.

    Что касается первого, я ориентировался по максимуму в 99 пунктов для каждого скила (если больше, придется еще подключать тему, что 100% это не 100 пунктов)
    Что касается второго, то ты за систему расчета взял одну из многих. Взял, понятно дело - примерно (для схематичности), но от балды. Что сильно отвлекает/

    Итак, вот мною обработанная оригинальная формула:
    redW[3] = 0.1 + 0,5*(Number(spdRed.text) + Number(rztRed.text))/100
    ICQ: --
    #11 написал: Aloran (6 июня 2009 00:42)


    Группа: Журналисты
    Регистрация: 6.03.2009
    Комментариев: 78
    Публикаций: 10
    Россия, Ульяновск
    switcher,

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


    --------------------
    Учитель достается тому, кто его достает!
    ICQ: --
    #12 написал: switcher (6 июня 2009 01:41)


    Группа: Посетители
    Регистрация: 14.05.2009
    Комментариев: 20
    Публикаций: 0
    Россия, Москва
    оке! goodgood
    ориентировался в первую очередь по явному косяку. Ча посмотрю, что с блоками и ударами не так.
    И в добавок по формуле вышеописанной: думаю, если чар - тупой валенок, и у него проворливость и сопротивление по нулям, то 10% на шанс увернуться многовато будет scratch .
    Да, и кстати - проглядел. При этих "...= 0.1 + ..." формула осталась уязвимой.
    ICQ: --
    #13 написал: Aloran (6 июня 2009 11:29)


    Группа: Журналисты
    Регистрация: 6.03.2009
    Комментариев: 78
    Публикаций: 10
    Россия, Ульяновск
    switcher,

    Эта формула была введена с целью сбалансировать уж очень крутую силу. Без нее воин 6/3/3 в легкую выносил воина с 3/6/3 и с 3/3/6 (тесты проходили в основном с этими параметрами), а так хоть что то похожее на баланс было.


    --------------------
    Учитель достается тому, кто его достает!
    ICQ: --
    #14 написал: rate95 (9 июня 2009 10:00)


    Группа: Посетители
    Регистрация: 8.06.2009
    Комментариев: 2
    Публикаций: 0
    Россия, Москва
    извините, просто я во Flash приложениях пока не шарю sorry (вот хочу научится) - а где вписывать этот код?? dontknow
    ICQ: --
    #15 написал: Aloran (9 июня 2009 13:59)


    Группа: Журналисты
    Регистрация: 6.03.2009
    Комментариев: 78
    Публикаций: 10
    Россия, Ульяновск
    rate95,

    Код вписывать надо в первый кадр флешки. Заведи для этого отдельный слой. А вообще если ты только начал изучать флеш. То посмотри уроки для новичков. Они есть в видео формате на этом сайте. Это просто урок для среднего уровня. Читать мы же с букваря начинаем, а не с "Войны и мира")))
    И извиняться не надо. Тут все свои)))) Удачи в освоении!


    --------------------
    Учитель достается тому, кто его достает!
    ICQ: --
    #16 написал: Viruz (21 июня 2009 21:25)


    Группа: Посетители
    Регистрация: 22.06.2009
    Комментариев: 1
    Публикаций: 0
    Украина, Киев
    классно.....постараемся разобрать....просто мы игру онлайн браузерную делайм...и хотим реализовать бои как в Дваре, Космиксе и т.д. в общем в 2D но на коде как это выглядет кодер пожимает плечами....может разберем сей код....а вообще были б рады какой-то помощи...
    ICQ: 409799457
    #17 написал: rb (26 июня 2009 06:52)


    Группа: Посетители
    Регистрация: 26.06.2009
    Комментариев: 10
    Публикаций: 1
    Россия, Владивосток
    так можно и flash c.s. создать
    ICQ: --
    Информация
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
    Видео Журнал "Легко о Flash" - подписавшись на него вы будете один раз в месяц получать его выпуск на свой почтовый ящик, там вы найдете новые видео уроки по работе в программе Adobe Flash CS4.

    Ваш e-mail:

    Ваше имя на русском:
    политика антиспама
    подпишитесь сейчас и получите доступ ко всем выпущенным журналам
    Логин
    Пароль
     

    return_links(2); ?> return_links(2); ?> return_links(1); ?> return_links(); ?>

    Требуется для просмотраFlash Player 9 или выше.

    Показать все теги


    Рейтинг@Mail.ru Rating All.BY Каталог SiteCreation rate your site
    links
    Internet Map page counter