Как создавать свои Flash-игры, подобные Angry Birds и World of Goo?
Box2D - это библиотека, которая моделирует физическое поведение твердых тел в двумерном пространстве. Программисты могут использовать ее в своих играх, чтобы сделать...
Вот так она выглядит. На премию лучший дизайн года она конечно не претендует, но от не это и не требуется.
Вот код самого движка:
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 игру-платформер, и чем чёрт не шутит - продать её!
Комментарии
выложи исходник :)
1) Админ всегда прав
2) Если админ не прав, смотри пункт 1
Мы в контакте -
#2 Опубликовано 5 июня, 2009 - 13:47 пользователем SarGun
https://vk.com/app3088598
#3 Опубликовано 5 июня, 2009 - 15:37 пользователем TeT
#4 Опубликовано 5 июня, 2009 - 16:36 пользователем Fly
отлично!
Класс!
Keyboard not found. Press any key to continue
Самый крутой скил выходит проворство :)
Хотя если поставить сопротивление на 50, тогда попасть друг по другу не реально )
В общем интересная штука, хоть и сырая
1) Админ всегда прав
2) Если админ не прав, смотри пункт 1
Мы в контакте -
#5 Опубликовано 5 июня, 2009 - 16:44 пользователем Aloran
Цитата: Fly
#6 Опубликовано 5 июня, 2009 - 18:47 пользователем switcher
#7 Опубликовано 5 июня, 2009 - 18:51 пользователем Aloran
#8 Опубликовано 5 июня, 2009 - 19:41 пользователем switcher
#9 Опубликовано 5 июня, 2009 - 22:57 пользователем Aloran
#10 Опубликовано 5 июня, 2009 - 23:50 пользователем switcher
#11 Опубликовано 6 июня, 2009 - 00:42 пользователем Aloran
#12 Опубликовано 6 июня, 2009 - 01:41 пользователем switcher
#13 Опубликовано 6 июня, 2009 - 11:29 пользователем Aloran
#14 Опубликовано 9 июня, 2009 - 10:00 пользователем rate95
#15 Опубликовано 9 июня, 2009 - 13:59 пользователем Aloran
#16 Опубликовано 21 июня, 2009 - 21:25 пользователем Viruz
#17 Опубликовано 26 июня, 2009 - 06:52 пользователем rb
Самый крутой скил выходит проворство :)
Хотя если поставить сопротивление на 50, тогда попасть друг по другу не реально )
В общем интересная штука, хоть и сырая
Ну это я указал. Есть замечательный выход из этих ситуации. Это изменить формулы. Я кое что сделал, но хотел бы что бы народ на сайте поломал голову слегка. Это полезно.
Хотя если поставить сопротивление на 50, тогда попасть друг по другу не реально )
можно, но сложно - в среднем в полминуты наносится один удар. Правда... через минут 5-ть бой у меня остановился и новый текст соответственно не появлялся. НО игра не зависла... хз... может глюк.
А выход из ситуации - первое что пришло в голову: ввести не показываемый параметр усталости, который это самое сопротивление будет постепенно уменьшать. Ведь нельзя ж вечно "свежим" в бою быть.
А заодно до кучи - к силе и ловкости это можно припахать, просто в других пропорциях.
<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. "Совершенный код"</b>
switcher,
Ты предлагаешь усложнение. А есть способы, ограничившись тем, что уже имеем и только переписав формулу, сделать данный вариант игры более сбалансированным.
Aloran
Ты предлагаешь мне подумать. А есть способы... а нет никаких способов, нужно думать
Ча пораскинем мозгами
только код сперва разберу
<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. "Совершенный код"</b>
switcher,
Мой способ ты увидишь в первом видеоуроке от меня. Где данная программулина будет реализована несколько иначе...
На самом деле задачу изменения формул СИЛЬНО осложняет отсутствие четких основ и жизненных законов. Т.е. с одной стороны не понятно ДО каких высот может прыгнуть скилы сопротивления и проворства, а с другой стороны не понятны механизмы происхождения промаха.
Что касается первого, я ориентировался по максимуму в 99 пунктов для каждого скила (если больше, придется еще подключать тему, что 100% это не 100 пунктов)
Что касается второго, то ты за систему расчета взял одну из многих. Взял, понятно дело - примерно (для схематичности), но от балды. Что сильно отвлекает/
Итак, вот мною обработанная оригинальная формула:
redW[3] = 0.1 + 0,5*(Number(spdRed.text) + Number(rztRed.text))/100
<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. "Совершенный код"</b>
switcher,
Ты изменил лишь шанс уклониться от атаки полностью. Но краеугольный камень там расчет удара и блока. Я принцип их полностью пересмотрел. А вообще хоть формулы были взяты из головы (как любая из учебников по математики или физике или еще бог знает откуда), в них был вложен смысл)))) Который я к сожалению могу описать мысленно но не словами))))
оке!
ориентировался в первую очередь по явному косяку. Ча посмотрю, что с блоками и ударами не так.
И в добавок по формуле вышеописанной: думаю, если чар - тупой валенок, и у него проворливость и сопротивление по нулям, то 10% на шанс увернуться многовато будет
.
Да, и кстати - проглядел. При этих "...= 0.1 + ..." формула осталась уязвимой.
<i>Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете</i><br /><b>Стив Макконнел. "Совершенный код"</b>
switcher,
Эта формула была введена с целью сбалансировать уж очень крутую силу. Без нее воин 6/3/3 в легкую выносил воина с 3/6/3 и с 3/3/6 (тесты проходили в основном с этими параметрами), а так хоть что то похожее на баланс было.
извините, просто я во Flash приложениях пока не шарю
(вот хочу научится) - а где вписывать этот код??
rate95,
Код вписывать надо в первый кадр флешки. Заведи для этого отдельный слой. А вообще если ты только начал изучать флеш. То посмотри уроки для новичков. Они есть в видео формате на этом сайте. Это просто урок для среднего уровня. Читать мы же с букваря начинаем, а не с "Войны и мира")))
И извиняться не надо. Тут все свои)))) Удачи в освоении!
классно.....постараемся разобрать....просто мы игру онлайн браузерную делайм...и хотим реализовать бои как в Дваре, Космиксе и т.д. в общем в 2D но на коде как это выглядет кодер пожимает плечами....может разберем сей код....а вообще были б рады какой-то помощи...
так можно и flash c.s. создать