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

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

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

 

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

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;
} 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Создайте свою первую игру во Flash!

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

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

Уже в ближайшее время, после изучения курса и тренировки вы сможете создать свою первую flash игру-платформер, и чем чёрт не шутит - продать её!

Создайте свою первую игру прямо сейчас!

Комментарии

Аватар пользователя Fly

выложи исходник :)

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

Мы в контакте -

Аватар пользователя SarGun

отлично!

clapping

Аватар пользователя TeT

Класс!

Keyboard not found. Press any key to continue

Аватар пользователя Fly

Самый крутой скил выходит проворство :)

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

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

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

Мы в контакте -

Аватар пользователя Aloran
Цитата: Fly

Самый крутой скил выходит проворство :)

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

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

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

Аватар пользователя switcher

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

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

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

smile

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

<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. &quot;Совершенный код&quot;</b>

Аватар пользователя Aloran

switcher,

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

Аватар пользователя switcher

Aloran

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

xaxa

xaxa

Ча пораскинем мозгами

umnik

только код сперва разберу

<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. &quot;Совершенный код&quot;</b>

Аватар пользователя Aloran

switcher,

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

dance

Аватар пользователя switcher

На самом деле задачу изменения формул СИЛЬНО осложняет отсутствие четких основ и жизненных законов. Т.е. с одной стороны не понятно ДО каких высот может прыгнуть скилы сопротивления и проворства, а с другой стороны не понятны механизмы происхождения промаха.

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

Итак, вот мною обработанная оригинальная формула:

redW[3] = 0.1 + 0,5*(Number(spdRed.text) + Number(rztRed.text))/100

<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. &quot;Совершенный код&quot;</b>

Аватар пользователя Aloran

switcher,

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

Аватар пользователя switcher

оке!

goodgood

ориентировался в первую очередь по явному косяку. Ча посмотрю, что с блоками и ударами не так.
И в добавок по формуле вышеописанной: думаю, если чар - тупой валенок, и у него проворливость и сопротивление по нулям, то 10% на шанс увернуться многовато будет

scratch

.
Да, и кстати - проглядел. При этих "...= 0.1 + ..." формула осталась уязвимой.

<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. &quot;Совершенный код&quot;</b>

Аватар пользователя Aloran

switcher,

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

Аватар пользователя rate95

извините, просто я во Flash приложениях пока не шарю

sorry

(вот хочу научится) - а где вписывать этот код??

dontknow

Аватар пользователя Aloran

rate95,

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

Аватар пользователя Viruz

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

Аватар пользователя rb

так можно и flash c.s. создать