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


 

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

82333. Политика Тауке хана. «Жеты Жаргы» – свод норм обычного права казахского народа 34.49 KB
  Изменения политической структуры вызвали настоятельную необходимость переработки и правовой базы организации казахского общества. и включал в себя следующие основные разделы: земельное право; семейнобрачные отношения; военная организация; суд и судебный процесс; виды наказаний по уголовным преступлениям; введение куна выкуп; наследственное право. Первое место в нем занимает закон возмездия: за кровь мстить кровью за увечье увечьем; За воровство грабеж насилие прелюбодеяние казнить смертью; По сим постановлениям родственники...
82334. Изменение в социальной структуре и численности населения в начале 50-х-сер.60-х годов 29.09 KB
  Доля рабочих среди трудоспособного населения была невелика. По официальным данным на 1940 год доля рабочих в Казахстане было 634 тысячи колхозников – 912 тысяч. Проблема нехватки рабочих рук была решена за счет приезжих которые составляли 80 от общего числа рабочих. В 1960 году численность рабочих составляла 22 млн человек колхозников – 611 тысяч.
82335. Освободительная борьба казахского народа против джунгарских завоевателей (Ордабасы, Анракай, годы «великого бедствия») 33.09 KB
  Еще более усилилась агрессия джунгар после создания ими государства. Джунгарское ханство занимавшее территорию между Китаем и Казахстаном было образовано в 1640 году. В 1204 году ойраты как сами назвали себя джунгары вошли в состав государства Чингисхана.
82336. Казахстан и мировое сообщество в конце 50-х-сер.60-х годов 29.45 KB
  В СССР 12 марта 1951 года принят закон о защите мира пропаганда войны объявлялась тягчайшим преступлением против человечества. Осенью 1959 года состоялись переговоры глав правительств СССР и США. Расширился между СССР и КНР культурный и торговый обмен. Тысячи китайцев получали высшее образование в СССР в том числе в вузах Казахстана.
82337. Хан Абылай и его место в истории казахского народа 28.98 KB
  Его дед тоже Абылай был владетелем города Туркестана прославился воинскими доблестями и получил грозное прозвище Канишер кровопийца. В 13 лет Абылай лишился отца убитого во время междоусобиц рано поступил на службу. Абылай понимал что главный враг Казахстана – джунгары поэтому стремится держать пророссийскую ориентацию.
82338. Казахстан в середине 60-х нач. 80-х годов. Социально-политическое развитие 30.01 KB
  Состав депутатов Верховного Совета СССР где были представлены чабаны колхозники рабочие промышленных предприятий техническая интеллигенция люди науки и искусства партийные и хозяйственные руководители и служил якобы подтверждением этой новой общественнополитической ситуации в обществе. Группа деятелей высшего политического руководства СССР в глубокой тайне подготовила смещение Н. Суслов и председатель КГБ СССР В. Смена политического руководства СССР в октябре 1964 года вскоре стала сказываться и на состоянии культуры.
82339. Восстание Кенесары Касымова (причины, характер, движущие силы, итоги) 27.95 KB
  Движущие силы численность: все слои населения – крестьянешаруа бии батыры султаны 20 тысяч человек все слои населения – крестьянешаруа бии батыры султаны Ход восстания: осень 1837 – организация отрядов повстанцев; начало открытого сопротивления царскому правительству; весналето 1838 – вооруженные столкновения с царскими отрядами нападение на аулы ненавистных султанов; разгром Акмолинской крепости отрядом Кенесары; увеличение отрядов перемещение центра восстания из Среднего в Младший жуз; 1840 – вторжение Кенесары в Кокандское...
82340. Экономическое развитие Казахстана в 60-ые годы ХХ. Рост новых городов 32.27 KB
  Такой подход положительно сказался на тонусе общественной жизни Казахстана. Удельный вес Казахстана в общесоюзной добыче железной руды достиг 54 . На территории Казахстана были размещены космодром и атомный полигон.
82341. Понимание невербальной эмоциональной экспрессии младшими подростками 389.5 KB
  Работая в этих областях отечественные психологи-практики столкнулись с фундаментальной ошибкой сформировавшейся в результате полного игнорирования тех идей психологии невербального общения которые имели отношения к вечной проблеме взаимосвязи души и тела экспрессии и психологических особенностей человека.