Гэри Розенцвейг - Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
- Название:Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Гэри Розенцвейг - Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript краткое содержание
Данная книга посвящена программированию игр с помощью ActionScript. Здесь вы найдете подробные указания, необходимые для создания самых разных игр – аркад, головоломок, загадок и даже игровых автоматов. В тексте приведены исходные коды программ и детальные, доступно изложенные инструкции. Базовые принципы программирования ActionScript рассматриваются на примере игр, однако вы без труда сможете применить полученные знания и для разработки неигровых проектов, таких как Web-дизайн и реклама. Рекомендации Гэри Розенцвейга помогут вам не только придумывать занимательные игры и размещать их на Web-сайте, но и оптимизировать скорость их работы, а также защищать свои творения от несанкционированного копирования. Представленный в книге код несложно изменить для использования в других программах.
Книга предназначена для широкого круга читателей – создателей анимационных роликов, художников-оформителей, программистов и разработчиков Web-сайтов. Издание может также выступать в качестве практического пособия по изучению ActionScript.
Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
function moveFox() {
(1) →// Определяем границы возможного перемещения лисы.
foxBounds = determineBounds(foxPos);
(2) →// Если под лисой пусто, она начинает падать.
if ((foxBounds.bottom > 0) and (!falling)) falling = true;
(3) →// Падение.
if (falling) checkFall();
(4) →// Если нажата левая стрелка, то движемся влево, если там нет препятствия.
if (Key.isDown(Key.LEFT)) {
if (foxSpeed < foxBounds.left) {
foxPos.x -= foxSpeed;
}
if (foxPos.x < 0) foxPos.x = 0;
fox._xscale = 25;
moving = true;
// Если нажата правая стрелка, то движемся вправо, если там нет препятствия.
} else if (Key.isDown(Key.RIGHT)) {
if (foxSpeed < foxBounds.right) {
foxPos.x += foxSpeed;
}
if (foxPos.x > worldEnd) foxPos.x = worldEnd;
fox._xscale = -25;
moving = true;
// Если не движемся.
} else {
moving = false;
}
(5) → // Если стоим на поверхности и нажат пробел – прыгаем.
if (Key.isDown(Key.SPACE) and (!falling)) {
fallSpeed = jumpPower; // Прыжок = падение вверх
falling = true;
if (!moving) { // Используем анимацию прыжка только если лиса не идет.
fox.gotoAndPlay("jump");
}
}
(6) → // Если идет и не падает, то анимируем ходьбу.
if (moving and !falling) {
fox.nextFrame();
// Если не идет или падает – кадр со стоящей лисой.
} else if (!moving and !falling) {
fox.gotoAndStop(1);
}
(7) → // Позиция лисы по вертикали.
fox._y = floor – foxPos.y;
// Активируем кролика.
moveBunnies();
// Перерисовываем все объекты в соответствии с новой позицией.
drawObjects();
// Проверяем, не съеден ли орех.
getAcorns();
}Функция determineBoundsвыглядит сложно, но на самом деле она двольно простая. Вначале мы предполагам, что пространство слева, справа и сверху вокруг лисы пустое на расстоянии 1000 пикселов. Также полагаем, что нет пустого пространства под лисой. Вертикальную позицию лисы мы храним в свойстве pos.y.
Далее следует цикл по всем объектам типа box.Вычисляется расстояние от лисы до блока и записывается в переменные dxи dy.
Если блок занимает то же положение по вертикали, что и лиса (другими словами – если он на том же расстоянии от земли), то функция проверяет, находится ли он справа или слева. Далее проверяется, если расстояние до блока справа (слева) меньше текущего значения bounds.right (.left), то значение bounds. right (. left)переопределяется. Аналогично проверяются вертикальные границы.
После того как все блоки были проверены, объект boundsсодержит горизонтальные и вертикальные границы для лисы в текущем положении. Например, если bounds.leftравно 20, то ближайший к лисе блок справа находится на расстоянии 20 пикселов.
Функция determineBoundsнаписана в достаточно общем виде, чтобы ее можно было использовать как для лисы, так и для кроликов. В качестве аргумента posфункции можно передать как объект foxPos,так и элемент массива objects,например кролика.function determineBounds(pos) {
// Определяем границы перемещения.
var bounds = {left:1000,right:1000,top:1000,bottom:pos.y};
// Цикл по всем объектам.
for(var i=0;i
// Рассматриваем только блоки.
if (objects[i].type == "box") {
var dx = objects[i].x – pos.x;
var dy = objects[i].y – pos.y;
// Если блок в той же вертикальной позиции.
if ((dy >= 0) and (dy <= 50)) {
// Определяем, является ли ближайшим левый блок.
if ((dx+50 <= 0) and (Math.abs(dx+50) < bounds.left)) {
bounds.left = Math.abs(dx+50);
// Определяем, является ли ближайшим правый блок.
} else if ((dx >= 0) and (dx < bounds.right)) {
bounds.right = dx-50;
}
}
// Блок в той же горизонтальной позиции.
if ((dx >= -50) and (dx <= 50)) {
// Определяем, является ли ближайшим нижний блок.
if ((dy+50 <= 0) and (Math.abs(dy+50) <=
bounds.bottom)) {
bounds.bottom = Math.abs(dy+50);
// Определяем, является ли ближайшим верхний блок.
} else if ((dy-50 >= 0) and (dy-50 < bounds.top)) {
bounds.top = dy-50;
}
}
}
}
return(bounds);
}Если лиса находится в воздухе, то независимо от того, прыгает ли она вверх или падает вниз, это состояние рассматривается как падение. Функция CheckFallследит за вертикальным перемещением лисы. Когда игрок прыгает, переменная fallSpeedпринимает значение jumpPower,которое равно 60. Таким образом, лиса пытается переместиться на 60 пикселов по вертикали. В каждом кадре, в котором происходит процесс «прыжок/падение», переменная fallSpeedуменьшается на 10, что создает эффект силы тяжести. В конечном счете значение fallSpeedобнулится в верхней точке прыжка и начнет уменьшаться, а лиса устремится вниз.
Если значения скорости падения еще недостаточно, чтобы лиса достигла земли, то падение продолжается. Но как только уровень земли достигнут или пройден, падение прекращается, и вертикальная позиция лисы устанавливается равной положению земли.
Функция checkFallтакже обращается к свойству foxBound.top,чтобы проверить, нет ли блока над лисой. Если лиса упирается в верхнюю границу возможного движения, то импульс, направленный вверх, пропадает, переменная fallSpeedобнуляется. Процесс «прыжок/падение» продолжается, но является теперь только падением.function checkFall() {
// Учитываем силу тяжести.
fallSpeed -= 10;
// Проверяем, есть ли место для падения.
if (fallSpeed > -foxBounds.bottom) {
foxPos.y += fallSpeed;
// Прекращаем падение и устанавливаем лису на уровень земли.
} else {
foxPos.y -= foxBounds.bottom;
fallSpeed = 0;
falling = false;
fox.gotoAndStop(1); // stand
}
// Смотрим, не упирается ли лиса в верхний блок.
if (foxPos.y > foxBounds.top) {
foxPos.y = foxBounds.top;
fallSpeed = 0;
}
}Функция drawObjectsсоздает эффект движения лисы. Она перерисовывает все объекты в соответствии с положением лисы.
function drawObjects() {
// Цикл по всем объектам.
for(var i=0;i
// Устанавливаем горизонтальную позицию в соответствие с положением лисы.
_root["object "+i]._x = x = 275 + objects[i].x – foxPos.x;
// Устанавливаем горизонтальную позицию в соответствие со значением floor.
_root["object "+i]._y = floor – objects[i].y;
}
}Функция getAcornsпросматривает объекты в поисках орехов. Каждый орех проверяется, достаточно ли близко он находится к лисе, чтобы она могла его взять. Если орех съеден, его свойство typeустанавливается в значении used.Этот орех теперь игнорируется всеми функциями, так как они не проверяют объекты типа used.
function getAcorns() {
// Просматриваем все объекты.
for(var i=objects.length-1;i>=0;i—) {
if (objects[i].type == "acorn") {
// Если ближе 30 пикселов – хватаем орех.
if (distance(_root["object "+i],fox) < 30) {
_root["object "+i].play();
objects[i].type = "used";
score += 100;
}
}
}
}Функция getAcornsвызывает функцию distanseдля определения расстояния между лисой и орехом. Эта же функция будет в дальнейшем использоваться функцией moveBunnies.
// Функция для определения расстояния между клипами.
Читать дальшеИнтервал:
Закладка: