null
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (1/34)
Сегодня мы предлагаем тебе написать увлекательную игру — Space Invaders. Как всегда, начнем с правил. Цель игры: игроку нужно уничтожить все корабли инопланетян. Игрок управляет лазерной пушкой, передвигая её горизонтально, в нижней части экрана. У игрока есть бесконечное количество "патронов". П
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (2/34)
Все игровые действия происходят в космосе. Для его отрисовки объявим метод drawField(). Создавать все элементы игры будем в методе createGame(), а отрисовывать их — в методе drawScene(). Все объекты создаются при запуске игры, поэтому в методе initialize() вызовем setScreenSize(int, int), а после н
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (3/34)
Давай реализуем метод drawField() — закрасим игровое поле одним цветом. Для этого нужно каждой ячейке установить цвет и пустую строку. В этом нам поможет метод setCellValueEx(int, int, Color, String) класса Game, где первые 2 параметра - координаты x и y ячейки, третий - цвет фона, а последний
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (4/34)
Для отображения звезды можно использовать любой символ из стандарта Юникод. Его будем хранить в поле STAR_SIGN класса Star. Чтобы отображать звезду на игровом поле, создадим метод draw(Game). В нем будем вызывать метод setCellValueEx у объекта типа Game, который получаем в качестве параметра.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (5/34)
Кроме звезд в игре буду задействованы другие игровые объекты, а именно — космические корабли. Внешний вид игрового объекта на плоскости задается в виде матрицы matrix, поэтому добавим поле matrix в классе GameObject. Кроме формы объекта, матрица содержит порядковый номер цвета из списка цветов
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (6/34)
Сейчас мы создадим класс Ship, который будет хранить в себе общие свойства космических кораблей. В нем будет метод setStaticView, который на данный момент устанавливает матрицу, а позже будет еще и задавать анимацию. Первым сделаем корабль представителя вражеского флота EnemyShip. Его матрицу мы пр
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (7/34)
В этой части мы подготовим основу для вражеского флота. Для этого создадим класс EnemyFleet. Он будет хранить список кораблей, количество рядов кораблей(ROWS_COUNT), количество кораблей в ряду(COLUMNS_COUNT) и расстояние между левыми верхними углами соседних кораблей(STEP). Создавать корабли и запо
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (8/34)
Продолжим работу над созданием вражеского флота. Для этого в методе createShips заполним список ships. Учтем, что оптимальным расстоянием от верхней границы экрана до первого сверху ряда кораблей будет 12 ячеек. Для добавления вражеского флота в игру создадим поле enemyFleet в классе SpaceInvadersG
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (9/34)
В игре будет все двигаться, а значит, нам нужно определять направление движения объектов. Хранить направления удобно в enum'е. Движение вражеского корабля опишем в методе move. В зависимости от направления и скорости, он меняет соответствующую координату. У движения вниз скорость постоянная — 2. По
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (10/34)
Согласно концепции игры, чем меньше кораблей, тем выше скорость их движения по горизонтали. Реализуем эту зависимость в методе getSpeed. Обрати внимание, что максимальная скорость вражеских кораблей не должна превышать значение 2. Также добавим в класс EnemyFleet направление движения и метод move.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (11/34)
Когда корабли подлетают к краю экрана, они меняют направление на противоположное и опускаются ниже. Для этого нам нужно реализовать метод move класса EnemyFleet.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (12/34)
Создадим класс Bullet, отвечающий за пули. Конструктор этого класса будет принимать координаты x, y и направление полета. Также в конструкторе будет вызываться метод setMatrix с параметром матрицы пули(ShapeMatrix.BULLET), которую ты найдешь в классе ShapeMatrix. Так как пули летают только вверх ил
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (13/34)
Введем переменную COMPLEXITY, которая отвечает за сложность игры, а именно — за вероятность выстрела вражеского корабля за один шаг игры. Все корабли должны стрелять, поэтому в класс Ship добавим метод fire. Так как экземпляр этого класса мы не будем создавать, сделаем этот метод "заглушкой", а реа
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (14/34)
Создадим и реализуем метод fire у EnemyFleet. Этот метод будет вызывать метод fire у одного из кораблей флота, выбранного случайно. Кроме того, флот будет стрелять с вероятностью COMPLEXITY процентов.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (15/34)
Все вражеские пули будем хранить в переменной enemyBullets класса SpaceInvadersGame. Добавим их отрисовку и движение в соответствующие методы. Чтобы удалить потраченные пули, создадим и реализуем метод removeDeadBullets() в классе SpaceInvadersGame. Для удаления можно либо использовать итератор, ли
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (16/34)
Теперь создадим корабль игрока. Для этого нам нужен класс PlayerShip. В его конструкторе будем устанавливать значения координат таким образом, чтобы корабль отображался внизу экрана по центру. Кроме этого, конструктор задает внешний вид корабля, устанавливая матрицу PLAYER, которую мы тебе прислали
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (17/34)
Добавим в класс PlayerShip метод, который проверяет, попали ли вражеские пули в корабль игрока (метод isCollision класса GameObject). Если было попадание, он "убивает" корабль и пулю. Также добавим корабль игрока в класс игры, отрисуем его и внесем проверку попаданий в соответствующий метод.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (18/34)
На данном этапе мы подготовим анимацию для крушения кораблей. Для этого нам понадобится поле frames типа List<int[][]>, которое будет хранить список матриц для кадров анимации. Также нам понадобится поле frameIndex, которое хранит индекс текущего кадра анимации. Передавать кадры анимации мы будем в
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (19/34)
Реализуем "убийство" игрока, переопределив метод kill(). Помимо установки флага isAlive в состояние false, он будет добавлять анимацию уничтожения корабля.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (20/34)
Чтобы переключиться на следующий кадр анимации, в классе Ship создадим метод nextFrame. Он устанавливает в поле matrix следующий кадр анимации, если это возможно. Также расширим функционал метода draw, переопределив его таким образом, что бы он вызвал метод суперкласса для отрисовки и метод nextFra
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (21/34)
При проигрыше и выигрыше игра останавливается. Давай реализуем метод stopGame, который будет останавливать игру и выводить соответствующее сообщение на экран. Тексты сообщений о выигрыше или о проигрыше придумай сам. Если пуля попала в игрока, перед остановкой игры нужно успеть показать анимацию вз
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (22/34)
Добавим новое свойство кораблю игрока — направление движения. Задавать его будем через сеттер. Корабль может двигаться в двух направлениях — влево или вправо. Но поскольку он может совсем не двигаться, для этого состояния будем использовать направление "вверх". Так как при старте корабль не двигает
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (23/34)
В этой части реализуем движение корабля игрока. Учти, что корабль не должен выходить за пределы игрового поля. Чтобы корабль двигался вместе со всеми остальными объектами, необходимо вызывать метод move() в методе moveSpaceObjects() главного класса игры.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (24/34)
Когда ты отпускаешь клавиши влево или вправо, корабль игрока не прекращает движение, пока не дойдет до края игрового поля. Давай это исправим. Переопределим метод onKeyReleased(Key) класса Game. Этот метод вызывается при отпускании клавиш. Если корабль игрока движется, в результате работы метода on
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (25/34)
Сейчас подготовим возможность стрельбы для игрока. Для этого нам нужен метод fire, который будет создавать пули. Хранить их будем в списке playerBullets. Добавь отрисовку пуль в метод drawScene, а их движение — в метод moveSpaceObjects. Осталось только реализовать выстрел по нажатию клавиши. Этим м
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (26/34)
В этой части добавим возможность стрелять по нажатию клавиши пробел. Новосозданные пули игрока добавляются в список playerBullets, а те, которые вылетают за пределы игрового поля, удаляются из него. Для удаления можно либо использовать итератор, либо создать копию списка playerBullets и проходить п
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (27/34)
Переопределим метод уничтожения для вражеского корабля. Он устанавливает значение false полю isAlive и задает матрицы для анимации уничтожения. Также создадим в классе Ship метод isVisible(). Он будет возвращать false после того, как у "неживого" корабля отобразится вся анимация.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (28/34)
На данном этапе добавим метод verifyHit(List<Bullet> bullets) для проверки попаданий пуль игрока во вражеские корабли. После попадания нам нужно "убить" соответствующие пулю и вражеский корабль. Кроме этого, добавим метод deleteHiddenShips(), который будет удалять из списка "невидимые" корабли. Для
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (29/34)
Пришло время создать главаря врагов. Чтобы он выглядел эффектнее, добавим анимацию при движении. Если менять анимацию каждый такт, его движения будут казаться слишком быстрыми. Чтобы они выглядели нормально, нужно менять кадр один раз в 10 тактов. Именно поэтому нам нужно переопределить метод nextF
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (30/34)
Сейчас научим босса стрелять. В зависимости от кадра анимации, босс будет стрелять из разных пушек. Также переопределим метод kill(), в котором установим значение поля isAlive и зададим кадры анимации взрыва.
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (31/34)
Давай сделаем так, чтобы анимация босса была постоянной. Для этого нам нужно добавить в метод setAnimatedView параметр isLoopAnimation, отвечающий за бесконечность анимации. Этот параметр устанавливает соответствующее значение полю loopAnimation. Если значение поля loopAnimation равно true, метод n
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (32/34)
Игра проиграна не только если корабль игрока уничтожен, но и когда вражеский флот вплотную приблизился к кораблю игрока. Чтобы определить координаты нижней границы вражеского флота, добавим метод getBottomBorder(). После разгрома всех врагов игрок побеждает. Для удобства добавим метод getShipsCount
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (33/34)
На данном этапе мы добавим в игру счет очков. За обычный корабль начислять будем 15 очков, а за босса — 100. Для подсчета очков удобнее всего использовать метод verifyHit, немного доработав его. Чтобы вести общий счет, добавим переменную score в класс SpaceInvadersGame. Будем выводить ее на экран с
undefined
3
Задача
Games, 0 уровень, 6 лекция
Недоступна
Игра Space Invaders (34/34)
Квест "Games", игра "Space Invaders": наши поздравления: игра написана! Предлагаем запустить ее и посмотреть, что получилось. Если есть время и вдохновение, можешь улучшить игру, добавив некоторые "фичи" от себя. Например: добавить другие типы кораблей, изменить количество пушек у кораблей, добавить новые виды снарядов...