close

Вход

Забыли?

вход по аккаунту

?

poyasnitelnaya zapiska(12)

код для вставкиСкачать
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. ОБЩАЯ ЧАСТЬ
1.1. Цель разработки
1.2. Анализ средств программирования
1.2.1. Обзор методов решения
1.2.2. Описание языка
1.2.2.1. Html
1.2.2.2. Css
1.2.2.3. JavaScript
2. СПЕЦИАЛЬНАЯ ЧАСТЬ
2.1. Постановка задачи
2.1.1. Назначение задачи
2.1.2. Технико-математическое описание задачи
2.1.3. Требования к аппаратным и программным средствам
2.2. Описание механизмов игры и структура кода
2.2.1 Глобальные переменные
2.2.2 Общедоступные служебные функции
2.2.2.1 Add_pxbool
2.2.2.2 Add_StOM
2.2.2.3 alert_1
2.2.2.4 alert_1_hide
2.2.2.5 create_object
2.2.2.6 create_object_once
2.2.2.7 find_uid
2.2.2.8 getBoolFromXY
2.2.2.9 getBoolFromXY2
2.2.2.10 lose_1,restart_1
2.2.2.11 make_uid
2.2.2.12 null_obj
2.2.2.13 rndColor
2.2.3 Инициализация игры и уровня
2.2.4 MainBlock
2.2.4.1 Перемещение и анимирование персонажей
2.2.4.2 Взаимодействие персонажей
2.2.4.3 Массив особых объектов
2.2.5 Основные объекты игры 2.2.5.1Ferum
2.2.5.2 Dark_1
2.2.5.3 Blood
2.2.5.4 Hostile_dynamic_1
2.2.5.5 Wood_floor_1
2.2.5.6 Wood_box_1
2.2.5.7 Stair_1
2.2.5.8 Wood_door_1
2.2.5.9 Key_1
3.ЭКОНОМИЧЕСКАЯ ЧАСТЬ
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ 1 Исходный кодуровней и неупомянутых объектов
ПРИЛОЖЕНИЕ 2 Результаты работы программы
Введение.
На заре цивилизации видеоигр самой популярной формой их были компьютерные игры. Изначально компьютерные игры, по существу, контролировались компьютером. Игроки взаимодействовали с устройством, чтобы достичь предопределенных задач и целей. Видеоигры - это тоже форма компьютерных игр в том отношении, что дисплей с движущимся изображением принимается за основу. Дисплей непосредственно разработан, чтобы обеспечить игрока обратной связью во время игры. Видео и компьютерные игры стали чрезвычайно популярными в течение трех последних десятилетий. Однако, они не всегда были модной тенденцией. Эти игры начали свое существование почти пятью десятилетиями ранее, но в первые годы не пользовались особым спросом.
С тех пор видеоигры прошли многие этапы эволюции. Современная технология и нововведения помогли создать реалистичные и интерактивные игры. Развлекательные игры не были настолько развиты, когда концепция только появилась. Просто, подобно другим формам технологии, видеоиграм пришлось эволюционировать многие поколения. Это, своего рода, свидетельство быстрого развития видеоигр. Эра 32х и 64х битных видеоконсолей была пятым поколением видеоигр. Эра 16-ти биток была четвертым поколением игровых видеоконсолей. 1983 и 1984 годы были "черным днем" в истории видеоигр. Индустрия испытала неожиданное падение и внезапный крах бизнеса видеоигр. Многочисленные домашние компьютеры и компании-производители видеоигр объявили о банкротстве. Этот крах также привел к концу второго поколения видеоигр.
Сегодня игровой видеорынок стабилен и развивается быстрыми темпами. Популярность видеоигр охватывает все возрастные группы. Определенные игры разрабатываются, чтобы достичь образовательных целей посредством игр. В видеоигры обычно играют, чтобы расслабиться или развлечься. Однако, многочисленные игры, оказывается, вызывают зависимость. Ряд родителей и членов семьи жалуются на поведение, вызываемое подобной зависимостью. Эта тенденция отмечается особенно у детей и юношей, которые иногда теряют чувство времени из-за видеоигр.
1. ОБЩАЯ ЧАСТЬ
1.1. Цель разработки
Целью разработки проекта является создание и разработка игры, с максимально гибким для редактирования кода. То есть получение уникального и универсального "движка" игры. При этом получаемая игра должна быть совместима с максимальным количеством устройств.
1.2. Анализ средств программирования
1.2.1. Обзор методов решения
Для реализации данного проекта была выбрана webплатформа, то есть комплекс языков программирование JavaScript, HTML, CSS. Тройка этих языков разработана, прежде всего для сайтов, но нативный JavaScript позволяет выжать из сайта гораздо больше.
1.2.2. Описание языка
1.2.2.1 Html
HTML (от англ. HyperText Markup Language - "язык разметки гипертекста") - стандартный язык разметки документов во Всемирной паутине. Большинство веб-страниц создаются при помощи языка HTML (или XHTML). Язык HTML интерпретируется браузерами и отображается в виде документа в удобной для человека форме.
Язык HTML был разработан британским учёным Тимом Бернерсом-Ли приблизительно в 1986-1991 годах в стенах Европейского Центра ядерных исследований в Женеве (Швейцария). HTML создавался как язык для обмена научной и технической документацией, пригодный для использования людьми, не являющимися специалистами в области вёрстки. HTML успешно справлялся с проблемой сложности SGML путём определения небольшого набора структурных и семантических элементов - дескрипторов. Дескрипторы также часто называют "тегами". С помощью HTML можно легко создать относительно простой, но красиво оформленный документ. Помимо упрощения структуры документа, в HTML внесена поддержка гипертекста. Мультимедийные возможности были добавлены позже.
Изначально язык HTML был задуман и создан как средство структурирования и форматирования документов без их привязки к средствам воспроизведения (отображения). В идеале, текст с разметкой HTML должен был без стилистических и структурных искажений воспроизводиться на оборудовании с различной технической оснащённостью (цветной экран современного компьютера, монохромный экран органайзера, ограниченный по размерам экран мобильного телефона или устройства и программы голосового воспроизведения текстов). Однако современное применение HTML очень далеко от его изначальной задачи. Например, тег <TABLE> предназначен для создания в документах таблиц, но, часто используется и для оформления размещения элементов на странице. С течением времени основная идея платформа независимости языка HTML была принесена в жертву современным потребностям в мультимедийном и графическом оформлении.
HTML - теговый язык разметки документов. Любой документ на языке HTML представляет собой набор элементов, причём начало и конец каждого элемента обозначается специальными пометками - тегами. Элементы могут быть пустыми, то есть не содержащими никакого текста и других данных (например, тег перевода строки <br>). В этом случае обычно не указывается закрывающий тег. Кроме того, элементы могут иметь атрибуты, определяющие какие-либо их свойства (например, размер шрифта для элемента font). Атрибуты указываются в открывающем теге. Вот примеры фрагментов HTML-документа:
<strong>Текст между двумя тегами - открывающим и закрывающим.</strong>
<ahref="http://www.example.com">Здесь элемент содержит атрибут href, то есть гиперссылку.</a>
А вот пример пустого элемента: <br>
Регистр, в котором набрано имя элемента и имена атрибутов, в HTML значения не имеет (в отличие от XHTML). Элементы могут быть вложенными. Например, следующий код:
<b>
Этот текст будет полужирным,
<i>а этот - ещё и курсивным</i>
</b>
даст такой результат:
Этот текст будет полужирным, а этот - ещё и курсивным
Кроме элементов, в HTML-документах есть и сущности (англ. entities) - "специальные символы". Сущности начинаются с символа амперсанда и имеют вид &имя; или &#NNNN;, где NNNN - код символа в Юникоде в десятичной системе счисления.
Например, &copy; - знак авторского права ((c)). Как правило, сущности используются для представления символов, отсутствующих в кодировке документа, или же для представления "специальных" символов: &amp; - амперсанда (&), &lt; - символа "меньше" (<) и &gt; - символа "больше" (>), которые некорректно записывать "обычным" образом, из-за их особого значения в HTML.
Каждый HTML-документ, отвечающий спецификации HTML какой-либо версии, должен начинаться со строки объявления версии HTML<!DOCTYPE...>, которая обычно выглядит примерно так:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
Если эта строка не указана, то добиться корректного отображения документа в браузере становится труднее.
Далее обозначается начало и конец документа тегами <html> и </html> соответственно. Внутри этих тегов должны находиться теги заголовка (<head></head>) и тела (<body></body>) документа.
1.2.2.2 Css
CSS (англ. CascadingStyleSheets - каскадные таблицы стилей) - формальный язык описания внешнего вида документа, написанного с использованием языка разметки.
Преимущественно используется как средство описания, оформления внешнего вида веб-страниц, написанных с помощью языков разметки HTML и XHTML, но может также применяться к любым XML-документам.
CSS используется создателями веб-страниц для задания цветов, шрифтов, расположения отдельных блоков и других аспектов представления внешнего вида этих веб-страниц. Основной целью разработки CSS являлось разделение описания логической структуры веб-страницы (которое производится с помощью HTML или других языков разметки) от описания внешнего вида этой веб-страницы (которое теперь производится с помощью формального языка CSS). Такое разделение может увеличить доступность документа, предоставить большую гибкость и возможность управления его представлением, а также уменьшить сложность и повторяемость в структурном содержимом. Кроме того, CSS позволяет представлять один и тот же документ в различных стилях или методах вывода, таких как экранное представление, печатное представление, чтение голосом (специальным голосовым браузером или программой чтения с экрана), или при выводе устройствами, использующими шрифт Брайля.
До появления CSS оформление веб-страниц осуществлялось исключительно средствами HTML, непосредственно внутри содержимого документа. Однако с появлением CSS стало возможным принципиальное разделение содержания и представления документа. За счёт этого нововведения стало возможным лёгкое применение единого стиля оформления для массы схожих документов, а также быстрое изменение этого оформления.
Преимущества:
Несколько дизайнов страницы для разных устройств просмотра. Например, на экране дизайн будет рассчитан на большую ширину, во время печати меню не будет выводиться, а на КПК и сотовом телефоне меню будет следовать за содержимым.
Уменьшение времени загрузки страниц сайта за счет переноса правил представления данных в отдельный CSS-файл. В этом случае браузер загружает только структуру документа и данные, хранимые на странице, а представление этих данных загружается браузером только один раз и может быть закэшировано.
Простота последующего изменения дизайна. Не нужно править каждую страницу, а лишь изменить CSS-файл.
Дополнительные возможности оформления. Например, с помощью CSS-вёрстки можно сделать блок текста, который остальной текст будет обтекать (например для меню) или сделать так, чтобы меню было всегда видно при прокрутке страницы.
Недостатки:
Различное отображение вёрстки в различных браузерах (особенно устаревших), которые по-разному интерпретируют одни и те же данные CSS.
Часто встречающаяся необходимость на практике исправлять не только один CSS-файл, но и теги HTML, которые сложным и ненаглядным способом связаны с селекторами CSS, что иногда сводит на нет простоту применения единых файлов стилей и значительно удлиняет время редактирования и тестирования.
1.2.2.3JavaScript
JavaScript - прототипно-ориентированный сценарный язык программирования. Является диалектом языка ECMAScript.
JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам.
Основные архитектурные черты: динамическая типизация, слабая типизация, автоматическое управление памятью, прототипное программирование, функции как объекты первого класса.
На JavaScript оказали влияние многие языки, при разработке была цель сделать язык похожим на Java, но при этом лёгким для использования непрограммистами. Языком JavaScript не владеет какая-либо компания или организация, что отличает его от ряда языков программирования, используемых в веб-разработке.
Название "JavaScript" является зарегистрированным товарным знаком компании Oracle Corporation.
Текстовые документы, содержащие разметку на языке HTML (такие документы традиционно имеют расширение .html или .htm), обрабатываются специальными приложениями, которые отображают документ в его форматированном виде. Такие приложения, называемые "браузерами" или "интернет-обозревателями", обычно предоставляют пользователю удобный интерфейс для запроса веб-страниц, их просмотра (и вывода на иные внешние устройства) и, при необходимости, отправки введённых пользователем данных на сервер. Наиболее популярными на сегодняшний день браузерами являются GoogleChrome, MozillaFirefox, Opera, InternetExplorer и Safari.
В середине 1990-х годов основные производители браузеров - компании Netscape и Microsoft - начали внедрять собственные наборы элементов в HTML-разметку. Создалась путаница из различных конструкций для работы во Всемирной паутине, доступных для просмотра то в одном, то в другом браузере. Особенно большие трудности были при создании кросс-браузерных программ на языке JavaScript. Веб-мастерам приходилось создавать несколько вариантов страниц или прибегать к другим ухищрениям. На какое-то время проблема потеряла актуальность по двум причинам:
Из-за вытеснения браузером InternetExplorer всех остальных браузеров. Соответственно, проблема веб-мастеров становилась проблемой пользователей альтернативных браузеров.
Благодаря усилиям производителей других браузеров, которые либо следовали стандартам W3C (как Mozilla и Opera), либо пытались создать максимальную совместимость с InternetExplorer.
На современном этапе можно констатировать рост популярности браузеров, следующих рекомендациям W3C (это MozillaFirefox и другие браузеры на движке Gecko; Safari, GoogleChrome, Opera и другие браузеры на движке WebKit;). Доля InternetExplorer на данный момент составляет менее 30 %.
В современной практике существует возможность упростить разработку кросс-браузерных программ на языке JavaScript с помощью различных библиотек и фреймворков.
JavaScript является объектно-ориентированным языком, но используемое в языке прототипирование обуславливает отличия в работе с объектами по сравнению с традиционными класс-ориентированными языками. Кроме того, JavaScript имеет ряд свойств, присущих функциональным языкам - функции как объекты первого класса, объекты как списки, карринг, анонимные функции, замыкания - что придаёт языку дополнительную гибкость.
Несмотря на схожий с Си синтаксис, JavaScript по сравнению с языком Си имеет коренные отличия:
объекты, с возможностью интроспекции;
функции как объекты первого класса;
автоматическое приведение типов;
автоматическая сборка мусора;
анонимные функции.
В языке отсутствуют такие полезные вещи, как:
модульная система: JavaScript не предоставляет возможности управлять зависимостями и изоляцией областей видимости;
стандартная библиотека: в частности, отсутствует интерфейс программирования приложений по работе с файловой системой, управлению потоками ввода/вывода, базовых типов для бинарных данных;
стандартные интерфейсы к веб-серверам и базам данных;
система управления пакетами, которая бы отслеживала зависимости и автоматически устанавливала их.
Для добавления JavaScript-кода на страницу, можно использовать теги <script></script>, которые рекомендуется, но не обязательно, помещать внутри контейнера <head>. Контейнеров <script> в одном документе может быть сколько угодно. Атрибут "type='text/javascript'" указывать необязательно, так как по умолчанию стоит javascript.
Скрипт, выводящий модальное окно с классической надписью "Hello, World!" внутри браузера:
<script type="text/javascript">
alert('Hello, World!');
</script>
Расположение внутри тега
Спецификация HTML описывает набор атрибутов, используемых для задания обработчиков событий. Пример использования:
<ahref="delete.php" onclick="returnconfirm('Выуверены?');">Удалить</a>
В приведённом примере при нажатии на ссылку функция confirm('Вы уверены?'); вызывает модальное окно с надписью "Вы уверены?", а returnfalse; блокирует переход по ссылке. Разумеется, этот код будет работать только если в браузере есть и включена поддержка JavaScript, иначе переход по ссылке произойдёт без предупреждения.
Использование кода JavaScript в контексте разметки страницы в рамках ненавязчивого JavaScript расценивается как плохая практика. Аналогом (при условии снабжения ссылки идентификатором alertLink)
<ahref="delete.php" id="alertLink">Удалить</a>
приведённого примера может выступать, например, следующий фрагмент JavaScript:
window.onload = function() {
var linkWithAlert = document.getElementById("alertLink");
linkWithAlert.onclick = function() {
return confirm('Вы уверены?');
};
};
Вынесение в отдельный файл
Есть и третья возможность подключения JavaScript - написать скрипт в отдельном файле, а потом подключить его с помощью конструкции
<script type="text/javascript" src="http://Путь_к_файлу_со_скриптом"></script>
Атрибуты элемента script
Элемент script, широко используемый для подключения к странице JavaScript, имеет несколько атрибутов.
Обязательный атрибут type для указания MIME-типа содержимого.
В запросе комментариев RFC-4329, определяющемMIME-тип, соответствующий JavaScript, указано:
Известно, что использование "text" в качестве типа верхнего уровня данного типа содержимого проблематично. Поэтому данный документ определяет text/javascript и text/ecmascript, отмечая их "устаревшими". Использование экспериментальных и незарегистрированных медиатипов, таких как перечисленные в части выше, не приветствуется.
Медиатипы
application/javascript,
application/ecmascript,
которые также определяются в этом документе, предназначены для практического использования, им следует отдавать предпочтение.
Однако, согласно спецификации HTML 4.01 в качестве значения type должно быть указано устаревшее "text/javascript". Так как JavaScript является языком программирования по умолчанию во всех браузерах, начиная с Netscape 2, Дуглас Крокфорд придерживается мнения о нецелесообразности использования атрибута type, рекомендуя указывать его в XHTML, так как, хотя он, по мнению Крокфорда, и не нужен, но обязателен, и не указывать в HTML.
необязательный атрибут src, принимающий в качестве значения адрес к файлу со скриптом.
необязательный атрибут charset, используемый вместе с src для указания используемой кодировки внешнего файла.
необязательный атрибут defer указывает, что получение скрипта происходит асинхронно, но выполнение следует отложить до тех пора, пока страница не будет загружена целиком.
необязательный атрибут async указывает, что получение скрипта происходит асинхронно, а выполнение будет произведено сразу по завершению скачивания. Очередность выполнения скриптов не гарантируется.
При этом атрибут language (language="JavaScript"), несмотря на его активное использование (в 2008 году этот атрибут был наиболее часто используемым у тега <script>), относится к не рекомендуемым (deprecated), отсутствует в DTD, поэтому считается некорректным.
2. СПЕЦИАЛЬНАЯ ЧАСТЬ
2.1. Постановка задачи
2.1.1.Назначение задачи
Создание универсального кода, на основе которого, можно построить любую компьютерную игру с двумерной графикой. 2.1.2. Технико-математическое описание задачи
Т.к. программа ориентирована под любые запросы программистов, формулы используются внутри проектов, построенных на этом "движке".
2.1.3. Требования к аппаратным и программным средствам
Для запуска проекта подойдет любое устройство с процессором построенном на одной из архитектур: Arm, x86, x64.
2.2 Описание механизмов игры и структуры кода
2.2.1 Глобальныепеременные
var startis=0;
<html onclick="if(startis==0){start();startis=1;}" >
Запуск игры по клику мыши происходит если только startis=0.
var hero2;
varhero1;
hero1, hero2переменные, которые будет содержать объект главного персонажа.
varheroStartX=100;
varheroStartY=600;
Эти две переменные будут хранить стартовые координаты главного героя. Причем на каждом уровне они будут изменяться.
varhpin="";
hpin будет содержать полосу здоровья.
varalert_1_bool=false;
true - значит была вызвана функцияalert_1.
varKeysDiv;
В дальнейшем будет занесен объект, который содержит изображения ключей от дверей, подобранных персонажем.
var is_key=new Array();
массив ключей.
is_key[0]=0;не используемый элемент массива.
is_key[1]=0;// Green
is_key[2]=0;// Yellow
is_key[3]=0;// Orange
is_key[4]=0;// Red
is_key[5]=0;// Dark blue
is_key[6]=0;// Blue
is_key[7]=0;// Purple
значение каждого элемента соответствует количеству ключей определенного цвета, которые будут взяты главным героем.
varwidth;
varheight;
ширина и высота элемента страницы document.body
varIterations=0;
количество итераций выполненных функциейmainblock.
vargame_over=function(){};
В случае смертельного поражения персонажа запускается функция game_over. На каждом уровне своя функция для этой ситуации.
varlevel_init=level_1_init;
level_init ссылка на функцию инициализации уровня. varlvl_name="";
наименование текущего уровня.
varmainBool=true;
Функция mainblock выполняет итерации только если mainBool=true.
varNSTEP_OPTION=2;
В целях оптимизации работа с матрицей pixelsBool, в циклах осуществляется с шагом взятым из этой переменной.
varStateObjs=newArray();
Массив идентификаторов объектов, которые не должны повторно инициализироваться
var PersForMain=new Array();
Массивперсонажей.
varObjForMain=newArray();
Массив объектов со свойством obj.Action. Где свойство Action это функиция, которая будет запущенна c из mainblock. В качестве аргументов функции выступят переменная OJ, индекс объекта и сам объект.
varpixelsBool=newArray();
Матрица размером 1000 на 768. Содержитзначения: 0, 1, 2.
varpixelsBlocks=newArray();
Матрица с таким же размером. Содержитобъектыигры.
varStaticObjectMatrix=newArray();
Матрица с таким же размером. Содержит объекты игры.
2.2.2 Общедоступные служебные функции.
2.2.2.1 Add_pxbool - Заполняет определенное место матрицы pixelsBoolопределенными значениями.
Аргументы:
x,y - координаты области
w,h -ширина и высота области
c - значение, которым заполняется область
Пример вызова:
Add_pxbool(1,10,50,50,2);
Примечание. В целях оптимизации область заполняется столбцами.
Кодфункции:
function Add_pxbool(x,y,w,h,c)
{for(var xi=x;xi<x+w;xi+=5)
{for(var yi=y;yi<y+h;yi++)
{pixelsBool[xi][yi]=c;
pixelsBool[xi+1][yi]=c;}}}
2.2.2.2 Add_StOM - Заполняет объектом определенное место матрицы StaticObjectMatrix.
Аргументы:
x,y - координаты области
w,h -ширина и высота области
c - объект, которым заполняется область
Пример вызова:
Add_StOM(1,10,50,50,document.getElementById("wood_floor_54"));
Примечание. В целях оптимизации область заполняется столбцами. Используется на пару с предыдущей функцией. Т.к. значение 2, элемента матрицы pixelsBool, гласит о том, что в этой же координате в матрице StaticObjectMatrix, есть объект. И у этого объекта есть свойство obj.Reaction, которое нужно выполнить, если персонаж коснулся координаты.
Кодфункции:
function Add_StOM(x,y,w,h,c)
{for(var xi=x;xi<x+w;xi+=5)
{for(var yi=y;yi<y+h;yi++)
{StaticObjectMatrix[xi][yi]=c;
StaticObjectMatrix[xi+1][yi]=c;}}}
2.2.2.3 alert_1 - Отображает на странице окно с текстом и работающими кнопками.
Аргументы:
text - переменная содержит HTMLкод для отображения
f - объект обладающий свойством f (функция кнопка, которую необходимо выполнить по нажатию на "ок").
Примервызова:
varo = {f : function(){
alert("вынажалиок");
}}
alert_1("test",o);
Примечание. Перед запуском требуется содержание на странице элемента с idalert. Окно исчезает при помощи следующей функции.
Код функции:
functionalert_1(text,f)
{
if(!alert_1_bool){alert_1_bool=true;
var o=document.getElementById("alert");o.style.zIndex="10000";
o.style.visibility="visible";o.innerHTML="";
o.innerHTML="<br><br><br><br><div style='width:996px;text-align:center;background:#909090;border:2px solid #303030;'>"+text+"<br><input type='button' value='ok' id='alert_ok'/></div>";
document.getElementById("alert_ok").onclick=function(event){alert_1_hide();f.f();};
}
}
2.2.2.4 alert_1_hide - применяет необходимый для скрытия стиль окну alert
Аргументов нет.
Пример вызова:
alert_1_hide();
Примечание. В процессе игры вызывается нажатием клавиши "Esc"
Кодфункции:
function alert_1_hide()
{document.getElementById("alert").style.visibility="hidden";alert_1_bool=false;
hero1.setAttribute("space",0);}
2.2.2.5 create_object - создает и возвращает элемент на странице. Элементу задаются определенные стили.
Аргументы:
w,h - ширина и высота элемента
x,y - координаты элемента
back_url - содержит значение, которое необходимо присвоить стилю background элемента.
Примервызова:
var tmp=create_object(100,10,100,100,"url('back.png')");var tmp=create_object(100,10,100,100,"url('back.png')");
Примечание. Возвращает элемент с присвоенными свойствами x, y, w, h. Элемент обладает абсолютным позиционированием. В качестве родительского элемента используется body.
Кодфункции:
functioncreate_object(w,h,x,y,back_url)
{
if(x<=0){x=0}if(y<=0){y=1}
if(x>=width){x=width-w}if(y>=height){y=height-h}
var block=document.createElement("div");
block.style.position="absolute";
block.style.background=back_url;
block.style.width=w+"px";
block.style.height=h+"px";
block.style.marginTop=y+"px";
block.style.marginLeft=x+"px";
block.x=x;block.y=y;
block.w=w;block.h=h;
document.body.appendChild(block);
return block;
}
2.2.2.6 create_object_once - Является аналогом предыдущей функции, но с единственным отличием. Элемент создается только, если его уникального идентификатора нет глобальном массивеStateObjs, в противном случае возвращает false. Аргументы:
w,h - ширина и высота элемента
x,y - координаты элемента
back_url - содержит значение, которое необходимо присвоить стилю background элемента.
Примервызова:
var tmp=create_object_once(100,10,100,100,"url('back.png')");
if(tmp){tmp.k=1;}
else{tmp=null_obj();}
Примечание. Элемент обладает теми же свойствами, как и в предыдущей ситуации. Если элемент нельзя создать в этой точке, то вернет ложь.
Кодфункции:
function create_object_once(w,h,x,y,back_url)
{
if(x<=0){x=0}if(y<=0){y=1}
if(x>=width){x=width-w}if(y>=height){y=height-h}
var block=document.createElement("div");
block.style.position="absolute";
block.style.background=back_url;
block.style.width=w+"px";
block.style.height=h+"px";
block.style.marginTop=y+"px";
block.style.marginLeft=x+"px";
block.x=x;block.y=y;
block.w=w;block.h=h;
if(!find_uid(block,x,y)){
document.body.appendChild(block);
return block;}
else
{return false;} }
2.2.2.7 find_uid - Возвращает истину или ложь в зависимости от результата поиска идентификатора в массиве StateObjs.
Аргументы:
obj - объект, который не следует повторно создовать
Примервызова:
varblock=document.createElement("div");
blok.x=10;block.y=20;
if(!find_uid(block,x,y)){
document.body.appendChild(block); }
Примечание. Использует свойства объекта obj.x и obj.y. Также необходимо наличие глобальной переменной lvl_name.
Кодфункции.
function find_uid(obj)
{
var uid=lvl_name+","+obj.x+","+obj.y;
for(var i=0;i<StateObjs.length;i++)
{
if(uid==StateObjs[i])
{return true;}
}
return false;
}
2.2.2.8 getBoolFromXY -Функция служит для поиска в указанной области одной из строк матрицы pixelsBools единиц и двоек. Если в области отсутствуют единицы, вернет нуль. Если есть двойки, то запустит функцию reactionобъекта матрицы StaticObjectMatrix. Если есть единица вернет один и расстояние до нее.
Аргументы:
hero - персонаж, который перемещается по данной области
x, y - координаты для поиска
w - ширина поиска
Пример вызова:
varob=hero1;x=10;y=100,m=100,l=1;
var o =ob.getAttribute("uskor");
var kol=0;
var s=ob.gostep(m,l,o);var i=y;
while(i<=y+74)
{
if (getBoolFromXY(ob,x+46,i,s)!=1) {kol++}
else{goright_ferum.x=getBoolFromXY.x-1;ob.setAttribute("uskor",0);return -1}
i++;
}
if(kol==75){return x+s;}
Этот пример взят из управляющей функции главного персонажа. Управляющая функция возвращает новый х, куда следует переместить персонажа, если по дороге до нового х, нету препятствий.
Примечание. Поиск происходит слева направо. Поиск по матрице происходит с шагом в NSTEP_OPTION.
Кодфункции:
function getBoolFromXY(hero,x,y,w)
{
for(i=parseInt(x);i<=x+w;i+=NSTEP_OPTION){
if(pixelsBool[i][parseInt(y)]==1){getBoolFromXY.x=i;return 1;}
else{if((pixelsBool[i][parseInt(y)]==2)&&(StaticObjectMatrix[i][parseInt(y)].RunBool==0)&&(hero.ReactionBool))
{StaticObjectMatrix[i][parseInt(y)].Reaction(hero,i,parseInt(y));}}
}
return 0;
}
2.2.2.9 getBoolFromXY2 - Аналогичная функция, только поиск происходит справо налево.
Аргументы:
hero - персонаж, который перемещается по данной области
x, y - координаты для поиска
w - ширина поиска, начало поиска х, конец х-w
Кодфункции:
function getBoolFromXY2(hero,x,y,w)
{
for(i=parseInt(x+w);i>=x;i-=NSTEP_OPTION){
if(pixelsBool[i][parseInt(y)]==1){getBoolFromXY2.x=i;return 1;}
else{if((pixelsBool[i][parseInt(y)]==2)&&(StaticObjectMatrix[i][parseInt(y)].RunBool==0)&&(hero.ReactionBool))
{StaticObjectMatrix[i][parseInt(y)].Reaction(hero,i,parseInt(y));}}
}
return 0;
}
2.2.2.10lose_1,restart_1- lose_1 останавливает процесс игры и передает управление функциеrestart_1, которая в свою очередь оживляет главного персонажа свойством hero.live, и возобновляет процесс игры.
Аргументы:
lose_1: hero - персонаж, который был умерщвлен.
Примервызова:
rose_1(hero);
restart_1();
Кодфункций:
function lose_1(hero)
{if(mainBool){if(hero.hname=="Hero"){
setTimeout(restart_1,1000)
mainBool=false;}}
}
function restart_1()
{
hero1.live(hero1);
hpin.style.width="96px";
mainBool=true;
mainblock();
}
2.2.2.11 make_uid - создает уникальный идентификатор объекта и записывает его в массив StateObj.
Аргументы:
obj- объект, который не следует повторно создавать
Пример вызова:
varobj={};
obj.x=10;obj.y=10;
lvl_name="level_1";
make_uid(obj);
Примечание. Использует глобальную переменную lvl_name и свойства координат объекта. К объекту, переданного функцие, добавляется свойство obj.uid.
Код функции:
function make_uid(obj)
{
obj.uid=StateObjs.length;
StateObjs[obj.uid]=lvl_name+","+obj.x+","+obj.y;
}
2.2.2.12 null_obj - возвращает пустой элемент, не существующий на странице.
Аргументовнет.
Кодфункции:
functionnull_obj()
{returndocument.createElement("div");}
2.2.2.13 rndColor- возвращает случайное выражение типа: "rgb(255,255,255)".
Аргументов нет.
Код функции:
functionrndColor()
{return "rgb("+parseInt(Math.random()*256)+", "+parseInt(Math.random()*256)+", "+parseInt(Math.random()*256)+")";}
2.2.3 Инициализация игры и уровня
Первым делом для старта игры запускаем соответствующую функциюstart, с кодом:
function start()
{
clear_lvl();
mainblock();
}
Как мы видим, эта функция передает управление другим функциям - clear_lvl, mainblock.
function clear_lvl()
{
mainBool=false;
PersForMain=new Array();
ObjForMain=new Array();
document.onkeydown=keyDownListener;
document.onkeyup=keyUpListener;
game_state_init();
mainBool=true;
mainInit();
level_init();
}
clear_lvl - выполняет следующие действия:
mainBool=false; останавливаем процесс игры.
PersForMain=new Array();
ObjForMain=new Array();
document.body.innerHTML="";
Очищаеммассивыиэлемент body.
document.onkeydown=keyDownListener;
document.onkeyup=keyUpListener;
Назначаем функции для обработки нажатия клавиш.
game_state_init();
Вызываем функцию, которая добавит на страницу элементы интерфейса, среди которых есть здоровье и ключи.
Еекод:
function game_state_init()
{
hero1="";
var hp=document.createElement("div");
var al=document.createElement("div");
hpin=document.createElement("div");
hp.style.position="absolute";
hpin.style.position="absolute";
hp.style.width="120px";
hp.style.background="url('hp.png')";
hpin.style.background="url('hp_in.png')";
hp.style.height="32px";
hpin.style.width="96px";
hpin.style.height="21px";
hpin.style.marginLeft="12px";
hpin.style.marginTop="5px";
al.id="alert";
document.body.appendChild(al);
document.body.appendChild(hp);
document.body.appendChild(hpin);
var keys_div=document.createElement("div");
keys_div.style.position="absolute";
keys_div.style.marginLeft="200px";
keys_div.style.marginTop="5px"; keys_div.style.width="500px";
keys_div.style.height="50px";
document.body.appendChild(keys_div);
KeysDiv=keys_div;
show_keys();
}
mainBool=true;
Возобновляем процесс игры.
mainInit();
Вызываем служебную инициализацию"движка". В процессе инициализации применяется новый стиль страницы и заполняется нулями глобальные матрицы.
Кодэтойфункции:
function mainInit()
{
width=1000;height=768;
document.body.style.width=width;
document.body.style.marginLeft="3px";
document.body.style.height=height;
document.body.style.border="1px solid black";
document.body.setAttribute("class","block");
for(i=0;i<=width;i++)
{pixelsBool[i]=new Array();
pixelsBlocks[i]=new Array();
StaticObjectMatrix[i]=new Array();
for(j=0;j<=height+5;j++)
{
pixelsBool[i][j]=0;
pixelsBlocks[i][j]=0;
StaticObjectMatrix[i][j]=0;
if(i==0){pixelsBool[i][j]=1;}
if(i==1){pixelsBool[i][j]=1;}
if(i==2){pixelsBool[i][j]=1;}
if(i==width){pixelsBool[i][j]=1;}
if(i==width-1){pixelsBool[i][j]=1;}
if(i==width-2){pixelsBool[i][j]=1;}
if(j==0){pixelsBool[i][j]=1;}
if(j==height){pixelsBool[i][j]=1;}
if(j==height+1){pixelsBool[i][j]=1;}
if(j==height+2){pixelsBool[i][j]=1;}
if(j==height+3){pixelsBool[i][j]=1;}
if(j==height+4){pixelsBool[i][j]=1;}
if(j==height+5){pixelsBool[i][j]=1;}
}
}
}
level_init();
вызываем инициализацию уровня.
2.2.4 Mainblock
После того, как выполнены все необходимые предстартовые процессы, вызывается главная функция mainblock. Буквально все происходящее в игры запускает mainblock. Собственно говоря, это мы можем увидеть на модульном представлении процессов игры:
Итерации mainblock повторяются каждые 30 миллисекунд. Работа функции в частности состоит в том, чтобы обрабатывать атрибуты персонажей и запускать действия "особых" объектов игры. Атрибуты персонажей отражают состояние предопределенных клавиш клавиатуры. Если клавиша зажата, то значение атрибута равно единице. В противном случае значение равно нулю. По сочетанию некоторых истинных атрибутов, вызываются определенные управляющие функции. Все управляющие функции хранит в себе обрабатываемый персонаж. Так называемые "особые" объекты игры - это объекты, которые требует запуска своих функций из главного блока. Вызов необходимых функций происходит после передачи объекта, со свойством Action, в общедоступный массив ObjForMain. Кодфункцииmainblock:
function mainblock()
{if(mainBool){
Iterations++;
for(Per=0;Per<PersForMain.length;Per++)
{
var hero=PersForMain[Per];
var stand_bool=hero.stand_bool;
var mass=parseInt(hero.getAttribute("mass"));
var lvlup=parseInt(hero.getAttribute("lvlup"));
var lvlgo=parseInt(hero.getAttribute("lvlgo"));
var up=hero.getAttribute("up");
var left=hero.getAttribute("left");
var right=hero.getAttribute("right");
var down=hero.getAttribute("down");
var atack=hero.getAttribute("atack");
var def=hero.getAttribute("def");
if(up==0){hero.setAttribute("jumplast",0)}
x=hero.x;
y=hero.y;
if(hero.die_bool)
{left=0;right=0;down=0;up=0;atack=0;
if(hero.stand_bool==1)
{setTimeout(hero.die,1000,hero)}
}
//animate xod
if((left==1)&&(right==0)&&(up==0)&&((atack==0)||(stand_bool==0))) {
hero.goAnimateLeft(hero);
}
if((left==0)&&(right==1)&&(up==0)&&((atack==0)||(stand_bool==0))) {
hero.goAnimateRight(hero);
}
if((up==1)&&(left==1))
{
hero.goAnimateUpLeft(hero);
}
if((up==1)&&(right==1))
{
hero.goAnimateUpRight(hero);
}
// E N D animate
//up, right
if ((up==1)&&(left==0)&&(right==1)&&(down==0)) { hero.UpRight(hero,x,y,mass,lvlup,lvlgo); } //up, left
if ((up==1)&&(left==1)&&(right==0)&&(down==0)) { hero.UpLeft(hero,x,y,mass,lvlup,lvlgo);
}
//up
if ((up==1)&&(left==0)&&(right==0)&&(down==0)) { hero.Up(hero,x,y,mass,lvlup,lvlgo);
}
//down
if ((up==0)&&(left==0)&&(right==0)&&(down==1)) { hero.Down(hero,x,y,mass,lvlup,lvlgo);
}
//down right
if ((up==0)&&(left==0)&&(right==1)&&(down==1)&&((atack==0)||(stand_bool==0))) { hero.DownRight(hero,x,y,mass,lvlup,lvlgo);
}
//down left
if ((up==0)&&(left==1)&&(right==0)&&(down==1)&&((atack==0)||(stand_bool==0))) { hero.DownLeft(hero,x,y,mass,lvlup,lvlgo);
}
//right
if ((up==0)&&(left==0)&&(right==1)&&(down==0)&&((atack==0)||(stand_bool==0))) {
hero.Right(hero,x,y,mass,lvlgo);
}
//left
if ((up==0)&&(left==1)&&(right==0)&&(down==0)&&((atack==0)||(stand_bool==0))) {
hero.Left(hero,x,y,mass,lvlgo);
}
//nothing
if ((up==0)&&(left==0)&&(right==0)&&(down==0)) {
if(stand_bool==0){
hero.Nothing(hero,x,y,mass,lvlgo);}
else
{
if(def==0)
{hero.Nothing(hero,x,y,mass,lvlgo); }
else
{ hero.def(hero);}
}
}
//up, left, right
if ((left==1)&&(right==1)&&(up==1)&&(down==0)) {
hero.Up(hero,x,y,mass,lvlup,lvlgo);
}
//down, left, right
if ((left==1)&&(right==1)&&(up==0)&&(down=1)) {
hero.Down(hero,x,y,mass,lvlup,lvlgo);
}
//atack
if(((atack==1)&&(stand_bool==1))||(hero.atack_i<hero.atack_iend))
{
hero.Atack(hero,x,y,mass,lvlgo);
}
if((atack==0)&&(hero.last_atack_bool))
{hero.Atack_off(hero);}
if((left==1)&&(right==0)){hero.setAttribute("lastbutt","left");}
if((right==1)&&(left==0)){hero.setAttribute("lastbutt","right");}
if((hero.last_def)&&(def==0))
{hero.def_off(hero);} }
for(OJ=0;OJ<ObjForMain.length;OJ++)
{
ObjForMain[OJ].Action(ObjForMain[OJ],OJ);
}
setTimeout(mainblock,30);}}
Первым делом главный блок определяет значение булевой переменной mainBool и продолжает работу, если она истинна. Далее инкриминирует переменную Iterations. Обработка атрибутов персонажей, взятых из глобального массива PersForMain, происходит в цикле, где переменной для индекса является Per. Перед тем как запускать управляющие функции из модуля main_iter,
главный блок проверяет значение свойства персонажа hero.die_bool. Если персонаж "мертв", то значение свойства истинно, а значение атрибутов left, right, up, down, attack обнуляется.
if(hero.die_bool)
{left=0;right=0;down=0;up=0;atack=0;
if(hero.stand_bool==1)
{setTimeout(hero.die,1000,hero)}
}
В результате персонаж падает, а когда приземлится (свойство hero.stand_boolотражает состояние "приземленности" персонажа единицей или нулем), вызывается функция, взятая из свойства hero.die.Запуск которой происходитпо истечению 1000 миллисекунд.
2.2.4.1 Перемещение и анимирование персонажей
Одной из управляющих функций является функция анимации персонажа (goAnimateLeft), которая работает (меняет фон персонажа), когда зажата только клавиша "влево", и персонаж на земле. if((left==1)&&(right==0)&&(up==0)&&((atack==0)||(stand_bool==0))) {
hero.goAnimateLeft(hero);
}
Ей передается в качестве аргумента сам персонаж, доступный на текущей итерации. А частым случаем ее кода является:
functiongoAnimateLeft_ferum(hero)
{var ai=hero.getAttribute("animi");
if(ai>=16){ ai=1; }
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/lrun/"+ai+ ".png') no-repeat;\" ></div>";
ai++; hero.setAttribute("animi",ai);}
Первой инициализируемой переменной становится счетчик кадров ai, взятый из атрибутаanimi. В случае если aiбольше или рамен 16, его значение сбрасывается до единицы. Т.к. персонаж это элемент страницы, то его содержимым становится htmlкод зависящий от счетчика кадров, вида:
<div style=\"position:absolute;width:45px;height:75px;
background:url('Objects/dynamic/ferum/animation/lrun/"+ai+ ".png') no-repeat;\" ></div>
Следующим примером управляющих станет функция перемещения героя влево (Left). Ее вызов происходит как и в предыдущей ситуации.
if ((up==0)&&(left==1)&&(right==0)&&(down==0)&&((atack==0)||(stand_bool==0)))
{
hero.Left(hero,x,y,mass,lvlgo);
}
Аргументами стали как переменные, взятые из свойств персонажа, x,y,mass,lvlgo, так и сам персонаж hero:
x,y - текущие координаты героя
mass - его предположительная масса
lvlgo-и уровень, влияющий на скорость перемещения
Частный случай кода функции Left является:
function Left_ferum(hero,x,y,mass,lvlgo)
{
var a=hero.goleft(hero,x,y,mass,lvlgo);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";
var o=hero.getAttribute("uskor");o++;
if(o<17){hero.setAttribute("uskor",o)}}
else{hero.x=hero.goleft.x+1;hero.style.marginLeft=hero.x+"px";}
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
Прежде чем объяснить этот код указанный выше, сначала разберем функции goleft и gravity (модуль moving_funcs).
function gravity_ferum(ob,x,y)
{ var h=ob.h+1;
var kol=0;
var gi= parseInt( ob.getAttribute("gi"));gi++;
var s=ob.fgravity(gi,100);
var j=y+h;
while(j<=y+s+h)
{
if (getBoolFromXY(ob,x+10,j,25)!=1) {kol++;ob.stand_bool=0;}
else{ob.stand_bool=1;ob.setAttribute("gi",0);return j-h;}
j++;
}
if(kol==(parseInt(s)+1)){ob.setAttribute("gi",gi);return y+s;}
}
function fgravity_ferum(i,m)
{
return (i*parseInt(m)*15)/2000; }
функция gravity (частный случай gravity_ferum) - проверяет на наличие объектов и поверхностей на пути героя, и возвращает следующийy куда будет перемещен персонаж. Проверяемый путь направлен вниз.
varh=ob.h+1;
h - высота персонажа, у главного героя 75
var gi= parseInt( ob.getAttribute("gi"));gi++;
gi - счетчик ускорения падения, чем больше значение этой переменной, тем быстрее падает персонаж (см. функциюfgravity_ferum)
var s=ob.fgravity(gi,100); // 100- масса
s - расстояние, на которое будет перемещен герой
varj=y+h;
j - стартовая точка для расчета
y+s+h - конечная точка для расчета
Вцикле:
while(j<=y+s+h)
Проверяемследующееусловие: if (getBoolFromXY(ob,x+10,j,25)!=1) {kol++;ob.stand_bool=0;}
else{ob.stand_bool=1;ob.setAttribute("gi",0);return j-h;}
Если на отрезке(координаты: x+10, j; длина: 25 ) матрицы pixelsBoolнет препятствий, то наращиваем счетчик kol,отмечаем состояние "приземленности" в свойстве героя - stand_bool. Иначе обнуляем счетчик gi, отмечаем состояние "приземленности" в свойстве героя - stand_bool, и завершаем работу функции, возвращая тот y, который находится перед препятствием (j-h).
Цикл завершится, если только не было поверхностей встречено поверхностей. Поэтому следующим условием идет: if(kol==(parseInt(s)+1)){ob.setAttribute("gi",gi);returny+s;}
Если количество итераций равно расстоянию до конечной точки, то записываем в атрибут героя текущий "счетчик гравитации" и возвращаем y конца пути. function goleft_ferum(ob,x,y,m,l)
{ var o =ob.getAttribute("uskor");
var kol=0;
var s=ob.gostep(m,l,o);
var i=y;
while(i<=y+74)
{
if (getBoolFromXY2(ob,x-1-s,i,s)!=1) {kol++}
else{goleft_ferum.x=getBoolFromXY2.x+1;
ob.setAttribute("uskor",0);return -1}
i++;
}
if(kol==75){return x-s}
}
function gostep_ferum(m,l,o)
{
return 0.5*(l+o*140+400)/m; }
функция goleft (частный случай goleft _ferum) - проверяет на наличие объектов и поверхностей на пути героя, и возвращает следующийx куда будет перемещен персонаж. Проверяемый путь направлен влево.
varo =ob.getAttribute("uskor");
о - счетчик ускорения перемещения в бок, чем больше значение этой переменной, тем быстрее падает персонаж (см. функциюgostep _ferum)
var s=ob.gostep(m,l,o);
s - расстояние, на которое будет перемещен герой
varj=y+h;
i - стартовый y, точка для расчета
y+74 - конечная точка для расчета
getBoolFromXY2 иgetBoolFromXY сканируют матрицу построчно, поэтому
Цикл выглядит таким образом :
while(i<=y+74)
А условие в цикле выглядит так:
if (getBoolFromXY2(ob,x-1-s,i,s)!=1) {kol++}
else{goleft_ferum.x=getBoolFromXY2.x+1;
ob.setAttribute("uskor",0);return -1}
Еслинаотрезке(координаты: x-1-s,i; длина: s ) матрицыpixelsBoolнетпрепятствий, тонаращиваемсчетчикkol. В противном случае обнуляем ускорение бега и возвращаем два значения: напрямую - 1 и через параметр goleft_ferum.xпередаем х(который оказался перед стеной).
if(kol==75){return x-s}
Если в результате работы цикла ни на одной строке не нашлось едениц, то возвращаем х смещенный на необходимое расстояние.
В итоге функции goleftиgravityвсегда возвращают x или y, следующего шага. Основной задачей этих функций, является поиск препятствий, которые блокируют проход персонажу.
Первой строкой функции Left_ferumявляется:
var a=hero.goleft(hero,x,y,mass,lvlgo);
где в переменную a заносится значение goleft(hero,x,y,mass,lvlgo).
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";
var o=hero.getAttribute("uskor");o++;
if(o<17){hero.setAttribute("uskor",o)}}
Если переменная aпринимает значения не равное -1, значит препятствий нет и новый x = x1-s, где s это расстояние, преодаливаемое персонажем за 30 миллисекунд. Свойство стиля героя marginLeftприобретает значение нового х. Счетчик ускорения бега при этом наращивается.
else{hero.x=hero.goleft.x+1;hero.style.marginLeft=hero.x+"px";}
В противном случае, когда aпринимает значения равное -1, новый x смещается на максимально доступное расстояние. Далее следует смещение персонажа по у:
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
По аналогии с goleftв переменную aзанесено значение функции gravity(hero,x,y). В итоге в этой переменной новый y с учетом препятствий. И yстановится новым значением для свойства стиляmarginTop.
В случае когда персонажем в текущей итерации становится ferum
(главный герой), кодом остальных управляющих функций, направленных на перемещении персонажа и его анимации, будет:
function Down_ferum(hero,x,y,mass,lvlup,lvlgo)
{}
function DownRight_ferum(hero,x,y,mass,lvlup,lvlgo)
{Right_ferum(hero,x,y,mass,lvlgo)}
function DownLeft_ferum(hero,x,y,mass,lvlup,lvlgo)
{Left_ferum(hero,x,y,mass,lvlgo)}
function UpLeft_ferum(hero,x,y,mass,lvlup,lvlgo)
{
var b=hero.jump(hero,x,y,mass,lvlup);
if(b!=-1)
{
if(b!=-2)
{
var a=hero.gravity(hero,x,y);
hero.y=a-b;
hero.style.marginTop=hero.y+"px";
}
else
{var a=hero.gravity(hero,x,y);
hero.y=a-hero.jump.y+1;
hero.style.marginTop=hero.y+"px";
}
}
else
{
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
var a=hero.goleft(hero,x,y,mass,lvlgo);hero.ReactionBool=true;
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.goleft.x+1;hero.style.marginLeft=hero.x+"px";}
}
//-----
function UpRight_ferum(hero,x,y,mass,lvlup,lvlgo)
{
var b=hero.jump(hero,x,y,mass,lvlup);
if(b!=-1)
{
if(b!=-2)
{
var a=hero.gravity(hero,x,y);
hero.y=a-b;
hero.style.marginTop=hero.y+"px";
}
else
{var a=hero.gravity(hero,x,y);
hero.y=a-hero.jump.y+1;
hero.style.marginTop=hero.y+"px";
}
}
else
{
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
var a=hero.goright(hero,x,y,mass,lvlgo);hero.ReactionBool=true;
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.goright.x-46;hero.style.marginLeft=hero.x+"px";}
}
//-----
function Up_ferum(hero,x,y,mass,lvlup,lvlgo)
{
var b=hero.jump(hero,x,y,mass,lvlup);
if(b!=-1)
{
if(b!=-2)
{
var a=hero.gravity(hero,x,y);
hero.y=a-b;
hero.style.marginTop=hero.y+"px";
}
else
{var a=hero.gravity(hero,x,y);
hero.y=a-hero.jump.y+1;
hero.style.marginTop=hero.y+"px";
}
}
else
{
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
var lastbutt=hero.getAttribute("lastbutt");
var o= hero.getAttribute("uskor");if(o>0){o--;}hero.setAttribute("uskor",o);
if(lastbutt=="left")
{
var a=hero.inertgoleft(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.inertgoleft.x+1;hero.style.marginLeft=hero.x+"px";}
hero.goAnimateUpLeft(hero);
}
if(lastbutt=="right")
{
var a=hero.inertgoright(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.inertgoright.x-46;hero.style.marginLeft=hero.x+"px";}
hero.goAnimateUpRight(hero);
} }
//------
function Right_ferum(hero,x,y,mass,lvlgo)
{
var a=hero.goright(hero,x,y,mass,lvlgo);
if(a!=-1){
hero.x=a;
hero.style.marginLeft=hero.x+"px";
var o=hero.getAttribute("uskor");o++;
if(o<17){hero.setAttribute("uskor",o)}}
else{hero.x=hero.goright.x-46;hero.style.marginLeft=hero.x+"px";}
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
//-----
function Nothing_ferum(hero,x,y,mass,lvlgo,lastbutt)
{if(!hero.die_bool){
var a=hero.gravity(hero,x,y);var lastbutt=hero.getAttribute("lastbutt");
var o= hero.getAttribute("uskor");if(o>=8){o-=2;}else{if(o>0){o--;}}hero.setAttribute("uskor",o);
hero.y=a;
hero.style.marginTop=hero.y+"px";
if(lastbutt=="left")
{
var a=hero.inertgoleft(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoleft.x+1;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/lrun/1.png') no-repeat;\" ></div>";
}
if(lastbutt=="right")
{
var a=hero.inertgoright(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoright.x-46;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/rrun/1.png') no-repeat;\" ></div>";
}
}
else
{
var a=hero.gravity(hero,x,y);var lastbutt=hero.getAttribute("lastbutt");
var o= hero.getAttribute("uskor");if(o>=8){o-=2;}else{if(o>0){o--;}}hero.setAttribute("uskor",o);
hero.y=a;
hero.style.marginTop=hero.y+"px";
if(lastbutt=="left")
{
var a=hero.inertgoleft(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoleft.x+1;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:87px;height:45px;background:"+hero.die_back+" no-repeat;\" ></div>";
}
if(lastbutt=="right")
{
var a=hero.inertgoright(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoright.x-46;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:87px;height:45px;background:"+hero.die_back+" no-repeat;\" ></div>";
}
}
}
//-----
function goAnimateRight_ferum(hero)
{
var ai=hero.getAttribute("animi");
if(ai>=16){ ai=1; }
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/rrun/"+ai+ ".png') no-repeat;\" ></div>";
ai++; hero.setAttribute("animi",ai);
ai++; }
function goAnimateUpLeft_ferum(hero)
{var ai=hero.aiup;
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/upl/"+ai+ ".png') no-repeat;\" ></div>";
if(ai<6){ai++;}
hero.aiup=ai;
}
function goAnimateUpRight_ferum(hero)
{var ai=hero.aiup;
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/upr/"+ai+ ".png') no-repeat;\" ></div>";
if(ai<6){ai++;}
hero.aiup=ai;
}
2.2.4.2 Взаимодействие персонажей Одним из доминирующих способов взаимодействия персонажей будет атака на персонажей. Управляющая функция, направленная на атаку персонажей, является функция Atack, которая так же как и остальные хранится в самом объекте персонажа. Запуск ее происходит в случае когда зажата клавиша атаки, а персонаж находится на твердой поверхности.
if((atack==1)&&(stand_bool==1))
{
hero.Atack(hero,x,y,mass,lvlgo);
}
Код этой функции атаки в частном случае будет:
function Atack_ferum(hero,x,y,m,l)
{if(hero.atack_first_bool==false)
{hero.atack_first_bool=true;
hero.last_atack_bool=true;
hero.style.backgroundImage="";
}
else{
var last =hero.getAttribute("lastbutt");
var atack;
if(last=="left")
{atack=hero.atack_left(hero,x,y);
if(atack){hero.damage(hero,atack,5);}
hero.animate_Latack(hero);
}
if(last=="right")
{atack=hero.atack_right(hero,x,y);
if(atack){hero.damage(hero,atack,5);}
hero.animate_Ratack(hero);
}}
}
На протяжение всего времени когда зажата клавиша атаки используется одна функция, обрабатывающая атаку. Главный блок запускает атаку каждый раз когда атрибут атаки равен единице. Первый запуск в этот период времени отмечает переменная atack_first_bool , последний запуск отмечает переменная last_atack_bool. Для того что бы выполнить подготовительные работы требуется переменная, отображающая "первый" запуск функции или нет. Если значение переменной atack_first_bool истина, значит функция Atack_ferum вызвана первый раз. last_atack_bool обрабатывается в главном блоке. Когда ее значение истина, а атрибут атаки равен нулю, требуется последний запуск атаки, который вернет персонажа в нормальное состояние.
if(hero.atack_first_bool==false)
{hero.atack_first_bool=true;
hero.last_atack_bool=true;
hero.style.backgroundImage="";
}
Персонажимеетатрибутlastbutt. Который отображает какая из двух клавиш, влево или вправо, была нажата последней. Причем возможными значениями атрибута являются leftиrightсоответственно.
varlast =hero.getAttribute("lastbutt");
var atack;
if(last=="left")
{atack=hero.atack_left(hero,x,y);
if(atack){hero.damage(hero,atack,5);}
hero.animate_Latack(hero);
}
atack - будет содержать объект для атаки, если он есть вблизи персонажа.
Функцией поиска противника становится atack_leftи ее код в частном случае:
function atack_left_ferum(hero,x,y)
{
var tmp,x2,y2;
for(var i=0;i<PersForMain.length;i++)
{
tmp=PersForMain[i];
if(tmp.id!=hero.id)
{
x2=tmp.x+40;y2=tmp.y;
if(Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2))<hero.radForA)
{ return tmp;
} }
}
return false;
}
for(var i=0;i<PersForMain.length;i++)
Алгоритм поиска противника состоит в том, чтобы проверить координаты каждого персонажа из общедоступного массива PersForMain.
tmp=PersForMain[i];
x2=tmp.x+40;y2=tmp.y;
if(Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2))<hero.radForA)
Если же противник находится на доступном расстоянии (hero.radForA), то return tmp;
возвращаем объект противника. Если же не нашлось ни одного противника, возвращаем false.
return false;
Аналогичные манипуляции выполняются и для правой атаки (когда зажата, или была последней клавиша вправо):
if(last=="right")
{atack=hero.atack_right(hero,x,y);
if(atack){hero.damage(hero,atack,5);}
hero.animate_Ratack(hero);
}
function atack_right_ferum(hero,x,y)
{
x+=40;
var tmp,x2,y2;
for(var i=0;i<PersForMain.length;i++)
{
tmp=PersForMain[i];
if(tmp.id!=hero.id)
{
x2=tmp.x;y2=tmp.y;
if(Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2))<hero.radForA)
{ returntmp;
} }
}
returnfalse;
}
В любом случае во время атаки персонажу требуется анимация. Частным случаем анимации будут функции с кодом:
function animate_Latack_ferum(hero)
{var back;
if(hero.atack_type==0){
back=hero.aleft_1[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-12px;margin-left:-31px;width:76px;height:87px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==1){
back=hero.aleft_2[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-1px;margin-left:-19px;width:57px;height:76px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==2){
back=hero.aleft_3[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-2px;margin-left:-23px;width:68px;height:78px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
if(hero.aai>=15){hero.aai=0;
hero.atack_type=parseInt(Math.random()*3)}}
}
function animate_Ratack_ferum(hero)
{var back;
if(hero.atack_type==0){
back=hero.aright_1[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-12px;margin-left:10px;width:76px;height:87px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
if(hero.aai>15){hero.aai=0;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==1){
back=hero.aright_2[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-1px;margin-left:5px;width:57px;height:76px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
if(hero.aai>15){hero.aai=0;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==2){
back=hero.aright_3[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-2px;margin-left:0px;width:68px;height:78px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
if(hero.aai>=15){hero.aai=0;
hero.atack_type=parseInt(Math.random()*3)}}}
Анимация делится на три типа. Свойством персонажа содержащим наименование типа атаки, станет hero.atack_type. А возможные значение 0,1,2. Разберем первый тип:
if(hero.atack_type==0){
back=hero.aleft_1[hero.aai];
hero.aai - счетчик анимации
hero.aleft_1 -массив ссылок на изображения, для первого типа атаки
back - содержит текущую ссылку на изображение атакующего персонажа
следующая строчка в коде обработки анимации:
hero.innerHTML="<div style=\"position:absolute;margin-top:-12px;margin-left:-31px;width:76px;height:87px;background:"+back+" no-repeat;\" ></div>";
где персонаж приобретает новое HTMLсодержимое.
далее
hero.aai++;
наращивание счетчика, отвечающего за номер ссылки фона персонажа.
if(hero.aai>15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}
Если значение счетчика больше 15, обнуляем счетчик генерируем значение нового типа атаки.
2.2.4.3 Массив особых объектов
Последними строчками главного блока становится:
for(OJ=0;OJ<ObjForMain.length;OJ++)
{
ObjForMain[OJ].Action(ObjForMain[OJ],OJ);
}
setTimeout(mainblock,30);}
for(OJ=0;OJ<ObjForMain.length;OJ++)
В этом цикле обрабатывается общедоступный массив особых объектов игры - ObjForMain. ObjForMain[OJ].Action(ObjForMain[OJ],OJ);
Каждый элемент массива имеет свойство-функцию Action, у которой среди аргументов: ObjForMain[OJ] - текущий на итерации элемент массива, и индекс этого элемента - OJ.
2.2.5Основные объекты игры
2.2.5.1Ferum
Ferum- этоглавный персонаж игры.
Инициализация:
function createFerum(x,y)
{if(x<=0){x=1}if(y<=0){y=1}
if(x>=width){x=width-46}if(y>=height){y=height-76}
var hero=document.createElement("div");
hero.hname="Hero";
hero.backLeft="url('Objects/dynamic/ferum/animation/lrun/1.png')";
hero.backRight="url('Objects/dynamic/ferum/animation/rrun/1.png')";
hero.style.backgroundRepeat="no-repeat";
hero.stair=new Array();
hero.aleft_1=new Array();
hero.aleft_2=new Array();
hero.aleft_3=new Array();
hero.aright_1=new Array();
hero.aright_2=new Array();
hero.aright_3=new Array();
hero.dleft=new Array();
hero.dright=new Array();
hero.stair[0]="url('Objects/dynamic/ferum/animation/stair_up/1.png')";
hero.stair[1]="url('Objects/dynamic/ferum/animation/stair_up/2.png')";
hero.stair[2]="url('Objects/dynamic/ferum/animation/stair_up/3.png')";
hero.stair[3]="url('Objects/dynamic/ferum/animation/stair_up/4.png')";
hero.aleft_1[0]="url('Objects/dynamic/ferum/animation/aleft_1/1.png')";
hero.aleft_1[1]="url('Objects/dynamic/ferum/animation/aleft_1/2.png')";
hero.aleft_1[2]="url('Objects/dynamic/ferum/animation/aleft_1/3.png')";
hero.aleft_1[3]="url('Objects/dynamic/ferum/animation/aleft_1/4.png')";
hero.aleft_1[4]="url('Objects/dynamic/ferum/animation/aleft_1/5.png')";
hero.aleft_1[5]="url('Objects/dynamic/ferum/animation/aleft_1/6.png')";
hero.aleft_1[6]="url('Objects/dynamic/ferum/animation/aleft_1/7.png')";
hero.aleft_1[7]="url('Objects/dynamic/ferum/animation/aleft_1/8.png')";
hero.aleft_1[8]="url('Objects/dynamic/ferum/animation/aleft_1/9.png')";
hero.aleft_1[9]="url('Objects/dynamic/ferum/animation/aleft_1/10.png')";
hero.aleft_1[10]="url('Objects/dynamic/ferum/animation/aleft_1/11.png')";
hero.aleft_1[11]="url('Objects/dynamic/ferum/animation/aleft_1/12.png')";
hero.aleft_1[12]="url('Objects/dynamic/ferum/animation/aleft_1/13.png')";
hero.aleft_1[13]="url('Objects/dynamic/ferum/animation/aleft_1/14.png')";
hero.aleft_1[14]="url('Objects/dynamic/ferum/animation/aleft_1/15.png')";
hero.aleft_1[15]="url('Objects/dynamic/ferum/animation/aleft_1/16.png')";
hero.aleft_2[0]="url('Objects/dynamic/ferum/animation/aleft_2/1.png')";
hero.aleft_2[1]="url('Objects/dynamic/ferum/animation/aleft_2/2.png')";
hero.aleft_2[2]="url('Objects/dynamic/ferum/animation/aleft_2/3.png')";
hero.aleft_2[3]="url('Objects/dynamic/ferum/animation/aleft_2/4.png')";
hero.aleft_2[4]="url('Objects/dynamic/ferum/animation/aleft_2/5.png')";
hero.aleft_2[5]="url('Objects/dynamic/ferum/animation/aleft_2/6.png')";
hero.aleft_2[6]="url('Objects/dynamic/ferum/animation/aleft_2/7.png')";
hero.aleft_2[7]="url('Objects/dynamic/ferum/animation/aleft_2/8.png')";
hero.aleft_2[8]="url('Objects/dynamic/ferum/animation/aleft_2/9.png')";
hero.aleft_2[9]="url('Objects/dynamic/ferum/animation/aleft_2/10.png')";
hero.aleft_2[10]="url('Objects/dynamic/ferum/animation/aleft_2/11.png')";
hero.aleft_2[11]="url('Objects/dynamic/ferum/animation/aleft_2/12.png')";
hero.aleft_2[12]="url('Objects/dynamic/ferum/animation/aleft_2/13.png')";
hero.aleft_2[13]="url('Objects/dynamic/ferum/animation/aleft_2/14.png')"; hero.aleft_2[14]="url('Objects/dynamic/ferum/animation/aleft_2/14.png')"; hero.aleft_2[15]="url('Objects/dynamic/ferum/animation/aleft_2/14.png')"; hero.aleft_3[0]="url('Objects/dynamic/ferum/animation/aleft_3/1.png')";
hero.aleft_3[1]="url('Objects/dynamic/ferum/animation/aleft_3/2.png')";
hero.aleft_3[2]="url('Objects/dynamic/ferum/animation/aleft_3/3.png')";
hero.aleft_3[3]="url('Objects/dynamic/ferum/animation/aleft_3/4.png')";
hero.aleft_3[4]="url('Objects/dynamic/ferum/animation/aleft_3/5.png')";
hero.aleft_3[5]="url('Objects/dynamic/ferum/animation/aleft_3/6.png')";
hero.aleft_3[6]="url('Objects/dynamic/ferum/animation/aleft_3/7.png')";
hero.aleft_3[7]="url('Objects/dynamic/ferum/animation/aleft_3/8.png')";
hero.aleft_3[8]="url('Objects/dynamic/ferum/animation/aleft_3/9.png')";
hero.aleft_3[9]="url('Objects/dynamic/ferum/animation/aleft_3/10.png')";
hero.aleft_3[10]="url('Objects/dynamic/ferum/animation/aleft_3/11.png')";
hero.aleft_3[11]="url('Objects/dynamic/ferum/animation/aleft_3/12.png')";
hero.aleft_3[12]="url('Objects/dynamic/ferum/animation/aleft_3/13.png')";
hero.aleft_3[13]="url('Objects/dynamic/ferum/animation/aleft_3/14.png')";
hero.aleft_3[14]="url('Objects/dynamic/ferum/animation/aleft_3/14.png')";
hero.aleft_3[15]="url('Objects/dynamic/ferum/animation/aleft_3/14.png')";
hero.aright_1[0]="url('Objects/dynamic/ferum/animation/aright_1/1.png')";
hero.aright_1[1]="url('Objects/dynamic/ferum/animation/aright_1/2.png')";
hero.aright_1[2]="url('Objects/dynamic/ferum/animation/aright_1/3.png')";
hero.aright_1[3]="url('Objects/dynamic/ferum/animation/aright_1/4.png')";
hero.aright_1[4]="url('Objects/dynamic/ferum/animation/aright_1/5.png')";
hero.aright_1[5]="url('Objects/dynamic/ferum/animation/aright_1/6.png')";
hero.aright_1[6]="url('Objects/dynamic/ferum/animation/aright_1/7.png')";
hero.aright_1[7]="url('Objects/dynamic/ferum/animation/aright_1/8.png')";
hero.aright_1[8]="url('Objects/dynamic/ferum/animation/aright_1/9.png')";
hero.aright_1[9]="url('Objects/dynamic/ferum/animation/aright_1/10.png')";
hero.aright_1[10]="url('Objects/dynamic/ferum/animation/aright_1/11.png')";
hero.aright_1[11]="url('Objects/dynamic/ferum/animation/aright_1/12.png')";
hero.aright_1[12]="url('Objects/dynamic/ferum/animation/aright_1/13.png')";
hero.aright_1[13]="url('Objects/dynamic/ferum/animation/aright_1/14.png')";
hero.aright_1[14]="url('Objects/dynamic/ferum/animation/aright_1/15.png')";
hero.aright_1[15]="url('Objects/dynamic/ferum/animation/aright_1/16.png')";
hero.aright_2[0]="url('Objects/dynamic/ferum/animation/aright_2/1.png')";
hero.aright_2[1]="url('Objects/dynamic/ferum/animation/aright_2/2.png')";
hero.aright_2[2]="url('Objects/dynamic/ferum/animation/aright_2/3.png')";
hero.aright_2[3]="url('Objects/dynamic/ferum/animation/aright_2/4.png')";
hero.aright_2[4]="url('Objects/dynamic/ferum/animation/aright_2/5.png')";
hero.aright_2[5]="url('Objects/dynamic/ferum/animation/aright_2/6.png')";
hero.aright_2[6]="url('Objects/dynamic/ferum/animation/aright_2/7.png')";
hero.aright_2[7]="url('Objects/dynamic/ferum/animation/aright_2/8.png')";
hero.aright_2[8]="url('Objects/dynamic/ferum/animation/aright_2/9.png')";
hero.aright_2[9]="url('Objects/dynamic/ferum/animation/aright_2/10.png')";
hero.aright_2[10]="url('Objects/dynamic/ferum/animation/aright_2/11.png')";
hero.aright_2[11]="url('Objects/dynamic/ferum/animation/aright_2/12.png')";
hero.aright_2[12]="url('Objects/dynamic/ferum/animation/aright_2/13.png')";
hero.aright_2[13]="url('Objects/dynamic/ferum/animation/aright_2/14.png')"; hero.aright_2[14]="url('Objects/dynamic/ferum/animation/aright_2/14.png')"; hero.aright_2[15]="url('Objects/dynamic/ferum/animation/aright_2/14.png')"; hero.aright_3[0]="url('Objects/dynamic/ferum/animation/aright_3/1.png')";
hero.aright_3[1]="url('Objects/dynamic/ferum/animation/aright_3/2.png')";
hero.aright_3[2]="url('Objects/dynamic/ferum/animation/aright_3/3.png')";
hero.aright_3[3]="url('Objects/dynamic/ferum/animation/aright_3/4.png')";
hero.aright_3[4]="url('Objects/dynamic/ferum/animation/aright_3/5.png')";
hero.aright_3[5]="url('Objects/dynamic/ferum/animation/aright_3/6.png')";
hero.aright_3[6]="url('Objects/dynamic/ferum/animation/aright_3/7.png')";
hero.aright_3[7]="url('Objects/dynamic/ferum/animation/aright_3/8.png')";
hero.aright_3[8]="url('Objects/dynamic/ferum/animation/aright_3/9.png')";
hero.aright_3[9]="url('Objects/dynamic/ferum/animation/aright_3/10.png')";
hero.aright_3[10]="url('Objects/dynamic/ferum/animation/aright_3/11.png')";
hero.aright_3[11]="url('Objects/dynamic/ferum/animation/aright_3/12.png')";
hero.aright_3[12]="url('Objects/dynamic/ferum/animation/aright_3/13.png')";
hero.aright_3[13]="url('Objects/dynamic/ferum/animation/aright_3/14.png')";
hero.aright_3[14]="url('Objects/dynamic/ferum/animation/aright_3/14.png')";
hero.aright_3[15]="url('Objects/dynamic/ferum/animation/aright_3/14.png')";
hero.dleft[0]="url('Objects/dynamic/ferum/animation/dleft/1.png')";
hero.dleft[1]="url('Objects/dynamic/ferum/animation/dleft/2.png')";
hero.dleft[2]="url('Objects/dynamic/ferum/animation/dleft/3.png')";
hero.dleft[3]="url('Objects/dynamic/ferum/animation/dleft/4.png')";
hero.dleft[4]="url('Objects/dynamic/ferum/animation/dleft/5.png')";
hero.dleft[5]="url('Objects/dynamic/ferum/animation/dleft/6.png')";
hero.dleft[6]="url('Objects/dynamic/ferum/animation/dleft/7.png')";
hero.dleft[7]="url('Objects/dynamic/ferum/animation/dleft/8.png')";
hero.dleft[8]="url('Objects/dynamic/ferum/animation/dleft/9.png')";
hero.dleft[9]="url('Objects/dynamic/ferum/animation/dleft/10.png')";
hero.dright[0]="url('Objects/dynamic/ferum/animation/dright/1.png')";
hero.dright[1]="url('Objects/dynamic/ferum/animation/dright/2.png')";
hero.dright[2]="url('Objects/dynamic/ferum/animation/dright/3.png')";
hero.dright[3]="url('Objects/dynamic/ferum/animation/dright/4.png')";
hero.dright[4]="url('Objects/dynamic/ferum/animation/dright/5.png')";
hero.dright[5]="url('Objects/dynamic/ferum/animation/dright/6.png')";
hero.dright[6]="url('Objects/dynamic/ferum/animation/dright/7.png')";
hero.dright[7]="url('Objects/dynamic/ferum/animation/dright/8.png')";
hero.dright[8]="url('Objects/dynamic/ferum/animation/dright/9.png')";
hero.dright[9]="url('Objects/dynamic/ferum/animation/dright/10.png')";
hero.aiup=1;
hero.stair_i=0;
hero.stair_obj="";
hero.atacking=function(button,h){}
hero.radForA=17;// pixels around hero
hero.gravity=gravity_ferum;
hero.goleft=goleft_ferum;
hero.jump=jump_ferum;
hero.goright=goright_ferum;
hero.UpLeft=UpLeft_ferum;
hero.UpRight=UpRight_ferum;
hero.DownRight=DownRight_ferum;
hero.DownLeft=DownLeft_ferum;
hero.Up=Up_ferum;
hero.inertgoleft=inertgoleft_ferum;
hero.inertgoright=inertgoright_ferum;
hero.Left=Left_ferum;
hero.Right=Right_ferum;
hero.Down=Down_ferum;
hero.Nothing=Nothing_ferum;
hero.goAnimateLeft=goAnimateLeft_ferum;
hero.goAnimateRight=goAnimateRight_ferum;
hero.goAnimateUpLeft=goAnimateUpLeft_ferum;
hero.goAnimateUpRight=goAnimateUpRight_ferum;
hero.fgravity=fgravity_ferum;
hero.gostep=gostep_ferum;
hero.inertgostep=inertgostep_ferum;
hero.stepspace=stepspace_ferum;
hero.stand_bool=0;
hero.Atack=Atack_ferum;
hero.aai=0;
hero.ax=x;
hero.ay=y;
hero.aw=45;
hero.ah=75;
hero.atack_first_bool=false;
hero.last_atack_bool=false;
hero.atack_i=0;
hero.atack_iend=0;
hero.atack_type=0;
hero.Atack_off=Atack_off_ferum;
hero.atack_left=atack_left_ferum;
hero.atack_right=atack_right_ferum;
hero.animate_Latack=animate_Latack_ferum;
hero.animate_Ratack=animate_Ratack_ferum;
hero.damage=damage_ferum;
hero.live=live_ferum;
hero.def=def_ferum;
hero.def_off=def_off_ferum;
hero.def_ai=0;
hero.last_def=false;
hero.die_png=new Array();
hero.die_bool=false;
hero.die_png[0]="url('Objects/dynamic/ferum/animation/die_1.png')";
hero.die_png[1]="url('Objects/dynamic/ferum/animation/die_2.png')";
hero.die_png[2]="url('Objects/dynamic/ferum/animation/die_3.png')";
hero.die_png[3]="url('Objects/dynamic/ferum/animation/die_4.png')";
hero.die_back=hero.die_png[parseInt(Math.random()*4)];
hero.die=die_ferum;
hero.ReactionBool=true;
hero.TouchUp=TouchUp;
hero.TouchUpLeft=TouchUpLeft;
hero.TouchUpRight=TouchUpRight;
hero.TouchDown=TouchDown;
hero.TouchLeft=TouchLeft;
hero.TouchRight=TouchRight;
hero.stair_stop_1=stair_stop_ferum_1;
hero.setAttribute("atack",0);
hero.setAttribute("def",0);
hero.setAttribute("score",0);
hero.setAttribute("team","red");
hero.setAttribute("class","ferum");
hero.setAttribute("damage","1");
hero.setAttribute("def","0");
hero.setAttribute("hp","1");
hero.hp=100;
hero.setAttribute("gi","0");
hero.setAttribute("lvlup",1);
hero.setAttribute("lvlgo",1);
hero.setAttribute("mass",100);
hero.setAttribute("ldamage","1");
hero.setAttribute("jumplast",0);
hero.setAttribute("up",0);
hero.setAttribute("left",0);
hero.setAttribute("right",0);
hero.setAttribute("down",0);
hero.setAttribute("space",0);
hero.setAttribute("uskor",1);
hero.setAttribute("lastbutt",0);
hero.setAttribute("animi",1);
hero.setAttribute("animbool",0);
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/rrun/1.png') no-repeat;\" ></div>";
hero.style.width="45px";
hero.style.height="75px";
hero.style.position="absolute";
hero.style.marginLeft=x+"px";
hero.style.marginTop=y+"px";
hero.x=x;
hero.y=y;
hero.w=45;
hero.h=75;
hero.id=PersForMain.length;
document.body.appendChild(hero);
PersForMain[PersForMain.length]=hero;
return hero;
}
Управляющиефункции:
//------ iterations for mainblock---------------------------
function scan_obj_ferum(hero,x,y)//Срабатываетпонажатиюна'х'
{var lr,rr;x=parseInt(x);y=parseInt(y);
if(hero.getAttribute("lastbutt")=="left")
{if((x-20)<0){lr=1;}
for(var i=x;i>lr;i--)
{for(var j=y;j<y+75;j++){
if((pixelsBool[i][y]==2)&&(StaticObjectMatrix[i][y].RunBool==0)&&(hero.ReactionBool))
{StaticObjectMatrix[i][y].Reaction(hero,i,y);return true;}
}}
}
if(hero.getAttribute("lastbutt")=="right")
{if((x+65)>1000){rr=999;}
for(var i=x+45;i>rr;i++)
{for(var j=y;j<y+75;j++){
if((pixelsBool[i][y]==2)&&(StaticObjectMatrix[i][y].RunBool==0)&&(hero.ReactionBool))
{StaticObjectMatrix[i][y].Reaction(hero,i,y);return true;}
}}
}
}
function Down_ferum(hero,x,y,mass,lvlup,lvlgo)
{}
function DownRight_ferum(hero,x,y,mass,lvlup,lvlgo)
{Right_ferum(hero,x,y,mass,lvlgo)}
function DownLeft_ferum(hero,x,y,mass,lvlup,lvlgo)
{Left_ferum(hero,x,y,mass,lvlgo)}
function UpLeft_ferum(hero,x,y,mass,lvlup,lvlgo)
{
var b=hero.jump(hero,x,y,mass,lvlup);
if(b!=-1)
{
if(b!=-2)
{
var a=hero.gravity(hero,x,y);
hero.y=a-b;
hero.style.marginTop=hero.y+"px";
}
else
{var a=hero.gravity(hero,x,y);
hero.y=a-hero.jump.y+1;
hero.style.marginTop=hero.y+"px";
}
}
else
{
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
var a=hero.goleft(hero,x,y,mass,lvlgo);hero.ReactionBool=true;
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.goleft.x+1;hero.style.marginLeft=hero.x+"px";}
}
//-----
function UpRight_ferum(hero,x,y,mass,lvlup,lvlgo)
{
var b=hero.jump(hero,x,y,mass,lvlup);
if(b!=-1)
{
if(b!=-2)
{
var a=hero.gravity(hero,x,y);
hero.y=a-b;
hero.style.marginTop=hero.y+"px";
}
else
{var a=hero.gravity(hero,x,y);
hero.y=a-hero.jump.y+1;
hero.style.marginTop=hero.y+"px";
}
}
else
{
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
var a=hero.goright(hero,x,y,mass,lvlgo);hero.ReactionBool=true;
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.goright.x-46;hero.style.marginLeft=hero.x+"px";}
}
//-----
function Up_ferum(hero,x,y,mass,lvlup,lvlgo)
{
var b=hero.jump(hero,x,y,mass,lvlup);
if(b!=-1)
{
if(b!=-2)
{
var a=hero.gravity(hero,x,y);
hero.y=a-b;
hero.style.marginTop=hero.y+"px";
}
else
{var a=hero.gravity(hero,x,y);
hero.y=a-hero.jump.y+1;
hero.style.marginTop=hero.y+"px";
}
}
else
{
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
var lastbutt=hero.getAttribute("lastbutt");
var o= hero.getAttribute("uskor");if(o>0){o--;}hero.setAttribute("uskor",o);
if(lastbutt=="left")
{
var a=hero.inertgoleft(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.inertgoleft.x+1;hero.style.marginLeft=hero.x+"px";}
hero.goAnimateUpLeft(hero);
}
if(lastbutt=="right")
{
var a=hero.inertgoright(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}else{hero.x=hero.inertgoright.x-46;hero.style.marginLeft=hero.x+"px";}
hero.goAnimateUpRight(hero);
} }
//------
function Right_ferum(hero,x,y,mass,lvlgo)
{
var a=hero.goright(hero,x,y,mass,lvlgo);
if(a!=-1){
hero.x=a;
hero.style.marginLeft=hero.x+"px";
var o=hero.getAttribute("uskor");o++;
if(o<17){hero.setAttribute("uskor",o)}}
else{hero.x=hero.goright.x-46;hero.style.marginLeft=hero.x+"px";}
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
//-----
function Left_ferum(hero,x,y,mass,lvlgo)
{
var a=hero.goleft(hero,x,y,mass,lvlgo);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";
var o=hero.getAttribute("uskor");o++;
if(o<17){hero.setAttribute("uskor",o)}}
else{hero.x=hero.goleft.x+1;hero.style.marginLeft=hero.x+"px";}
var a=hero.gravity(hero,x,y);
hero.y=a;
hero.style.marginTop=hero.y+"px";
}
//-----
function Nothing_ferum(hero,x,y,mass,lvlgo,lastbutt)
{if(!hero.die_bool){
var a=hero.gravity(hero,x,y);var lastbutt=hero.getAttribute("lastbutt");
var o= hero.getAttribute("uskor");if(o>=8){o-=2;}else{if(o>0){o--;}}hero.setAttribute("uskor",o);
hero.y=a;
hero.style.marginTop=hero.y+"px";
if(lastbutt=="left")
{
var a=hero.inertgoleft(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoleft.x+1;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/lrun/1.png') no-repeat;\" ></div>";
}
if(lastbutt=="right")
{
var a=hero.inertgoright(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoright.x-46;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/rrun/1.png') no-repeat;\" ></div>";
}
}
else
{
var a=hero.gravity(hero,x,y);var lastbutt=hero.getAttribute("lastbutt");
var o= hero.getAttribute("uskor");if(o>=8){o-=2;}else{if(o>0){o--;}}hero.setAttribute("uskor",o);
hero.y=a;
hero.style.marginTop=hero.y+"px";
if(lastbutt=="left")
{
var a=hero.inertgoleft(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoleft.x+1;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:87px;height:45px;background:"+hero.die_back+" no-repeat;\" ></div>";
}
if(lastbutt=="right")
{
var a=hero.inertgoright(hero,x,y,mass,lvlgo,o);
if(a!=-1){hero.x=a;hero.style.marginLeft=hero.x+"px";}
else{hero.x=hero.inertgoright.x-46;hero.style.marginLeft=hero.x+"px";}
hero.innerHTML="<div style=\"position:absolute;width:87px;height:45px;background:"+hero.die_back+" no-repeat;\" ></div>";
}
}
}
//-----
//-----
function goAnimateLeft_ferum(hero)
{
var ai=hero.getAttribute("animi");
if(ai>=16){ ai=1; }
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/lrun/"+ai+ ".png') no-repeat;\" ></div>";
ai++; hero.setAttribute("animi",ai);
}
function goAnimateRight_ferum(hero)
{
var ai=hero.getAttribute("animi");
if(ai>=16){ ai=1; }
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/rrun/"+ai+ ".png') no-repeat;\" ></div>";
ai++; hero.setAttribute("animi",ai);
ai++; }
function goAnimateUpLeft_ferum(hero)
{var ai=hero.aiup;
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/upl/"+ai+ ".png') no-repeat;\" ></div>";
if(ai<6){ai++;}
hero.aiup=ai;
}
function goAnimateUpRight_ferum(hero)
{var ai=hero.aiup;
hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/upr/"+ai+ ".png') no-repeat;\" ></div>";
if(ai<6){ai++;}
hero.aiup=ai;
}
Moving functions:
function gravity_ferum(ob,x,y)
{ var h=ob.h+1;
var kol=0;
var gi= parseInt( ob.getAttribute("gi"));gi++;
var s=ob.fgravity(gi,100);var j=y+h;
while(j<=y+s+h)
{
if (getBoolFromXY(ob,x+10,j,25)!=1) {kol++;ob.stand_bool=0;}
else{ob.stand_bool=1;ob.setAttribute("gi",0);return j-h;}
j++;
}
if(kol==(parseInt(s)+1)){ob.setAttribute("gi",gi);return y+s;}
}
function goright_ferum(ob,x,y,m,l)
{ var o =ob.getAttribute("uskor");
var kol=0;
var s=ob.gostep(m,l,o);var i=y;
while(i<=y+74)
{
if (getBoolFromXY(ob,x+46,i,s)!=1) {kol++}
else{goright_ferum.x=getBoolFromXY.x-1;ob.setAttribute("uskor",0);return -1}
i++;
}
if(kol==75){return x+s;}
}
function goleft_ferum(ob,x,y,m,l)
{ var o =ob.getAttribute("uskor");
var kol=0;
var s=ob.gostep(m,l,o);var i=y;
while(i<=y+74)
{
if (getBoolFromXY2(ob,x-1-s,i,s)!=1) {kol++}
else{goleft_ferum.x=getBoolFromXY2.x+1;ob.setAttribute("uskor",0);return -1}
i++;
}
if(kol==75){return x-s}
}
function jump_ferum(ob,x,y,m,l,last)
{jump.y=0;
var last=parseInt(ob.getAttribute("jumplast"));
if((last==0)&&(getBoolFromXY(ob,x,y*1+76*1,45)==1))
{
ob.setAttribute("jumplast","1");return -1;
}
else
{
if(last==1)
{
var kol=0;
var s=ob.stepspace(m,l,ob.getAttribute("uskor"));
var j=y-1;
while(j>=y-1-s)
{
if (getBoolFromXY(ob,x,j,45)!=1) {kol++;}
else{jump_ferum.y=y-j;return -2;}
j--;
}
if(kol>=s-1){return s;}
}
}
return -1;
}
function inertgoright_ferum(ob,x,y,m,l,o)
{
var kol=0;
var s=ob.inertgostep(m,l,o);var i=y;
while(i<=y+74)
{
if (getBoolFromXY(ob,x+46,i,s)!=1) {kol++}
else{inertgoright_ferum.x=getBoolFromXY.x;ob.setAttribute("uskor",0);return -1}
i++;
}
if(kol==75){return x+s;}
}
function inertgoleft_ferum(ob,x,y,m,l,o)
{
var kol=0;
var s=ob.inertgostep(m,l,o);var i=y;
while(i<=y+74)
{
if (getBoolFromXY2(ob,x-1-s,i,s)!=1) {kol++}
else{inertgoleft_ferum.x=getBoolFromXY2.x;ob.setAttribute("uskor",0);return -1}
i++;
}
if(kol==75){return x-s}
}
Функции для расчета расстояния одного шага:
function fgravity_ferum(i,m)
{
return (i*parseInt(m)*15)/2000; //гравитация 'i' возрастает на еденицу
}
function supergostep_ferum(m,l,o)
{
return 0.5*(l+o*220+600)/m; }
function gostep_ferum(m,l,o)
{
return 0.5*(l+o*140+400)/m; // бег
}
function inertgostep_ferum(m,l,o)
{
return (o*m/73); //инертность 'o' меняется
}
function stepspace_ferum(m,l,i)
{if(i>13){i=13}
return (750+i*30+l*5)/m; //прыжок
}
Атака:
function die_ferum(hero)
{game_over(hero);
}
function def_ferum(hero)
{ hero.last_def=true;
var last =hero.getAttribute("lastbutt");
if(last=="left")
{hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:"+hero.dleft[hero.def_ai]+" no-repeat;\" ></div>";}
if(last=="right")
{hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:"+hero.dright[hero.def_ai]+" no-repeat;\" ></div>";}
if(hero.def_ai<9){hero.def_ai++;}
}
function def_off_ferum(hero)
{
hero.setAttribute("uskor",0);
hero.last_def=false;
hero.def_ai=0;
var last =hero.getAttribute("lastbutt");
if(last=="left")
{hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/lrun/1.png') no-repeat;\" ></div>";}
if(last=="right")
{hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/rrun/1.png') no-repeat;\" ></div>";}
}
function damage_ferum(ofHero,toHero,dmg)
{
if(toHero.hp<=0)
{
var tmp=create_blood_1(toHero.x+20+(parseInt(Math.random()*30)-15),toHero.y+30+(parseInt(Math.random()*40)-20));tmp.style.zIndex="10000";
toHero.die_bool=true;toHero.h=43;
if(toHero.hname=="Hero")
{hpin.style.width="0px";}
toHero.style.width="87px";
toHero.style.height="43px";}
else{
if(!toHero.last_def){
toHero.hp-=((ofHero.getAttribute("damage")+dmg)*0.1);
if((toHero.hname=="Hero")&&(toHero.hp>=0))
{hpin.style.width=toHero.hp+"px";}
var tmp=create_blood_1(toHero.x+20+(parseInt(Math.random()*30)-15),toHero.y+30+(parseInt(Math.random()*40)-20));tmp.style.zIndex="10000";
}
}
}
function Atack_ferum(hero,x,y,m,l)
{if(hero.atack_first_bool==false)
{hero.atack_first_bool=true;
hero.last_atack_bool=true;
hero.style.backgroundImage="";
}
else{
var last =hero.getAttribute("lastbutt");
var atack;
if(last=="left")
{atack=hero.atack_left(hero,x,y);
if(atack){hero.damage(hero,atack,5);}
hero.animate_Latack(hero);
}
if(last=="right")
{atack=hero.atack_right(hero,x,y);
if(atack){hero.damage(hero,atack,5);}
hero.animate_Ratack(hero);
}}
}
function Atack_off_ferum(hero)
{hero.atack_first_bool=false;
hero.last_atack_bool=false;
hero.innerHTML="";
var last =hero.getAttribute("lastbutt");
if(last=="left")
{hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/lrun/1.png') no-repeat;\" ></div>";}
if(last=="right")
{hero.innerHTML="<div style=\"position:absolute;width:45px;height:75px;background:url('Objects/dynamic/ferum/animation/rrun/1.png') no-repeat;\" ></div>";}
}
function atack_left_ferum(hero,x,y)
{
var tmp,x2,y2;
for(var i=0;i<PersForMain.length;i++)
{
tmp=PersForMain[i];
if(tmp.id!=hero.id)
{
x2=tmp.x+40;y2=tmp.y;
if(Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2))<hero.radForA)
{ return tmp;
} }
}
return false;
}
function atack_right_ferum(hero,x,y)
{
x+=40;
var tmp,x2,y2;
for(var i=0;i<PersForMain.length;i++)
{
tmp=PersForMain[i];
if(tmp.id!=hero.id)
{
x2=tmp.x;y2=tmp.y;
if(Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2))<hero.radForA)
{ return tmp;
} }
}
return false;
}
function animate_Latack_ferum(hero)
{var back;
if(hero.atack_type==0){
back=hero.aleft_1[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-12px;margin-left:-31px;width:76px;height:87px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==1){
back=hero.aleft_2[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-1px;margin-left:-19px;width:57px;height:76px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==2){
back=hero.aleft_3[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-2px;margin-left:-23px;width:68px;height:78px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>=15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}
}
function animate_Ratack_ferum(hero)
{var back;
if(hero.atack_type==0){
back=hero.aright_1[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-12px;margin-left:10px;width:76px;height:87px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==1){
back=hero.aright_2[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-1px;margin-left:5px;width:57px;height:76px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}
if(hero.atack_type==2){
back=hero.aright_3[hero.aai];
hero.innerHTML="<div style=\"position:absolute;margin-top:-2px;margin-left:0px;width:68px;height:78px;background:"+back+" no-repeat;\" ></div>";
hero.aai++;
hero.atack_i++;
if(hero.aai>=15){hero.aai=0;
hero.atack_iend=16;
hero.atack_type=parseInt(Math.random()*3)}}}
2.2.5.2Dark_1
Dark_1 это противник главного персонажа. Код этого героя схож с предыдущим, поэтому стоит отметить только самое важное отличие - интеллект.Управление 'дарком' происходит с помощью передачи следующей функции в массив ObjForMain.
Brain:
function intel_dark_1(hero,OJ)
{
if((hero1.y>hero.y-30)&&(hero1.y<hero.y+30))
{
if(hero1.x>hero.x+50)
{hero.setAttribute("right",1);}
else{hero.setAttribute("right",0);}
if(hero1.x+50<hero.x)
{hero.setAttribute("left",1);}
else{hero.setAttribute("left",0);}
if((hero1.x>hero.x-58)&&(hero1.x<hero.x+58))
{
if(hero1.x>hero.x)
{hero.setAttribute("right",1);}
else
{hero.setAttribute("left",1);}
hero.setAttribute("atack",1);
}
else{hero.setAttribute("atack",0);}
}
else
{
hero.setAttribute("atack",0);
hero.setAttribute("left",0);
hero.setAttribute("right",0);
}
}
2.2.5.3Blood
Blood это кровь, которая появляется во время игры. Инициализируется когда какой либо персонаж получает урон. Примером случая инициализации станет:
function damage_ferum(ofHero,toHero,dmg)
{
if(toHero.hp<=0)
{
var tmp=create_blood_1(toHero.x+20+(parseInt(Math.random()*30)-15),toHero.y+30+(parseInt(Math.random()*40)-20));tmp.style.zIndex="10000";
toHero.die_bool=true;toHero.h=43;
if(toHero.hname=="Hero")
{hpin.style.width="0px";}
toHero.style.width="87px";
toHero.style.height="43px";}
else{
if(!toHero.last_def){
toHero.hp-=((ofHero.getAttribute("damage")+dmg)*0.1);
if((toHero.hname=="Hero")&&(toHero.hp>=0))
{hpin.style.width=toHero.hp+"px";}
var tmp=create_blood_1(toHero.x+20+(parseInt(Math.random()*30)-15),toHero.y+30+(parseInt(Math.random()*40)-20));tmp.style.zIndex="10000";
}
}
}
Иницилизация:
function create_blood_1(x,y)
{var w=5;var h=5;
var rnd=parseInt(Math.random()*6)+1
var o=create_object(w,h,x,y,"url('Objects/universal/blood_1/back_"+rnd+".png')");
o.vx=parseInt(Math.random()*30)-15;
o.vy=parseInt(Math.random()*30)-15;
o.i=0;
o.Action=Action_blood_1;
ObjForMain[ObjForMain.length]=o;
return o;
}
Действие:
function Action_blood_1(o,OJ)
{
if(o.i<6)
{
o.x+=o.vx;
o.y+=o.vy;
o.style.marginTop=o.y+"px";
o.style.marginLeft=o.x+"px";
o.i++;
}
else
{ObjForMain.splice(OJ,1);
document.body.removeChild(o);
}
}
2.2.5.4 Hostile_dynamic_1
* Hostile_dynamic_1 этот объект движется сверху вниз и обратно. Если под него попадает персонаж, то жертва получает смертельный урон. Объект имеет особенность, ждать указанное в аргументах время наверху и внизу.
* Инициализация:
function create_hostile_dynamic_1(x,y,w,h,s,t1,t2)
{w=parseInt(w/9)*9;
var o=create_object(w,18,x,y,"url('Objects/universal/hostile_dynamic_1/back.png')");
o.t1=t1;
o.t2=t2;
o.ti1=0;
o.ti2=0;
o.s=s;
o.H=h;
o.y1=y;
o.downbool=3;
o.Action=Action_hostile_dynamic_1;
o.Reaction=Reaction_hostile_dynamic_1;o.RunBool=0;
ObjForMain[ObjForMain.length]=o;
Add_pxbool(x,y,w,h,2);
Add_StOM(x,y,w,h,o);
return o;
}
Действие:
function Action_hostile_dynamic_1(o,OJ)
{
if((o.y<(o.y1+o.H-18))&&(o.downbool==0))
{o.y+=o.s;
o.style.marginTop=o.y+"px";}
if((o.y>=(o.y1+o.H-18))&&(o.downbool==0))
{o.downbool=1;}
if(o.downbool==1)
{if(o.ti1<o.t1)
{o.ti1++;}
else{o.downbool=2;
o.ti1=0;}
}
if((o.y>o.y1)&&(o.downbool==2))
{o.y-=o.s;
o.style.marginTop=o.y+"px";}
if((o.y<=o.y1+o.s)&&(o.downbool==2))
{o.downbool=3;}
if(o.downbool==3)
{if(o.ti2<o.t2)
{o.ti2++;}
else{o.downbool=0;
o.ti2=0;}
}
for(var pi=0;pi<PersForMain.length;pi++)
{if(((o.x+o.w)>PersForMain[pi].x)&&((o.x)<(PersForMain[pi].x+PersForMain[pi].w))){
o.Reaction(PersForMain[pi],o.x,o.y);}}
}
Реакция:
function Reaction_hostile_dynamic_1(hero,x,y)
{var som=StaticObjectMatrix[x][y];
if(((som.y+18)>hero.y)&&((som.y)<(hero.y+hero.h)))
{hero.damage(som,hero,5000);}
}
2.2.5.5Wood_floor_1
* Wood_floor_1 это деревянный пол, по которому можно перемещатся.
Инициализация:
functioncreate_wood_floor_1(x,y,w)
{varh=23;
var block=create_object(w,h,x,y,"url('Objects/static/wood_floor_1/back.png')");
for(i=x;i<x+w;i++){
for(j=y+16;j<y+h-3;j++){
pixelsBool[i][j]=1;pixelsBlocks[i][j]=block}}
block.style.boxShadow="#101010 0px 10px 30px";
return block;
}
2.2.5.6Wood_box_1
Wood_box_1 это деревянная коробка является непроходимым препятствием. Но на нее можно запрыгнуть.
Инициализация:
functioncreate_wood_box_1(x,y)
{var h=56,w=52;
var block=create_object(w,h,x,y,"url('Objects/static/wood_box_1/back.png')");
for(var i=x;i<x+40;i++)
{pixelsBool[i][y+16]=1;pixelsBlocks[i][y+16]=block; pixelsBool[i][y+17]=1;pixelsBlocks[i][y+16]=block; }
for(var j=y+17;j<y+h;j++){
pixelsBool[x][j]=1;pixelsBlocks[x][j]=block;
pixelsBool[x+1][j]=1;pixelsBlocks[x+1][j]=block;
pixelsBool[x+40][j]=1;pixelsBlocks[x+40][j]=block;
pixelsBool[x+41][j]=1;pixelsBlocks[x+41][j]=block;
}
return block;
}
2.2.5.7Stair_1
Stair_1 это лестница, по которой персонаж может подняться, или опуститься. Требует особого внимания т.к. ее код на некоторое время изменяет управляющие функции поднимающегося персонажа.
Инициализация:
function create_stair_1(x,y,h)
{var w=60;
var block=create_object(w,h,x,y,"url('Objects/static/stair_1/back.png')");
for(var i=y-70;i<y+h;i++){
for(var j=x;j<=x+60;j++){
if(pixelsBool[j][i]==0){pixelsBool[j][i]=2;StaticObjectMatrix[j][i]=block;}}}
block.Reaction=reac_stair_1;
block.RunBool=0;
block.stair_i=0;
return block;
}
Реакция:
function reac_stair_1(hr,x,y)
{if(hr.getAttribute("space")==1){
var b=StaticObjectMatrix[x][y];
var h=b.h;
hr.setAttribute("up",0);
hr.setAttribute("left",0);
hr.setAttribute("right",0);
hr.setAttribute("down",0);
hr.setAttribute("space",0);
hr.setAttribute("uskor",0);
//------
hr.Right=stair_right_1;
hr.Left=stair_left_1;
hr.Up=stair_up_1;
hr.UpLeft=stair_upLeft_1;
hr.UpRight=stair_upRight_1;
hr.Down=stair_down_1;
hr.DownRight=stair_downRight_1;
hr.DownLeft=stair_downLeft_1;
hr.Nothing=null_func;
hr.goAnimateLeft=null_func;
hr.goAnimateRight=null_func;
hr.goAnimateUpLeft=null_func;
hr.goAnimateUpRight=null_func;
//------
hr.x=b.x;
hr.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hr.stair[0]+" no-repeat;\" ></div>";
hr.style.marginLeft=b.x;
hr.stair_obj=b;
hr.stair_i=0;
}
return true;
}
Функции, временно заменяющие управляющие:
function check_stair_x_1(hero)
{
if((hero.x+40<hero.stair_obj.x)||(hero.x>hero.stair_obj.x+50))
{hero.stair_stop_1(hero);}
return true;
}
function null_func(hero){}
//Nothing
// up
function stair_up_1(hero,x,y,mass,lvlup,lvlgo)
{if(hero.y-10>hero.stair_obj.y){
hero.y=hero.y-10;
hero.style.marginTop=hero.y;
hero.stair_i++;
if(hero.stair_i<4){hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[hero.stair_i]+" no-repeat;\" ></div>";}//anim
else{hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[1]+" no-repeat;\" ></div>";hero.stair_i=1;}//anim
}
else
{hero.y=hero.stair_obj.y-80;hero.style.marginTop=hero.y;setTimeout(hero.stair_stop_1,100,hero);}
return true;
}
//down right
function stair_downRight_1(hero,x,y,mass,lvlup,lvlgo)
{if(hero.y+hero.h*1<hero.stair_obj.y+hero.stair_obj.h*1){
hero.y=hero.y+10;
hero.style.marginTop=hero.y;
hero.x+=5;
hero.style.marginLeft=hero.x+"px";
check_stair_x_1(hero);
hero.stair_i--;
if(hero.stair_i>=0){hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[hero.stair_i]+" no-repeat;\" ></div>";}//anim
else{hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[3]+" no-repeat;\" ></div>";hero.stair_i=3;}//anim
}else
{hero.stair_stop_1(hero);}
return true;
}
//down left
function stair_downLeft_1(hero,x,y,mass,lvlup,lvlgo)
{if(hero.y+hero.h*1<hero.stair_obj.y+hero.stair_obj.h*1){
hero.y=hero.y+10;
hero.style.marginTop=hero.y+"px";
hero.x-=5;
hero.style.marginLeft=hero.x+"px";
check_stair_x_1(hero);
hero.stair_i--;
if(hero.stair_i>=0){hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[hero.stair_i]+" no-repeat;\" ></div>";}//anim
else{hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[3]+" no-repeat;\" ></div>";hero.stair_i=3;}//anim
}else
{hero.stair_stop_1(hero);}
return true;
}
//up right
function stair_upRight_1(hero,x,y,mass,lvlup,lvlgo)
{if(hero.y-10>hero.stair_obj.y){
hero.y=hero.y-10;
hero.style.marginTop=hero.y+"px";
hero.x+=5;
hero.style.marginLeft=hero.x+"px";
check_stair_x_1(hero);
hero.stair_i++;
if(hero.stair_i<4){hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[hero.stair_i]+" no-repeat;\" ></div>";}//anim
else{hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[1]+" no-repeat;\" ></div>";hero.stair_i=1;}//anim
}else
{hero.y=hero.stair_obj.y-80;hero.style.marginTop=hero.y+"px";setTimeout(hero.stair_stop_1,100,hero);}
return true;
}
//up left
function stair_upLeft_1(hero,x,y,mass,lvlup,lvlgo)
{if(hero.y-10>hero.stair_obj.y){
hero.y=hero.y-10;
hero.style.marginTop=hero.y+"px";
hero.x-=5;
hero.style.marginLeft=hero.x+"px";
check_stair_x_1(hero);
hero.stair_i++;
if(hero.stair_i<4){hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[hero.stair_i]+" no-repeat;\" ></div>";}//anim
else{hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[1]+" no-repeat;\" ></div>";hero.stair_i=1;}//anim
}else
{hero.y=hero.stair_obj.y-80;hero.style.marginTop=hero.y+"px";setTimeout(hero.stair_stop_1,100,hero);}
return true;
}
// down
function stair_down_1(hero,x,y,mass,lvlup,lvlgo)
{if(hero.y+hero.h<hero.stair_obj.y+hero.stair_obj.h){
hero.y=hero.y+10;
hero.style.marginTop=hero.y+"px";
hero.stair_i--;
if(hero.stair_i>=0){hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[hero.stair_i]+" no-repeat;\" ></div>";}//anim
else{hero.innerHTML="<div style=\"position:absolute;width:60px;height:75px;background:"+hero.stair[3]+" no-repeat;\" ></div>";hero.stair_i=3;}//anim
}else
{hero.stair_stop_1(hero);}
return true;
}
// right
function stair_right_1(hero,x,y,mass,lvlgo)
{
hero.x+=5;
hero.style.marginLeft=hero.x+"px";
check_stair_x_1(hero);
return true;
}
// left
function stair_left_1(hero,x,y,mass,lvlgo)
{
hero.x-=5;
hero.style.marginLeft=hero.x+"px";
check_stair_x_1(hero);
return true;
}
2.2.5.8Wood_door_1
Wood_door_1 это дверь, работающая переходом на другой уровень. Инициализация:
functioncreate_wood_door_1(x,y,k)
{var h=100,w=60;
var block=create_object(w,h,x,y,"url('Objects/static/wood_door_1/back_"+k+".png')");
for(var i=x+10;i<=x+50;i++){
for(var j=y+10;j<=y+90;j++){
pixelsBool[i][j]=2;StaticObjectMatrix[i][j]=block;}}
block.k=k;
block.O=0;
block.RunBool=0;
block.Reaction=reac_wood_door_1;
return block;
}
Реакция:
function reac_wood_door_1(o,x,y)
{
if(o.getAttribute("space")==1)
{if(StaticObjectMatrix[x][y].O!=0){
alert_1(StaticObjectMatrix[x][y].O.text,StaticObjectMatrix[x][y].O);}
}
}
Примеры использования:
Пример без ключа.
temp=create_wood_door_1(934, 645, 0);temp.style.zIndex='8';
var o= {f : function(){
mainBool=false;
heroStartX=100;
heroStartY=600;
level_init=level_2_init;
clear_lvl();
}}
o.text="Перейти на 2 уровень?<br>";
temp.O=o;
Этот участок кода взят из файла инициализации первого уровня. У объекта двери есть свойство wood_door.O, которое является другим объектом для передачи функции alert_1.
Примерсключом.
temp=create_wood_door_1(934, 476, 1);temp.style.zIndex='188';
var o= {
f : function()
{
if(is_key[1]>0)
{
del_key(1);
mainBool=false;
heroStartX=100;
heroStartY=450;
level_init=level_3_init;
clear_lvl();
}
else
{
var o1={f:function(){}}
alert_1("Для перехода нужен Зеленый ключ!",o1);
}
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
Этот участок кода взят из файла инициализации второго уровня. Для перехода на другой уровень требуется зеленый ключ. if(is_key[1]>0)//Проверяем наличие необходимого ключа.
Если ключ есть, то: останавливаем процесс игры, назначаем новые стартовые координаты, назначаем в качестве инициализатора уровня новую функцию,очищаем уровень.Если ключа нет, то выдаем об этом сообщение.
alert_1("Для перехода нужен Зеленый ключ!",o1);
2.2.5.9Key_1
Key_1 это ключ, который требуется для открытия той, или иной двери.
Инициализация:
functioncreate_key_1(x,y,k)
{var h=28,w=12;
var block=create_object_once(w,h,x,y,"url('Objects/static/key_1/back_"+k+".png')");
if(block){
pixelsBool[x+5][y+5]=2;StaticObjectMatrix[x+5][y+5]=block;
pixelsBool[x+4][y+5]=2;StaticObjectMatrix[x+4][y+5]=block;
pixelsBool[x+3][y+5]=2;StaticObjectMatrix[x+3][y+5]=block;
pixelsBool[x+2][y+5]=2;StaticObjectMatrix[x+2][y+5]=block;
block.k=k;
block.RunBool=0;
block.Reaction=reac_key_1;
return block;}
else{
return null_obj();}
}
Реакция:
function reac_key_1(o,x,y)
{
var b=StaticObjectMatrix[x][y];
make_uid(b);
x=b.x;y=b.y;
add_key(b.k);
is_key[b.k]++;
pixelsBool[x+5][y+5]=2;StaticObjectMatrix[x+5][y+5]=0;
pixelsBool[x+4][y+5]=2;StaticObjectMatrix[x+4][y+5]=0;
pixelsBool[x+3][y+5]=2;StaticObjectMatrix[x+3][y+5]=0;
pixelsBool[x+2][y+5]=2;StaticObjectMatrix[x+2][y+5]=0;
setTimeout(function(){b.style.opacity=0.8},100,b);
setTimeout(function(){b.style.opacity=0.6},200,b);
setTimeout(function(){b.style.opacity=0.4},300,b);
setTimeout(function(){b.style.opacity=0.2},400,b);
setTimeout(function(){document.body.removeChild(b);},500,b);
}
3 ЭКОНОМИЧЕСКАЯЧАСТЬ
РАСЧЕТ ПРЕДПОЛАГАЕМОЙ ПРИБЫЛИ ОТ РЕАЛИЗАЦИИ СОЗДАННОГО ПРОГРАММНОГО ПРОДУКТА 3.1 Описание продукта Программный продукт, разработанный в данном дипломном проекте, является графическим движком компьютерных игр. Позволяет значительно упростить реализацию двухмерных комьютерных игр. Проект также включает в себя игру, являющуюся примером, котороя содержит примеры основных объектов.
3.2 Работа программы
Для управления игрой на компьютере используется клавиатура. Для реализации управления игрой, мобильными устройствами можно использовать событие onclick. На этом движке реализованы три типа объектов: динамичные (персонажи), статичные (пол, лестница, коробки и т.д.) и особые (кровь и динамичные колья).
Работы программы отлажена и оптимизирована. Перед разроботкой этого проекта был схожий проект, с теми же целями. На основе предылущей версии был выпущен новый движок, учитывающий все недостатки.Оптимизация происходит засчет разнообразия управляющих функций. Каждая функция отвечает за свою комбинацию клавиш, тем самым сокращая количество работы. При параллельной работе этих функций выполняются лишние циклы (параллельно обрабатываются четыре направления вокруг персонажа), поэтому в главном блоке работа распределяется по определенным сочетаниям клавиш. Также процесс игры ускоряется за счет параметра NSTEP_OPTION. Грубо говоря, проверяется не каждый пиксель матрицы препятствий, а через один.
3.3 Описание и расчет затрат на выполнение проекта
Разработка данного пособия, так же как и разработка любого другого программного продукта, требует определенных материальных, временных и трудовых затрат, а следовательно должна соответственно окупаться. С экономической точки зрения затраты связанные с выполнением проекта, должны быть покрыты доходами от реализации конечного продукта.
Определение трудоёмкости. Трудоемкость выполнения программного продукта - характеризуется перечнем основных этапов и видов работ, которые должны быть выполнены. Упорядочен данный перечень в соответствии со смысловым содержанием каждого вида работ и взаимосвязями между всеми видами работ. Форма расположения работ по этапам:
1.Разработка технического задания (ТЗ):
- получение ТЗ;
2. Подготовительный этап:
-сбор информации;
-определение возможных направлений решения заданий;
-выбор объектного построения программы;
-разработка общей методики создания продукта;
-подготовка промежуточного отчета;
3. Основной этап:
- Разработка основного алгоритма;
-Создание интерфейса;
-Отладка;
4. Завершающий этап:
-Подготовка технической документации;
-сдача продукта.
Определим трудоёмкость нашего проекта Таблица 1 - Расчет трудоёмкости по проекту № п/пВиды работТрудоёмкость1Получение ТЗ12Сбор информации и ознакомление с предметной областью183Определение возможных направлений решения заданий124Выбор объектного построения программы115Разработка общей методики создания продукта106Подготовка промежуточного отчета127Разработка основного алгоритма808Создание интерфейса 159Отладка1210Подготовка технической документации1111Сдача продукта1ИТОГО 183Суммарная трудоемкость составила 183 чел.\час.
Расчет расходов на заработную плату
На основе данных о трудоемкости и средней заработной плате по отрасли рассчитывается основная заработная плата. Допустим, что заработная плата программиста без опыта работы составляет 24 000 тыс. руб. в месяц. (21 рабочий день, 8 часовой рабочий день) или 142,86 руб./час.
Таким образом, расходы на заработную плату по данному проекту составляют:
ЗП = 142,86*183 = 26143,38 руб. Отчисления на ЗП (Пенсионный Фонд, Фонд соц. страхования, Фонд обязательного мед. страхования, территориальные фонды мед. страхования) составляют 26% (20,0+2,9+1,1+2,0 соответственно). В денежном выражении составляют:
26143,38 *0,26=6797,28 руб.
Расходные материалы
Материалы, затраченные на создание проекта, приведены в таблице 2.
Таблица 2 - Материалы, затраченные на создание проекта
Расходные материалы:Количество:Цена за единицу:Сумма (руб.):1)Бумага для принтера1 упаковка1421422)Картридж для принтера1 штука7007003)Интернет1 месяц450 руб/мес4504)CD-R1 штука10105)КанцелярияПапка+файлы60606) Клавиатура1 штука300300Итого1662Расчет амортизации Стоимость компьютера 60 тыс. руб. Используется он в течение 5 лет (60 мес.). Годовая амортизация составит в месяц 1000 руб. В час: 5.95 руб. Умножая на трудоёмкость:
АО= 5,95*183= 1088,85 руб.
Расчет электроэнергии
ПК в среднем употребляет 0,6 Квт/час. 0,6*183=109,8 КВт. Примерная стоимость 1 Квт/ч около 1,50 руб. Итого: 109,8 *1,50=164,7 руб.
Все результаты расчета затрат приведены в таблице 3.
Таблица 3 - Результаты расчетов Наименование статей затратСумма, руб.Расходные материалы1662Основная заработная плата26143,38Расходы на электроэнергию164,7Амортизационные отчисления 1088,85Отчисления на ЗП6797,28Итого35856,21 Таким образом, суммарная стоимость затрат на создание данного программного продукта составляет35856,21рублей, следовательно, продать программу ниже этой стоимости невыгодно.
Созданный программный продукт актуален для рынка приложений на мобильные утсройства и социальные сети.
Рыночная цена данного программного продукта составляет40000 руб. Предполагаемая прибыль составляет 4143,79руб.
В настоящее время практически не существует похожего программного продукта, которыйреализован в данной платформе.
Данная программа при сравнительно небольших затратах в 35856,21рублей, позволяет максимально упростить создание компьютерных игр.
ЗАКЛЮЧЕНИЕ
В результате работы над дипломным проектом был разработан графический движок для реализации двухмерных компьютерных игр. Гибкость структуры кода реализована благодаря массиву особых объектов. Есть примеры особых и динамичных объектов. Достоинства движка:
* Простота структуры
* Гибкость
* Скорость работы, в сравнении с другими проектами похожего типа
* Кросбраузерность (вплоть до IE)
* Кросплатформеность
При написании дипломного проекта были изучены и использованы языки программирования HTML, CSS, JavaScript. Существено улучшились навыки кросбраузерной обработки. В проекте не использовалось ни одной дополнительной библеотеки или чужого кода. В ходе работы было попиксельно нарисовано большое количество изображений. Что стало неотемлимой частью программы. Один только главный персонаж состоит их 166 изображений.
Для редактирования уровней была реализована дополнительная программа.
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
1.http://ru.wikipedia.org/ -свободная энциклопедия, которую может редактировать каждый
2. http://htmlbook.ru/ - свободная энциклопедия языков программирования: HTML, CSS. 3. http://javascript.ru/ - грамотная информация по языку javascript и смежным технологиям.
Приложение 1.Исходный код уровней, неупомянутых объектов, файла главной страницы
function level_1_init(sx,sy)
{var rndc,temp;
game_over=lose_1;
lvl_name="level_1";
document.body.style.background="url('levels/level_1/back.png')";
temp=create_wood_floor_1(0, 745, 1000);temp.style.zIndex='2';
temp=create_wood_door_1(9, 645, 0);temp.style.zIndex='3';
temp=create_wood_box_1(206, 706);temp.style.zIndex='4';
temp=create_wood_box_1(356, 707);temp.style.zIndex='20';
temp=create_wood_box_1(507, 707);temp.style.zIndex='28';
temp=create_wood_box_1(656, 706);temp.style.zIndex='36';
//door 1
temp=create_wood_door_1(934, 645, 0);temp.style.zIndex='8';
var o= {f : function(){
mainBool=false;
heroStartX=100;
heroStartY=600;
level_init=level_2_init;
clear_lvl();
}}
o.text="Перейти на 2 уровень?<br>";
temp.O=o;
//
temp=create_wood_door_1(918, 284, 2);temp.style.zIndex='40';
var o= {
f : function()
{
if(is_key[2]>0)
{
del_key(2);
mainBool=false;
var o1={f:function(){}}
alert_1("Поздравляю",o1);
}
else
{
var o1={f:function(){}}
alert_1("Для перехода нужен Желтый ключ!",o1);
}
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(21, 284, 0);temp.style.zIndex='41';
temp=create_wood_window_1(267, 560);temp.style.zIndex='9';
temp=create_wood_window_1(417, 560);temp.style.zIndex='10';
temp=create_wood_window_1(567, 560);temp.style.zIndex='11';
temp=create_hostile_1(258, 734);temp.style.zIndex='12';
temp=create_hostile_1(284, 737);temp.style.zIndex='13';
temp=create_hostile_1(307, 733);temp.style.zIndex='14';
temp=create_hostile_1(328, 735);temp.style.zIndex='15';
temp=create_hostile_1(256, 742);temp.style.zIndex='16';
temp=create_hostile_1(281, 743);temp.style.zIndex='17';
temp=create_hostile_1(305, 741);temp.style.zIndex='18';
temp=create_hostile_1(328, 743);temp.style.zIndex='19';
temp=create_hostile_1(406, 736);temp.style.zIndex='20';
temp=create_hostile_1(431, 735);temp.style.zIndex='21';
temp=create_hostile_1(456, 735);temp.style.zIndex='22';
temp=create_hostile_1(485, 734);temp.style.zIndex='23';
temp=create_hostile_1(407, 742);temp.style.zIndex='24';
temp=create_hostile_1(432, 743);temp.style.zIndex='25';
temp=create_hostile_1(453, 742);temp.style.zIndex='26';
temp=create_hostile_1(479, 742);temp.style.zIndex='27';
temp=create_hostile_1(559, 735);temp.style.zIndex='28';
temp=create_hostile_1(583, 738);temp.style.zIndex='29';
temp=create_hostile_1(609, 735);temp.style.zIndex='30';
temp=create_hostile_1(637, 734);temp.style.zIndex='31';
temp=create_hostile_1(555, 742);temp.style.zIndex='32';
temp=create_hostile_1(585, 743);temp.style.zIndex='33';
temp=create_hostile_1(611, 741);temp.style.zIndex='34';
temp=create_hostile_1(635, 740);temp.style.zIndex='35';
temp=create_wood_floor_1(0, 384, 300);temp.style.zIndex='36';
temp=create_wood_floor_right_1(300, 384);temp.style.zIndex='37';
temp=create_wood_floor_1(700, 384, 300);temp.style.zIndex='38';
temp=create_wood_floor_left_1(688, 384);temp.style.zIndex='39';
temp=create_wood_window_1(267, 199);temp.style.zIndex='42';
temp=create_wood_window_1(427, 199);temp.style.zIndex='43';
temp=create_wood_window_1(566, 199);temp.style.zIndex='44';
temp=create_picture_5(838, 625);temp.style.zIndex='45';
temp=create_picture_2(123, 625);temp.style.zIndex='46';
temp=create_stair_1(753, 402, 343);temp.style.zIndex='47';
hero1=createFerum(heroStartX,heroStartY);hero1.style.zIndex=5000;
//temp=createFerum(522,600);temp.style.zIndex=30;
return true;
}
function level_2_init()
{var rndc,temp;
game_over=lose_1;
lvl_name="level_2";
document.body.style.background="url('levels/level_1/back.png')";
temp=create_wood_floor_1(0, 745, 1000);temp.style.zIndex='0';
temp=create_wood_floor_1(0, 576, 300);temp.style.zIndex='2';
temp=create_wood_floor_1(0, 384, 550);temp.style.zIndex='3';
temp=create_wood_floor_1(0, 192, 1000);temp.style.zIndex='4';
temp=create_wood_door_1(934, 476, 1);temp.style.zIndex='188';
var o= {
f : function()
{
if(is_key[1]>0)
{
del_key(1);
mainBool=false;
heroStartX=100;
heroStartY=450;
level_init=level_3_init;
clear_lvl();
}
else
{
var o1={f:function(){}}
alert_1("Для перехода нужен Зеленый ключ!",o1);
}
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(934, 284, 4);temp.style.zIndex='8';
var o= {
f : function()
{
if(is_key[4]>0)
{
del_key(4);
mainBool=false;
heroStartX=100;
heroStartY=250;
level_init=level_5_init;
clear_lvl();
}
else
{
var o1={f:function(){}}
alert_1("Для перехода нужен Красный ключ!",o1);
}
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_hostile_1(650, 736);temp.style.zIndex='17';
temp=create_hostile_1(676, 736);temp.style.zIndex='19';
temp=create_hostile_1(700, 736);temp.style.zIndex='20';
temp=create_hostile_1(727, 737);temp.style.zIndex='21';
temp=create_hostile_1(753, 738);temp.style.zIndex='22';
temp=create_hostile_1(679, 743);temp.style.zIndex='25';
temp=create_hostile_1(707, 744);temp.style.zIndex='26';
temp=create_hostile_1(735, 743);temp.style.zIndex='27';
temp=create_hostile_1(757, 742);temp.style.zIndex='28';
temp=create_stair_1(791, 595, 152);temp.style.zIndex='289';
temp=create_wood_window_1(267, 24);temp.style.zIndex='42';
temp=create_wood_window_1(427, 24);temp.style.zIndex='43';
temp=create_wood_window_1(567, 24);temp.style.zIndex='44';
temp=create_wood_window_1(267, 216);temp.style.zIndex='38';
temp=create_wood_window_1(427, 216);temp.style.zIndex='39';
temp=create_wood_window_1(567, 216);temp.style.zIndex='40';
temp=create_picture_2(804, 96);temp.style.zIndex='59';
temp=create_picture_6(157, 96);temp.style.zIndex='60';
temp=create_picture_3(158, 288);temp.style.zIndex='61';
temp=create_picture_4(157, 480);temp.style.zIndex='62';
temp=create_picture_1(157, 624);temp.style.zIndex='63';
temp=create_stair_1(11, 407, 170);temp.style.zIndex='289';
temp=create_wood_floor_right_1(300, 576);temp.style.zIndex='74';
temp=create_wood_floor_1(777, 576, 223);temp.style.zIndex='75';
temp=create_wood_floor_left_1(765, 576);temp.style.zIndex='76';
temp=create_wood_door_1(934, 645, 0);temp.style.zIndex='187';//--
temp=create_wood_door_1(934, 94, 0);temp.style.zIndex='5';//--
temp=create_wood_door_1(8, 645, 0);temp.style.zIndex='7';//--
var o= {
f : function()
{ mainBool=false;
heroStartX=900;
heroStartY=600;
level_init=level_1_init;
clear_lvl();}
}
o.text="Перейтинадругойуровень?<br>";temp.O=o;
temp=create_stair_1(91, 214, 170);temp.style.zIndex='289';
temp=create_wood_box_1(600, 707);temp.style.zIndex='190';
temp=create_hostile_1(562, 731);temp.style.zIndex='191';
temp=create_hostile_1(569, 737);temp.style.zIndex='192';
temp=create_hostile_1(534, 736);temp.style.zIndex='193';
temp=create_hostile_1(540, 741);temp.style.zIndex='194';
temp=create_hostile_1(513, 737);temp.style.zIndex='195';
temp=create_hostile_1(504, 744);temp.style.zIndex='196';
temp=create_hostile_1(487, 735);temp.style.zIndex='197';
temp=create_hostile_1(473, 742);temp.style.zIndex='198';
temp=create_hostile_1(452, 731);temp.style.zIndex='199';
temp=create_wood_box_1(400, 707);temp.style.zIndex='200';
temp=create_hostile_1(452, 740);temp.style.zIndex='201';
temp=create_hostile_1(370, 735);temp.style.zIndex='202';
temp=create_hostile_1(369, 743);temp.style.zIndex='203';
temp=create_hostile_1(346, 737);temp.style.zIndex='204';
temp=create_hostile_1(338, 742);temp.style.zIndex='205';
temp=create_hostile_1(316, 735);temp.style.zIndex='206';
temp=create_hostile_1(307, 741);temp.style.zIndex='207';
temp=create_picture_5(328, 624);temp.style.zIndex='208';
temp=create_wood_window_1(267, 408);temp.style.zIndex='209';
temp=create_wood_window_1(427, 408);temp.style.zIndex='210';
temp=create_wood_window_1(567, 408);temp.style.zIndex='211';
temp=create_picture_5(710, 288);temp.style.zIndex='212';
temp=create_picture_2(797, 483);temp.style.zIndex='213';
temp=create_count_1(8, 155);temp.style.zIndex='214';
temp=create_count_1(454, 151);temp.style.zIndex='215';
temp=create_count_1(293, 157);temp.style.zIndex='216';
temp=create_count_1(596, 153);temp.style.zIndex='217';
temp=create_count_1(700, 133);temp.style.zIndex='218';
temp=create_count_1(746, 97);temp.style.zIndex='219';
temp=create_count_1(799, 58);temp.style.zIndex='220';
temp=create_count_1(852, 56);temp.style.zIndex='221';
temp=create_count_1(904, 80);temp.style.zIndex='222';
temp=create_key_1(899, 144, 1);temp.style.zIndex='223';
temp=create_hostile_dynamic_1(200,5,9,180,20,80,10);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(300,5,9,180,20,80,10);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(400,5,9,180,20,80,10);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(500,5,9,180,20,80,10);temp.style.zIndex='70';
temp=create_wood_floor_1(429, 576, 196);temp.style.zIndex='224';
temp=create_wood_floor_left_1(417, 576);temp.style.zIndex='225';
temp=create_wood_floor_right_1(625, 576);temp.style.zIndex='226';
temp=create_wood_floor_right_1(550, 384);temp.style.zIndex='227';
temp=create_wood_floor_1(777, 384, 223);temp.style.zIndex='0';
temp=create_wood_floor_left_1(765, 384);temp.style.zIndex='229';
temp=create_wood_box_1(504, 346);temp.style.zIndex='230';
temp=create_wood_box_1(770, 345);temp.style.zIndex='231';
temp=create_hostile_1(823, 372);temp.style.zIndex='232';
temp=create_hostile_1(820, 379);temp.style.zIndex='233';
temp=create_hostile_1(472, 371);temp.style.zIndex='234';
temp=create_hostile_1(469, 380);temp.style.zIndex='235';
temp=create_count_1(784, 310);temp.style.zIndex='236';
temp=create_count_1(523, 313);temp.style.zIndex='237';
temp=create_count_1(418, 666);temp.style.zIndex='238';
temp=create_count_1(474, 642);temp.style.zIndex='239';
temp=create_count_1(534, 632);temp.style.zIndex='240';
temp=create_count_1(614, 667);temp.style.zIndex='241';
temp=create_count_1(131, 159);temp.style.zIndex='242';
hero1=createFerum(heroStartX,heroStartY);hero1.style.zIndex=5000;
return true;}
function level_3_init()
{var rndc,temp;
game_over=lose_1;
lvl_name="level_3";
document.body.style.background="url('levels/level_3/back.png')";
temp=create_wood_floor_1(0, 745, 1000);temp.style.zIndex='1';
temp=create_wood_floor_1(0, 576, 648);temp.style.zIndex='2';
temp=create_wood_floor_1(0, 384, 648);temp.style.zIndex='3';
temp=create_wood_floor_1(0, 192, 1000);temp.style.zIndex='4';
temp=createdark_1(100,20);temp.style.zIndex=500;
temp=create_wood_door_1(934, 94, 0);temp.style.zIndex='5';
var o= {
f : function()
{
mainBool=false;
heroStartX=100;
heroStartY=94;
level_init=level_4_init;
clear_lvl();
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(934, 646, 4);temp.style.zIndex='6';
var o= {
f : function()
{
if(is_key[4]>0)
{
del_key(4);
heroStartX=100;
heroStartY=646;
mainBool=false;
level_init=level_4_init;
clear_lvl();
}
else
{
var o1={f:function(){}}
alert_1("Для перехода нужен Красный ключ!",o1);
}
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(8, 645, 0);temp.style.zIndex='7';
var o= {
f : function()
{
mainBool=false;
heroStartX=934;
heroStartY=646;
level_init=level_2_init;
clear_lvl();
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(8, 93, 0);temp.style.zIndex='8';
var o= {
f : function()
{
mainBool=false;
heroStartX=934;
heroStartY=93;
level_init=level_2_init;
clear_lvl();
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(8, 476, 0);temp.style.zIndex='9';
var o= {
f : function()
{
mainBool=false;
heroStartX=934;
heroStartY=476;
level_init=level_2_init;
clear_lvl();
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_key_1(32, 332, 4);temp.style.zIndex='10';
temp=create_wood_floor_right_1(647, 384);temp.style.zIndex='11';
temp=create_wood_floor_right_1(648, 576);temp.style.zIndex='12';
temp=create_wood_floor_1(777, 576, 223);temp.style.zIndex='13';
temp=create_wood_floor_1(777, 384, 223);temp.style.zIndex='14';
temp=create_wood_floor_left_1(765, 384);temp.style.zIndex='15';
temp=create_wood_floor_left_1(765, 576);temp.style.zIndex='16';
temp=create_hostile_1(700, 736);temp.style.zIndex='20';
temp=create_hostile_1(727, 737);temp.style.zIndex='21';
temp=create_hostile_1(753, 738);temp.style.zIndex='22';
temp=create_hostile_1(707, 744);temp.style.zIndex='26';
temp=create_hostile_1(735, 743);temp.style.zIndex='27';
temp=create_hostile_1(757, 742);temp.style.zIndex='28';
temp=create_hostile_1(780, 565);temp.style.zIndex='29';
temp=create_hostile_1(778, 571);temp.style.zIndex='30';
temp=create_hostile_1(627, 373);temp.style.zIndex='31';
temp=create_hostile_1(617, 378);temp.style.zIndex='32';
temp=create_wood_box_1(769, 344);temp.style.zIndex='33';
temp=create_stair_1(878, 407, 170);temp.style.zIndex='34';
temp=create_wood_window_1(267, 24);temp.style.zIndex='42';
temp=create_wood_window_1(427, 24);temp.style.zIndex='43';
temp=create_wood_window_1(567, 24);temp.style.zIndex='44';
temp=create_wood_window_1(267, 216);temp.style.zIndex='38';
temp=create_wood_window_1(427, 216);temp.style.zIndex='39';
temp=create_wood_window_1(567, 216);temp.style.zIndex='40';
temp=create_wood_window_1(267, 408);temp.style.zIndex='41';
temp=create_wood_window_1(427, 408);temp.style.zIndex='42';
temp=create_wood_window_1(567, 408);temp.style.zIndex='43';
temp=create_wood_window_1(267, 600);temp.style.zIndex='44';
temp=create_wood_window_1(427, 600);temp.style.zIndex='45';
temp=create_wood_window_1(567, 600);temp.style.zIndex='46';
temp=create_count_1(903, 348);temp.style.zIndex='47';
temp=create_count_1(963, 530);temp.style.zIndex='48';
temp=create_count_1(867, 710);temp.style.zIndex='49';
temp=create_count_1(695, 679);temp.style.zIndex='50';
temp=create_count_1(524, 697);temp.style.zIndex='51';
temp=create_count_1(369, 686);temp.style.zIndex='52';
temp=create_count_1(370, 533);temp.style.zIndex='53';
temp=create_count_1(529, 519);temp.style.zIndex='54';
temp=create_count_1(528, 332);temp.style.zIndex='55';
temp=create_count_1(370, 333);temp.style.zIndex='56';
temp=create_count_1(525, 141);temp.style.zIndex='57';
temp=create_count_1(376, 136);temp.style.zIndex='58';
temp=create_picture_4(804, 96);temp.style.zIndex='59';
temp=create_picture_2(157, 96);temp.style.zIndex='60';
temp=create_picture_2(158, 288);temp.style.zIndex='61';
temp=create_picture_5(157, 480);temp.style.zIndex='62';
temp=create_picture_1(157, 649);temp.style.zIndex='63';
hero1=createFerum(heroStartX,heroStartY);hero1.style.zIndex=5000;
return true;
}
function level_4_init()
{var rndc,temp;
game_over=lose_1;
lvl_name="level_4";
document.body.style.background="url('levels/level_1/back.png')";
temp=create_wood_floor_1(0, 745, 1000);temp.style.zIndex='1';
temp=create_wood_floor_1(0, 576, 648);temp.style.zIndex='2';
temp=create_wood_floor_1(0, 384, 1000);temp.style.zIndex='3';
temp=create_wood_floor_1(0, 192, 1000);temp.style.zIndex='4';
temp=create_wood_door_1(934, 94, 0);temp.style.zIndex='5';
var o= {
f : function()
{
mainBool=false;
heroStartX=100;
heroStartY=20;
level_init=level_5_init;
clear_lvl();}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(8, 645, 0);temp.style.zIndex='7';
var o= {
f : function()
{
mainBool=false;
heroStartX=934;
heroStartY=645;
level_init=level_3_init;
clear_lvl();}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(8, 93, 0);temp.style.zIndex='8';
var o= {
f : function()
{
mainBool=false;
heroStartX=934;
heroStartY=20;
level_init=level_3_init;
clear_lvl();
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_hostile_1(650, 736);temp.style.zIndex='17';
temp=create_hostile_1(676, 736);temp.style.zIndex='19';
temp=create_hostile_1(700, 736);temp.style.zIndex='20';
temp=create_hostile_1(727, 737);temp.style.zIndex='21';
temp=create_hostile_1(753, 738);temp.style.zIndex='22';
temp=create_hostile_1(653, 743);temp.style.zIndex='24';
temp=create_hostile_1(679, 743);temp.style.zIndex='25';
temp=create_hostile_1(707, 744);temp.style.zIndex='26';
temp=create_hostile_1(735, 743);temp.style.zIndex='27';
temp=create_hostile_1(757, 742);temp.style.zIndex='28';
temp=create_stair_1(878, 595, 152);temp.style.zIndex='340';
temp=create_wood_window_1(267, 24);temp.style.zIndex='42';
temp=create_wood_window_1(427, 24);temp.style.zIndex='43';
temp=create_wood_window_1(567, 24);temp.style.zIndex='44';
temp=create_wood_window_1(267, 216);temp.style.zIndex='38';
temp=create_wood_window_1(427, 216);temp.style.zIndex='39';
temp=create_wood_window_1(567, 216);temp.style.zIndex='40';
temp=create_wood_window_1(267, 600);temp.style.zIndex='44';
temp=create_wood_window_1(427, 600);temp.style.zIndex='45';
temp=create_wood_window_1(567, 600);temp.style.zIndex='46';
temp=create_picture_1(804, 96);temp.style.zIndex='59';
temp=create_picture_2(157, 96);temp.style.zIndex='60';
temp=create_picture_3(158, 288);temp.style.zIndex='61';
temp=create_picture_4(157, 480);temp.style.zIndex='62';
temp=create_picture_5(157, 649);temp.style.zIndex='63';
temp=create_key_1(957, 326, 4);temp.style.zIndex='64';
temp=create_wood_box_1(280, 539);temp.style.zIndex='65';
temp=create_hostile_1(294, 523);temp.style.zIndex='66';
temp=create_hostile_1(300, 529);temp.style.zIndex='67';
temp=create_hostile_1(285, 532);temp.style.zIndex='68';
temp=create_hostile_1(245, 562);temp.style.zIndex='69';
temp=create_hostile_1(247, 570);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(700,205,9,180,10,80,10);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(709,205,9,180,10,70,20);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(718,205,9,180,10,60,30);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(727,205,9,180,10,50,40);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(736,205,9,180,10,40,50);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(745,205,9,180,10,30,60);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(754,205,9,180,10,20,70);temp.style.zIndex='70';
temp=create_hostile_dynamic_1(763,205,9,180,10,10,80);temp.style.zIndex='70';
temp=create_key_1(27, 326, 5);temp.style.zIndex='71';
temp=create_stair_1(443, 406, 170);temp.style.zIndex='340';
temp=create_wood_floor_right_1(648, 576);temp.style.zIndex='74';
temp=create_wood_floor_1(777, 572, 223);temp.style.zIndex='75';
temp=create_wood_floor_left_1(765, 572);temp.style.zIndex='76';
temp=create_count_1(734, 153);temp.style.zIndex='77';
temp=create_count_1(674, 150);temp.style.zIndex='78';
temp=create_count_1(598, 154);temp.style.zIndex='79';
temp=create_count_1(517, 152);temp.style.zIndex='80';
temp=create_count_1(453, 156);temp.style.zIndex='81';
temp=create_count_1(371, 153);temp.style.zIndex='82';
temp=create_count_1(306, 154);temp.style.zIndex='83';
temp=create_count_1(231, 152);temp.style.zIndex='84';
temp=create_count_1(797, 533);temp.style.zIndex='85';
temp=create_count_1(835, 534);temp.style.zIndex='86';
temp=create_count_1(965, 530);temp.style.zIndex='87';
temp=create_count_1(373, 692);temp.style.zIndex='88';
temp=create_count_1(531, 686);temp.style.zIndex='89';
temp=create_count_1(230, 687);temp.style.zIndex='90';
temp=create_count_1(42, 525);temp.style.zIndex='91';
temp=create_count_1(10, 528);temp.style.zIndex='92';
temp=create_count_1(112, 151);temp.style.zIndex='93';
temp=create_count_1(887, 145);temp.style.zIndex='94';
temp=createdark_1(100,220);temp.style.zIndex=500;
hero1=createFerum(heroStartX,heroStartY);hero1.style.zIndex=5000;
return true;}
function level_5_init()
{var rndc,temp;
game_over=lose_1;
lvl_name="level_5";
document.body.style.background="url('levels/level_1/back.png')";
temp=create_wood_floor_1(0, 745, 1000);temp.style.zIndex='1';
temp=create_wood_floor_1(0, 576, 1000);temp.style.zIndex='2';
temp=create_wood_floor_1(0, 384, 1000);temp.style.zIndex='3';
temp=create_wood_floor_1(0, 192, 1000);temp.style.zIndex='4';
temp=create_wood_door_1(8, 93, 5);temp.style.zIndex='8';
var o= {
f : function()
{
if(is_key[5]>0)
{
heroStartX=900;
heroStartY=20;
del_key(5);
mainBool=false;
level_init=level_4_init;
clear_lvl();
}
else
{
var o1={f:function(){}}
alert_1("Для перехода нужен Синий ключ!",o1);
}
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_wood_door_1(8, 284, 0);temp.style.zIndex='9';
var o= {
f : function()
{
mainBool=false;
heroStartX=900;
heroStartY=284;
level_init=level_2_init;
clear_lvl();
}
}
o.text="Перейти на другой уровень?<br>";
temp.O=o;
temp=create_hostile_1(627, 373);temp.style.zIndex='31';
temp=create_hostile_1(617, 378);temp.style.zIndex='32';
temp=create_stair_1(923, 215, 170);temp.style.zIndex='34';
temp=create_wood_window_1(267, 24);temp.style.zIndex='42';
temp=create_wood_window_1(567, 24);temp.style.zIndex='44';
temp=create_wood_window_1(267, 216);temp.style.zIndex='38';
temp=create_wood_window_1(567, 216);temp.style.zIndex='40';
temp=create_wood_window_1(267, 600);temp.style.zIndex='44';
temp=create_wood_window_1(567, 600);temp.style.zIndex='46';
temp=create_picture_3(804, 96);temp.style.zIndex='59';
temp=create_picture_4(157, 96);temp.style.zIndex='60';
temp=create_picture_1(158, 288);temp.style.zIndex='61';
temp=create_picture_6(157, 649);temp.style.zIndex='63';
temp=create_wood_box_1(777, 537);temp.style.zIndex='418';
temp=create_wood_box_1(171, 538);temp.style.zIndex='419';
temp=create_count_1(792, 510);temp.style.zIndex='420';
temp=create_count_1(188, 510);temp.style.zIndex='421';
temp=create_stair_1(923, 598, 148);temp.style.zIndex='422';
temp=create_stair_1(384, 406, 170);temp.style.zIndex='423';
temp=create_stair_1(556, 406, 170);temp.style.zIndex='424';
temp=create_hostile_1(850, 371);temp.style.zIndex='425';
temp=create_hostile_1(843, 380);temp.style.zIndex='426';
temp=create_picture_1(693, 649);temp.style.zIndex='427';
temp=create_key_1(685, 532, 2);temp.style.zIndex='428';
temp=create_wood_box_1(456, 538);temp.style.zIndex='429';
temp=create_wood_box_1(456, 497);temp.style.zIndex='430';
temp=create_wood_box_1(456, 454);temp.style.zIndex='431';
temp=create_wood_box_1(456, 411);temp.style.zIndex='432';
temp=create_wood_box_1(488, 344);temp.style.zIndex='10';
temp=create_wood_box_1(489, 302);temp.style.zIndex='10';
temp=create_wood_box_1(489, 217);temp.style.zIndex='436';
temp=create_stair_1(16, 598, 148);temp.style.zIndex='437';
temp=create_wood_box_1(490, 260);temp.style.zIndex='40';
temp=create_hostile_dynamic_1(750,210,9,180,15,0,100);temp.style.zIndex='500';
temp=create_hostile_dynamic_1(760,210,9,180,15,0,90);temp.style.zIndex='500';
temp=create_hostile_dynamic_1(770,210,9,180,15,0,90);temp.style.zIndex='500';
temp=create_hostile_dynamic_1(780,210,9,180,15,0,70);temp.style.zIndex='500';
temp=createdark_1(500,20);temp.style.zIndex=500;
temp=createdark_1(500,650);temp.style.zIndex=500;
hero1=createFerum(heroStartX,heroStartY);hero1.style.zIndex=5000;
return true;
}
function create_count_1(x,y)
{var h=24,w=22;
var block=create_object_once(w,h,x,y,"url('Objects/static/count_1/back.png')");
if(block){
for(var i=5;i<=15;i++){
pixelsBool[x+i][y]=2;StaticObjectMatrix[x+i][y]=block;
pixelsBool[x+i][y+1]=2;StaticObjectMatrix[x+i][y+1]=block;
pixelsBool[x+i][y+2]=2;StaticObjectMatrix[x+i][y+2]=block;
pixelsBool[x+i][y+3]=2;StaticObjectMatrix[x+i][y+3]=block;
pixelsBool[x+i][y+4]=2;StaticObjectMatrix[x+i][y+4]=block;
}
block.RunBool=0;
block.Reaction=reac_count_1;
return block;}
else{
return null_obj();}
}
function reac_count_1(o,x,y)
{
var b=StaticObjectMatrix[x][y];
make_uid(b);
x=b.x;y=b.y; b.RunBool=1;
pixelsBool[x+5][y+5]=0;StaticObjectMatrix[x+5][y+5]=0;
pixelsBool[x+4][y+5]=0;StaticObjectMatrix[x+4][y+5]=0;
pixelsBool[x+3][y+5]=0;StaticObjectMatrix[x+3][y+5]=0;
pixelsBool[x+2][y+5]=0;StaticObjectMatrix[x+2][y+5]=0;
pixelsBool[x+5][y+6]=0;StaticObjectMatrix[x+5][y+6]=0;
pixelsBool[x+4][y+6]=0;StaticObjectMatrix[x+4][y+6]=0;
pixelsBool[x+3][y+6]=0;StaticObjectMatrix[x+3][y+6]=0;
pixelsBool[x+2][y+6]=0;StaticObjectMatrix[x+2][y+6]=0;
pixelsBool[x+5][y+7]=0;StaticObjectMatrix[x+5][y+7]=0;
pixelsBool[x+4][y+7]=0;StaticObjectMatrix[x+4][y+7]=0;
pixelsBool[x+3][y+7]=0;StaticObjectMatrix[x+3][y+7]=0;
pixelsBool[x+2][y+7]=0;StaticObjectMatrix[x+2][y+7]=0;
setTimeout(function(){b.style.opacity=0.8},100,b);
setTimeout(function(){b.style.opacity=0.6},200,b);
setTimeout(function(){b.style.opacity=0.4},300,b);
setTimeout(function(){b.style.opacity=0.2},400,b);
setTimeout(function(){document.body.removeChild(b);},500,b);
}
function create_gold_box_1(x,y)
{var h=45,w=80;
var block=create_object(w,h,x,y,"url('Objects/static/gold_box_1/back.png')");
pixelsBool[x+15][y+15]=2;StaticObjectMatrix[x+15][y+15]=block;
pixelsBool[x+14][y+15]=2;StaticObjectMatrix[x+14][y+15]=block;
pixelsBool[x+13][y+15]=2;StaticObjectMatrix[x+13][y+15]=block;
pixelsBool[x+12][y+15]=2;StaticObjectMatrix[x+12][y+15]=block;
pixelsBool[x+15][y+16]=2;StaticObjectMatrix[x+15][y+16]=block;
pixelsBool[x+14][y+16]=2;StaticObjectMatrix[x+14][y+16]=block;
pixelsBool[x+13][y+16]=2;StaticObjectMatrix[x+13][y+16]=block;
pixelsBool[x+12][y+16]=2;StaticObjectMatrix[x+12][y+16]=block;
block.RunBool=0;
block.Reaction=reac_wood_door_1;
return block;
}
function create_hostile_1(x,y)
{var h=18,w=30,rnd;
rnd=parseInt(Math.random()*5)+1;
var block=create_object(w,h,x,y,"url('Objects/static/hostile_1/back"+rnd+".png')");
for(var i=x+10;i<x+w-6;i++)
{ pixelsBool[i][y+10]=2;StaticObjectMatrix[i][y+10]=block;
pixelsBool[i][y+11]=2;StaticObjectMatrix[i][y+11]=block;
}
block.RunBool=0;
block.Reaction=hostile_reac_1;
return block;
}
function hostile_reac_1(hero,x,y)
{hero.damage(StaticObjectMatrix[x][y],hero,5000);}
function create_picture_1(x,y)
{var w=60;h=60;
var block=create_object(w,h,x,y,"url('Objects/static/picture_1/1.png')");
return block;
}
function create_wood_window_1(x,y)
{var h=131,w=80;
if(x<=0){x=0}if(y<=0){y=1}
if(x>=width){x=width-w}if(y>=height){y=height-h}
var block=document.createElement("div");
var blin=document.createElement("div");
block.style.position="absolute";
block.style.background="url('Objects/static/wood_window_1/back.png')";
block.style.width=w+"px";
block.style.borderRadius="0px";
block.style.height=h+"px";
block.style.marginTop=y+"px";
block.style.marginLeft=x+"px";
document.body.appendChild(block);
blin.style.position="absolute";
var r = parseInt(Math.random()*4)+1;
if(y>600){ blin.style.background="url('Objects/static/wood_window_1/sky_"+r+".png')"; }
else{blin.style.background="url('Objects/static/wood_window_1/sky_0"+r+".png')"; }
blin.style.width=76+"px";
blin.style.borderRadius="0px";
blin.style.height=97+"px";
blin.style.marginTop=y+22+"px";
blin.style.marginLeft=x-2+"px";
document.body.appendChild(blin);
return block;
}
<html onmousemove ="" onclick="if(startis==0){start();startis=1;}" >
<head>
<meta charset="utf-8"/>
<script src="include.js"></script>
<script src="Game_Engine/Atack_functions.js"></script>
<script src="Game_Engine/Creates.js"></script>
<script src="Game_Engine/Generate_map.js"></script>
<script src="Game_Engine/Mainblock.js"></script>
<script src="Game_Engine/Mainblock_iterations.js"></script>
<script src="Game_Engine/Moving_functions.js"></script>
<script src="Game_Engine/Steps.js"></script>
<script src="Game_Engine/Touch_functions.js"></script>
<script src="Game_Engine/ObjectsReactions.js"></script>
<script src="levels/city/house_1/init.js"></script>
<script src="levels/city/street_1/init.js"></script>
<script src="levels/level_1/init.js"></script>
<script src="levels/level_2/init.js"></script>
<script src="levels/level_3/init.js"></script>
<script src="levels/level_4/init.js"></script>
<script src="levels/level_5/init.js"></script>
<script src="Objects/universal/hostile_dynamic_1/create.js"></script>
<script src="Objects/universal/hostile_dynamic_2/create.js"></script>
<script src="Objects/universal/blood_1/create.js"></script>
<script src="Objects/static/house_1/create.js"></script>
<script src="Objects/static/key_1/create.js"></script>
<script src="Objects/static/road_1/create.js"></script>
<script src="Objects/static/cloud_1/create.js"></script>
<script src="Objects/static/gold_box_1/create.js"></script>
<script src="Objects/static/picture_1/create.js"></script>
<script src="Objects/static/picture_2/create.js"></script>
<script src="Objects/static/picture_3/create.js"></script>
<script src="Objects/static/picture_4/create.js"></script>
<script src="Objects/static/picture_5/create.js"></script>
<script src="Objects/static/picture_6/create.js"></script>
<script src="Objects/static/hostile_1/create.js"></script>
<script src="Objects/static/stair_1/create.js"></script>
<script src="Objects/static/count_1/create.js"></script>
<script src="Objects/static/wood_window_1/create.js"></script>
<script src="Objects/static/wood_door_1/create.js"></script>
<script src="Objects/static/wood_box_1/create.js"></script>
<script src="Objects/static/wood_bookcase_1/create.js"></script>
<script src="Objects/static/wood_a1/create.js"></script>
<script src="Objects/static/wood_floor_1/create.js"></script>
<script src="Objects/static/wood_floor_2/create.js"></script>
<script src="Objects/static/wood_floor_left_1/create.js"></script>
<script src="Objects/static/wood_floor_right_1/create.js"></script>
<script src="Objects/dynamic/ferum/create.js"></script>
<script src="Objects/dynamic/ferum/steps.js"></script>
<script src="Objects/dynamic/ferum/Move_funcs.js"></script>
<script src="Objects/dynamic/ferum/main_iter.js"></script>
<script src="Objects/dynamic/ferum/atack.js"></script>
<script src="Objects/dynamic/dark_1/create.js"></script>
<script src="Objects/dynamic/dark_1/steps.js"></script>
<script src="Objects/dynamic/dark_1/Move_funcs.js"></script>
<script src="Objects/dynamic/dark_1/main_iter.js"></script>
<script src="Objects/dynamic/dark_1/atack.js"></script>
<script src="Objects/dynamic/dark_1/intel.js"></script>
<script type="text/javascript">
var startis=0;
var hero1;
var heroStartX=100;
var heroStartY=600;
var hero2;
var hpin="";
var alert_1_bool=false;
//------keys vars
var KeysDiv;
var is_key=new Array();is_key[0]=0;
is_key[1]=0;// Green
is_key[2]=0;// Yellow
is_key[3]=0;// Orange
is_key[4]=0;// Red
is_key[5]=0;// Dark blue
is_key[6]=0;// Blue
is_key[7]=0;// Purple
//---------------
// mains Matrixs and Arrays and options::::
var width;
var height;
var Iterations=0;
var game_over=function(){};
var level_init=level_1_init;
var lvl_name="";
var mainBool=true;
var NSTEP_OPTION=2;
var StateObjs=new Array();
var PersForMain=new Array();
var ObjForMain=new Array();
var pixelsBool=new Array();
var pixelsBlocks=new Array();
var StaticObjectMatrix=new Array();
//--------------------------------
function game_state_init()
{
hero1="";
var hp=document.createElement("div");
var al=document.createElement("div");
hpin=document.createElement("div");
hp.style.position="absolute";
hpin.style.position="absolute";
hp.style.width="120px";
hp.style.background="url('hp.png')";
hpin.style.background="url('hp_in.png')";
hp.style.height="32px";
hpin.style.width="96px";
hpin.style.height="21px";
hpin.style.marginLeft="12px";
hpin.style.marginTop="5px";
al.id="alert";
document.body.appendChild(al);
document.body.appendChild(hp);
document.body.appendChild(hpin);
var keys_div=document.createElement("div");
keys_div.style.position="absolute";
keys_div.style.marginLeft="200px";
keys_div.style.marginTop="5px"; keys_div.style.width="500px";
keys_div.style.height="50px";
document.body.appendChild(keys_div);
KeysDiv=keys_div;
show_keys();
}
//--------------------------------
function show_keys()
{var i,k;
for(k=1;k<8;k++){
for(i=0;i<is_key[k];i++)
{var o=document.createElement("img");
o.src="Objects/static/key_1/back_"+k+".png";
o.k=k;
o.setAttribute("class","key_"+k);
KeysDiv.appendChild(o);}}
}
function add_key(n)
{ var k=document.createElement("img");
k.src="Objects/static/key_1/back_"+n+".png";
k.k=n;
k.setAttribute("class","key_"+n);
KeysDiv.appendChild(k);
}
function clear_keys()
{KeysDiv.innerHTML="";}
function del_key(n)
{
is_key[n]--;
clear_keys();
show_keys();
}
function start()
{
clear_lvl();
mainblock();
}
function keyDownListener(e) {
if(!e) {
e = window.event;
}
if(e.keyCode == 37) {
hero1.setAttribute("left",1);
}
if(e.keyCode == 38) {
hero1.setAttribute("up",1);
}
if(e.keyCode == 39) {
hero1.setAttribute("right",1);
}
if(e.keyCode == 40) {
hero1.setAttribute("down",1);
}
if(e.keyCode == 80) {
hero1.setAttribute("space",1);
scan_obj_ferum(hero1,hero1.x,hero1.y);
}
if(e.keyCode == 219) {
hero1.setAttribute("atack",1);
}
if(e.keyCode == 221) {
//menu2
}
if(e.keyCode == 65) {
hero1.setAttribute("left",1);
}
if(e.keyCode == 87) {
hero1.setAttribute("up",1);
}
if(e.keyCode == 68) {
hero1.setAttribute("right",1);
}
if(e.keyCode == 83) {
hero1.setAttribute("down",1);
}
if(e.keyCode == 88) {
hero1.setAttribute("space",1);//'x'
scan_obj_ferum(hero1,hero1.x,hero1.y);
}
if(e.keyCode == 67) {
hero1.setAttribute("atack",1);
}
if(e.keyCode == 86) {
hero1.setAttribute("def",1);
}
if(e.keyCode == 68) {
//menu1
}
if(e.keyCode==13){//enter
}
if(e.keyCode==27){//esc
alert_1_hide();
}
}
function keyUpListener(e) {
if(!e) {
e = window.event;
}
if(e.keyCode == 37) {
hero1.setAttribute("left",0);
}
if(e.keyCode == 38) {
hero1.setAttribute("up",0);
}
if(e.keyCode == 39) {
hero1.setAttribute("right",0);
}
if(e.keyCode == 40) {
hero1.setAttribute("down",0);
}
if(e.keyCode == 80) {
hero1.setAttribute("space",0);
}
if(e.keyCode == 219) {
hero1.setAttribute("atack",0);hero1.aai=0;//'['
}
if(e.keyCode == 221) {
//menu2
}
if(e.keyCode == 65) {
hero1.setAttribute("left",0);
}
if(e.keyCode == 87) {
hero1.setAttribute("up",0);
}
if(e.keyCode == 68) {
hero1.setAttribute("right",0);
}
if(e.keyCode == 83) {
hero1.setAttribute("down",0);
}
if(e.keyCode == 86) {
hero1.setAttribute("space",0);
}
if(e.keyCode == 67) {
hero1.setAttribute("atack",0);hero1.aai=0;// 'c'
}
if(e.keyCode == 86) {
hero1.setAttribute("def",0);
}
if(e.keyCode == 68) {
//menu1
}
if(e.keyCode==13){//enter
}
if(e.keyCode==27){//esc
}
}
</script>
<style rel="stylesheet">
html,body{overflow:hidden;
padding-top:0px;
padding-left:0px;
margin-top:0px;background:black;
margin-left:0px;
}
#alert
{font-size:30px;
color:white;
width:100%;
height:100%;
background:url('back_alert.png');
position:absolute;
visibility:hidden;
}
</style>
</head>
<body>
<div id="alert"></div>
</body>
</html>
Приложение 2. Результаты работы программы
На следующих изображениях поочередно представлены следующие действия и локации:
1. Первый уровень, старт игры
2. Персонаж запрыгнул на коробку
3. Персонаж убит кольями
4. Персонаж поднимается по лестнице
5. Персонаж переходит на другой уровень, с помошью двери
6. Второй уровень
7. Персонаж убит кольями
8. Четвертый уровень, демонстрация атаки
9. Противник повержен
133
Документ
Категория
Рефераты
Просмотров
155
Размер файла
1 511 Кб
Теги
poyasnitelnaya, zapiska
1/--страниц
Пожаловаться на содержимое документа