42701

Создание игры Spider 2

Курсовая

Информатика, кибернетика и программирование

Успех вашего проекта во многом будет зависеть от выбранной вами платформой под которую будет вестись разработка, жанра игры и аудитории на которую рассчитана эта игра. Проект, процесс разработки которого, я бы хотел описать в этой курсовой работе я начал разрабатывать, потому что мне это нравится и я хотел получить опыт разработки под платформу Android

Русский

2014-12-28

154 KB

9 чел.

Курсовая работа

по дисциплине

«Технологии программирования»

на тему

Создание игры Spider2



Введение

Рынок компьютерных игр сегодня активно развивается и позволяет получать большую прибыль. Тот скачок в развитии, который был произошел в этой области за последнее время, просто впечатляет! Стратегии создания и продвижения игр, отличная графика, качественный звук, возможность скачать игры  и даже устраивать турниры - все это делает их очень популярными у людей разных возрастов.

В связи с этим, разработка игр сейчас является очень перспективным направлением. Конечно, при разработке игры программист должен понимать, что большую часть рынка занимают ‘компании-гиганты’ такие как Nintendo EAD, Rockstar North, Valve, Blizzard Entertainment и никакой начинающий разработчик не сможет конкурировать с ними. Хотя многие популярные игры создавались разработчиками энтузиастами, а впоследствии их продукт замечали, могли перекупить и нанять разработчика продолжения разработки под их началом. Так что, для того что бы достичь успеха в этой области, вам необходимо  иметь навык разработки и хорошую идею для реализации

Успех вашего проекта во многом будет зависеть от выбранной вами платформой под которую будет вестись разработка, жанра игры и аудитории на которую рассчитана эта игра. Проект, процесс разработки которого, я бы хотел описать в этой курсовой работе я начал разрабатывать, потому что мне это нравится и я хотел получить опыт разработки под платформу Android,  а так же опыт работы с OpenGL ES и различными игровыми движками.

В мире программирования есть очень много материала для изучения, сотни различных языков программирования, разные операционные системы, фреймворки, IDE. Язык программирования Java, IDE Eclipse, платформу Android, я выбрал не случайно. Меня направлял человек, который, когда я был ещё школьником, набирал группу заинтересованных в программировании детей. В данный момент он является аспирантом в ТюмГУ. Время от времени он давал нам некоторые задания, после сдачи, которых следовали новые. В результате чего он предложил нам разработать основы геймплея некоторой игры. Процесс разработки этой игры я буду описывать в данной курсовой работе.


Об игре Spider2.

Вы управляете паучком, который может создавать паутину. Для этого вам необходимо пройти от стены до стены, оставив за собой ниточку. Как только паучок сближается со стенкой, образуется паутина, в которую он уже не может наступать, но может создавать другую паутину, взаимодействуя с уже созданной ранее паутиной. Таким образом, пространство доступное для передвижения постепенно сокращается. На данный момент я не ставил никакой цели перед игроком. Так что пользователь может наслаждаться процессом заполнения экрана паутиной.

Игра́ — вид осмысленной непродуктивной деятельности, где мотив лежит не в результате её, а в самом процессе.

В планах: разработать противников, которых паучок будет ловить в свою паутину, ресурс «ниточка», что бы нельзя было сразу же превратить в паутину половину экрана, пересекая его, например, по диагонали, интерфейс, мультиплеер, звуковое сопровождение, поддержку слабых устройств, повышение производительности, устранение багов и вылетов, улучшенная обработка нажатий, разнообразные карты для повторного прохождения и  размещение игры в Google Play. Так же в планах перевести игры на какой либо игровой движок.


Начало разработки

Для начала необходимо было в общих чертах представить, какой объем работы придется выполнить и какие средства для разработки, я могу использовать. Самой подходящей IDE я посчитал Eclipse. Отличие игры от консольных приложений, которые я должен был сдавать в течении года, очевидно. В любой игре есть графика. Трудно представить себе игру, которая будет состоять лишь из диалогов пользователя с консольным приложением. Значит, нужно будет реализовать графику. Для этих целей я выбрал OpenGL ES, хотя в процессе разработки пришлось заменить способ отрисовки на другой, более производительный. Главное в любой игре это её геймплейная часть. Поэтому следующим, что нужно было сделать, это было разработка логики игры.

То есть, если вы собрались разрабатывать игру, под новую для вас платформу, не имея понятия о том, как реализовать графику в этой игре, то  разработка этой игры будет выглядеть примерно так.

  •  Изучение платформы, под которую вы ведёте разработку.
  •  Изучение графических библиотек, которые помогут вам реализовать графику в этой игре.
  •  Создание логики программы.

В конце разработки вам будет необходимо ‘подружить’ операционную систему, графику, и геймплей. Связать три эти части воедино.

Далее я расскажу подробнее о каждом этапе разработки.


Схема работы приложения. Представление в виде блок схемы.

В моём приложении всего две основных процедуры, которые вызываются при создании приложения. Они исполняются параллельно друг другу. Одна отвечает за activity, которое пользователь видит, вторая за логику игры. Ключевым объектом связующим логику и графику я сделал массив map, в котором я храню положение всех объектов на экране. Заполняет этот массив, методы класса GameLogic. А отрисовывается он с помощью методов класса Graph. Для примера вот как выглядит массив map и как он рисуется в приложении.

1-персонаж.

2-стенка.

3-ниточка.

Массив map       Массив map на экране.

map[][]={

2,2,2,2,2,2,2,2,2,2,2,2,2,2,

2,2,3,0,0,0,0,0,0,0,0,0,0,2, 

2,2,3,3,3,3,3,3,0,0,0,0,0,2,

2,2,2,2,2,2,2,3,0,0,0,0,0,2,

2,2,2,2,2,2,2,3,0,0,0,0,0,2,

2,2,2,2,2,2,2,3,0,0,0,0,0,2,

2,2,2,2,2,2,2,3,3,1,0,0,0,2,

2,2,2,2,2,2,2,3,0,0,0,0,0,2,

2,2,2,2,2,2,2,2,2,2,2,2,2,2}; 

Представление кода в виде блок схемы в общем виде:

MainActivity.java


GameLogic.java

Graph.java


Изучение операционной системы Android.

В ходе разработки мне не пришлось подробно исследовать систему андроид, лишь некоторые классы для создания графики, многопоточности и взаимодействия с touchscreen’ом.

Для начала, нужно было понять, как работает простейшее приложение, которое я смогу запустить у себя на телефоне. При создании приложения нужно указать класс, методы которого будут исполняться при определенных воздействиях пользователя и программы. Первое, что сделает пользователь с вашим приложением - это запуск. Для этого мы переопределим метод onCreate,  который принимает от системы один аргумент.

 Следующий код позволяет нам увидеть белый экран на вашем аппарате при запуске приложения. В нём мы не переопределяли метод onCreate  и данная программа ничего не делает.

package com.example.sdasdas;

import android.app.Activity;

public class MainActivity extends Activity {

 }

Теперь попробуем переопределить метод onCreate и заставить его показать нам  наш activity_main.xml, который добавляется автоматически при создании проекта, но нам он не понадобится.

public class MainActivity extends Activity {

 

protected void onCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(R.layout.activity_main);

 }

}

Теперь мы передали управление программой нашей xml форме. На этом, казалось бы, можно закончить этап работы с ОС потому что осталось всего лишь передать управление нашего приложения классу отвечающему за инициацию графики и логики.

Для этого заменим строку

setContentView( new Graph(this));

Далее можно переходить к реализации класса Graph.

Разработка класса Graph. Рисование с помощью android.graph.

Я организовал работу приложения следующим образом

На данный момент в игре присутствуют три типа объектов:

  1.  Стена
  2.  Ниточка
  3.  Главный герой

В плане разработать  объекты Враг-1, Враг-2…Враг-n, Бонус-1,Бонус2..Бонус-n.

В классе Graph  я создал массив map массивов размерностью [320][180] в который я записывал номера объектов. 0-пустота,1-персонаж,2-стена,3-ниточка. Метод вычисляющий в каких ячейках массива map расположены те или иные объекты я разместил в классе GameLogic, а метод отвечающий за графику разместил в Graph.

Допустим у нас в массиве map уже есть некоторые данные и нам нужно их отрисовывать. Для этого создан метод  myRun() который рисует на нашем экране объекты в зависимости от их расположений в ячейках массива map. Говоря: “рисуя объекты”, я имею в виду рисование прямоугольников различных размеров и цветов. Для примера, функция, рисующая на экране “паучка”, выглядит так

canvas.drawRect(shirina*x/320,visota*y/180,shirina*(x+10)/320,visota*(y+10)/180,paint);

Где shirina- ширина экрана устройства исполняющего данную программу, а visota- высота экрана устройства исполняющего данную программу. Для каждого из объектов подойдет такой способ отрисовки, надо всего лишь изменить цвет и размер прямоугольника.

Запустив такую функцию в конструкторе нашего класса Graph, она отрисуется всего лишь один раз. Поэтому запустим её в цикле в отдельном потоке, параллельно  функции изменяющей элементы массива map.


Разработка логики игры. Вычисление площадей.

Из класса Graph в отдельном потоке запускается метод класса GameLogic под названием Start. В нём мы добавляем на нашу карту map персонажа, стенки и путь от персонажа до стенки. Далее в цикле мы передвигаем персонажа функцией moveCharacter. Она проверяет, была ли вызвана функция onTouchEvent из класса Graph. Если нет, тогда поток засыпает на 33мс и снова вызывается функция moveCharacter. В случае нажатия пользователем на экран происходит следующее. Вычисляется в каком направлении было произведено касание экрана. Персонаж передвигается в этом направлении, на расстояние равное его скорости, оставляя за собой ниточку.

Формально, паучок не может столкнуться со стенкой, потому что у нашего паучка есть некоторые размеры, а в массиве map он размерностью в один элемент. Поэтому при приближении к стенке на определённое расстояние от игрока вызывается функция fillMap2. Эта функция вычисляет площади образовавшихся двух фигур по хитрому алгоритму, реализованному в функции squareCount. После сравнения двух площадей закрашивается фигура, имеющая наименьшую площадь.

Первоначальный, не эффективный алгоритм, который я применил для вычисления площади, работал слишком долго. Была заметна пауза во время столкновения со стенкой, когда и запускался этот алгоритм. С альтернативным алгоритмом, в котором я учел некоторые особенности построения фигур, такой паузы не возникает  и работает он в сотни раз быстрее.

С помощью рисунков и блок схем я продемонстрирую работу двух алгоритмов.

В следующей ситуации, нам нужно подсчитать площадь двух фигур.

В функцию для подсчета площади передаются координаты X,Y точки, которая расположена внутри фигуры. Для первой площадь это координаты точки помеченной красным крестиком, для второй фигуры такая точка помечена, синим крестиком.  Алгоритм который проходится по всем пустым клеткам внутри фигуры очень компактный и простой. Он принимает точку, увеличивает площадь на 1 и вызывает себя для соседних клеток.

int map[N, N];

boolean visited[N, N];

 

int calc( int x, int y )

{

 if (visited[x][y] || a[x][y] != 0) return 0;

 visited[x][y] = true;

 int num = 1;

 num += calc(x, y - 1);

 num += calc(x, y + 1);

num += calc(x + 1 ,y);

num += calc(x - 1 ,y);

 return num;

}

 

Работа алгоритма на рисунке

 

Красная точка- начальная позиция внутри фигуры. Оранжевые точки это рекурсивно  считываемые точки после второго, третьего вызова. Ярко розовые - четвертый, пятый, шестой вызовы. Бледно розовые – седьмой, восьмой, девятый, десятый вызовы.

Что бы не попадать в клетки повторно, я создал массив visited, которых хранит информацию о посещённых клетках. При попадании в такую клетку функция завершается.

Такой алгоритм весьма неплохо работает, когда нужно пройтись по всем клеткам внутри фигуры. Но для подсчета площади намного более эффективно будет пройтись по периметру и вычислить площадь фигуры.


Список литературы

1) stackoverflow.com


 

А также другие работы, которые могут Вас заинтересовать

28455. Правовое обеспечение воздушных перевозок в международном и внутреннем сообщениях 107.5 KB
  И этому есть ряд причин: вопервых авиация самый быстрый и удобный вид транспорта при переездах на дальние расстояния; вовторых сервис на авиарейсах в настоящее время имеет привлекательный для туристов вид; втретьих авиационные компании напрямую и через международные сети бронирования и резервирования выплачивают туристским агентствам комиссионные за каждое забронированное в самолете место мотивируя их тем самым выбирать авиаперевозки. Основными документами регулирующими международные воздушные перевозки являются международные...
28456. Осмысление потребности в сущности бытия и сущности человека. Индивидуальные основные потребности и психофизиологические возможности человека 51.5 KB
  Осмысление потребности в сущности бытия и сущности человека. Индивидуальные основные потребности и психофизиологические возможности человека. Потребность отражение в сознании человека необходимости получения чегото жизненно важного побуждающего его к активной целенаправленности деятельности. Удовлетворение потребностей цель любой деятельности человека.
28457. Сутність та задачі психологічної підготовки 105.5 KB
  Зміст морально-психологічного забезпечення та його особливості при виконанні службово-бойових завдань у повсякденній діяльності військ. Особливості при виконанні службово-бойових завдань у повсякденній діяльності військ...
28458. Понятие и сущность сервисной деятельности. Отличительные особенности услуг от товаров 108.5 KB
  В соответствии с Российским ГОСТ 564694 Услуги населению. По функциональному назначению услуги оказываемые населению подразделяются на материальные по удовлетворению материальнобытовых потребностей потребителя бытовых услуг и социальнокультурные услуги удовлетворение духовных интеллектуальных потребностей и поддержание нормальной жизнедеятельности потребителя. лиц оказывающих услуги населению. Обслуживание это деятельность исполнителя при непосредственном контакте с потребителем услуги.
28460. Предмет, сущность и задачи рекламы в СКС и Т 96 KB
  Предмет сущность и задачи рекламы в СКС и Т. В качестве объекта рекламы может выступать товар продажи или услуги. Предметом изучения рекламы являются стоящие перед ней цели и задачи. Сущность рекламы можно определить: в узком смысле как неличное информационное эмоциональное побуждение целевой группы людей к определенным поступкам.
28461. Необходимость и особенности страхования в туризме 59 KB
  Необходимость и особенности страхования в туризме. Объектами страхования в туризме являются как отдельные граждане так и туристские фирмы. Эти виды страхования в туризме проводятся в том же порядке что и страхование в других отраслях экономики. Страхование туристов это особый вид страхования обеспечивающий страховую защиту имущественных интересов граждан во время их пребывания в турпоездках.
28462. Компьютерные системы бронирования 55.5 KB
  Micros Fidelio Opera работает на более сложной с позиции освоения платформе Oracle. Данные о положительных сторонах АСУ были получены от дистрибьюторов данных программ а так же проанализированы и сопоставлены с данными полученными в ходе анонимного опроса персонала гостиничного комплекса использующего АСУ Micros Fidelio. Отсутствие возможности у ПО Micros Fidelio автоматического формирования цены на проживание. ПО Micros Fidelio не умеет формировать автоматическую цену на проживание и рассчитывать ее на будущее.
28463. Требования, предъявляемые к знаниям и профессиональным навыкам персонала гостиниц (речь, стиль, внешний вид и т.д.) 39.5 KB
  Потребитель при обнаружении недостатков оказанной услуги вправе по своему выбору потребовать: безвозмездного устранения недостатков; соответствующего уменьшения цены за оказанную услугу. Исполнитель должен устранить недостатки оказанной услуги в течение часа с момента предъявления потребителем требования. Требования потребителя об уменьшении цены оказанной услуги а также о возмещении убытков причиненных расторжением договора подлежат удовлетворению в течение 10 дней со дня предъявления соответствующего требования. Потребитель вправе...