- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript - Гэри Розенцвейг
Шрифт:
Интервал:
Закладка:
Глава 11 Игры с мячом и битой
• Стена и мяч
• Мяч и бита
• Бита и блоки
• Бита и блоки в трех измерениях
Следующий жанр, который будет рассмотрен, восходит к первой видеоигре «Pong». Эта простая игра положила начало революции игровых автоматов в 70-х годах.
В таких играх задействован обычный мяч, отскакивающий от стен, и бита, управляемая пользователем. Игрок пытается не позволить мячу пролететь мимо биты.
В первой игре, которую вы создадите, будет только простая бита и мяч. Во второй игре появится вторая бита, управляемая компьютером, то есть у игрока будет противник, обладающий искусственным интеллектом. В третьей игре, которая описывается в данной главе, игрок будет пытаться выбить блоки с помощью мяча, как в классической игре "Breakout". Последняя игра раздела перенесет действие "Breakout" в трехмерное пространство.Стена и мяч
Исходный файл: Wallball.fla
Первая игра называется "Стена и мяч". В ней имеются бита, управляемая пользователем, и три стены, от которых может отскакивать мяч. Четвертой стены нет (она открыта). Задача игрока состоит в том, чтобы не позволить мячу пролететь мимо биты (рис. 11.1).
Рисунок 11.1. Элементами игры «Стена и мяч» являются мяч, бита и три стены
Задача проекта
Цель данного проекта – создать игру, где двигающийся мяч будет отскакивать от стен и биты. Бита будет перемещаться по вертикали в соответствии с движением мыши. Если мяч пролетает мимо биты и достигает границы экрана, игра заканчивается. При столкновении мяча с битой скорость первого должна немного увеличиваться.
Подход
Самое сложное при создании этой игры – сделать так, чтобы мяч правильно отскакивал от стен. Многие программисты не учитывают ни диаметр мяча, ни его скорость. В результате может случиться, что мяч будет отскакивать не от стены, а от точки, расположенной за ней.
Рассмотрим ситуацию, когда мяч оказывается за стеной. При этом надо выяснить, насколько далеко залетел мяч за пределы игрового поля. Так как мяч перемещается на несколько пикселов в одном кадре, он может легко проскочить за стену на несколько пикселов.
После того как вы узнаете, насколько далеко за стеной оказался мяч, вы можете изменить направление его движения, а затем поместить мяч на соответствующее расстояние с нужной стороны стены. На рис. 11.2 показана диаграмма работы данного алгоритма.
Рисунок 11.2. Диаграмма показывает, как изменяется положение мяча после столкновения со стеной
Столкновения с битой рассматриваются точно так же, как и столкновения со стеной. Единственное различие – вы должны изначально убедиться, что вертикальное положение биты допускает удар мяча об нее.
Если мяч проходит через горизонтальное положение биты, но ее там нет, нужно присвоить некой переменной значение, указывающее, что мяч был пропущен. Таким образом, у пользователя не будет другого шанса отбить мяч, пока тот летит до границы экрана.
Подготовка ролика
Единственными графическими объектами, необходимыми для этой игры, являются мяч, бита и стены. Изображения стен не используются в коде, так как реальные границы игрового поля определяются с помощью значений определеннных констант.
Создание кода
Для этой игры необходимы лишь три функции (посмотрите исходный файл, Wallball.fla). Все эти три функции будут вызываться в клипе «actions»:onClipEevent(load) {
_root.initGame();
}
onClipEvent(enterFrame) {
_root.moveBall();
_root.movePaddle();
}Функции находятся в основной временной шкале. Первая функция, initGame, хранит положение мяча в переменных x и y. Указаны значения dx и dy, то есть скорость мяча по вертикали и горизонтали (5 пикселов в кадре каждая). Затем функция initGame устанавливает несколько постоянных, определяющих положение каждой стены. Этой функции передается значение радиуса мяча, которое также используется функцией moveBall. Переменной passedPaddle присваивается значение true после того, как игрок пропустит мяч. При этом надо спрятать курсор, чтобы он не отвлекал внимание игрока.
function initGame() {
// Устанавливаем начальное положение мяча.
x = ball._x;
y = ball._y;
// Указываем начальную скорость.
dx = 5;
dy = 5;
// Устанавливаем значения постоянных.
rightWall = 550;
leftWall = 0;
topWall = 0;
bottomWall = 440;
ballRadius = ball._width/2
passedPaddle = false;
// Прячем курсор.
Mouse.hide();
}Функция movePaddle – «рабочая лошадка» этой игры. Сначала она изменяет значение x и y на величину значений dx и dy соответственно, чтобы получить новое положение мяча (1) . Затем проверяет, пролетел ли мяч сквозь стену или нет (2) .
К радиусу мяча прибавляется значение его положения, чтобы получить точную позицию правого края мяча. Если мяч оказался за стеной, функция movePaddle подсчитывает, как далеко он перелетел, и присваивает это значение переменной overshoot. Затем мяч перемещается назад на расстояние, в два раза превышающее значение overshoot. Направление мяча меняется при умножении dx на -1, таким образом, знак dx меняется на противоположный. Если значение dx до столкновения мяча со стеной было равно 5, то после этого события становится равным -5.
Затем код проверяет, пролетел ли мяч сквозь нижнюю стену или нет (3) . Этот фрагмент похож на предыдущий, только вместо x и dx используются величины y и dy.
Фрагмент кода, где проверяется, пролетел ли мяч через верхнюю стену, несколько отличается от уже рассмотренных (4) . Для определения положения верхней границы мяча из положения его центра вычитается радиус. Затем величина overshoot рассчитывается как разница между положениями стены и верхней границы мяча.
Для того чтобы определить, ударился ли мяч о биту или нет, сначала код рассчитывает положение правой границы биты (5). Потом, если мяч находится достаточно близко к бите, рассчитываются верхняя и нижняя границы, а затем определяется, пересекаются ли мяч и бита (6) .
Если мяч сталкивается с битой, то он ведет себя так же, как и при столкновении со стеной. Однако при этом скорость мяча увеличивается на 5 % (7) . Если мяч перелетает через стену, совершается только одно действие – переменной passedPaddle присваивается значение true.
Если значение переменной passedPaddle равно true, и мяч находится там, где должна быть левая стена, игра заканчивается (8) . Курсор возвращается в исходное положение, и ролик переходит к кадру «game over».
В конце функции moveBall положение мяча устанавливается в соответствии со значениями x и y. ...Примечание
Оператор *= работает точно так же, как и += , только он умножает исходное значение переменной на указанное число. То есть если значение a равно 5, строка a *= 3 изменит это значение на 15. Если же записать a *= -1, значение переменной a станет равным -5. Воспользовавшись записью *= – 1 можно быстро изменить знак переменной.
function moveBall() {
(1) → // Изменяем значение переменных x и у.
x += dx;
y += dy;
(2) → // Проверяем, достиг ли мяч правой стены.
if (x+ballRadius > rightWall) {
overshoot = (x+ballRadius) – rightWall;
x -= overshoot*2;
dx *= -1;
}
(3) → // Проверяем, достиг ли мяч нижней стены.
if (y+ballRadius > bottomWall) {
overshoot = (y+ballRadius) – bottomWall;
y -= overshoot*2;
dy *= -1;
}
(4) → // Проверяем, достиг ли мяч верхней стены.
if (y-ballRadius < topWall) {
overshoot = topWall – (y-ballRadius);
y += overshoot*2;
dy *= -1;
}
(5) → // Находится ли мяч там, где должен удариться о биту?
paddleRight = paddle._x+(paddle._width/2);
if ((x-ballRaduis < paddleRight) and passedPaddle) {
(6) → // Находится ли там бита?
paddleTop = paddle._y-(paddle._height/2);
paddleBottom = paddle._y+(paddle._height/2);
if ((y > paddleTop) and (y < paddleBottom)) {
// Удар о биту.
overshoot = paddleRight – (x-ballRadius);
x += overshoot*2;
dx *= -1;
(7) → // Увеличиваем скорость.
dx *= 1.05;
dy *= 1.05;
} else {
// Мяч пропущен, больше ничего проверять не надо.
passedPaddle = true;
}
}
(8) → // Проверяем, находится ли мяч у левой стены.
if ((x-ballRadius < leftWall) and passedPaddle) {
Mouse.show();
GotoAndPLay("game over");
}
// Устанавливаем новое положение мяча.
ball._x = x;
ball._y = y;
}По сравнению с функцией moveBall функция movePaddle поразительно короткая. Все, что необходимо сделать, – присвоить вертикальному положению биты значение вертикальной координаты курсора.
function movePaddle() {
// положение биты меняется в соответствии с курсором
paddle._y = _ymouse;
}
К сведению
Убедитесь, что экземпляру клипа с мячом присвоено имя «ball», а экземпляру клипа с битой – «paddle». Если стены расположены не так, как в исходном ролике, проверьте, правильно ли указаны константы в функции initGame.