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


 

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

23033. Моделювання дискретизованих початково-крайових 244 KB
  Постановка задачі та проблеми її розвязання.4 в розвязку 1.23 вектора векторфункції та матричної функції проблему розвязання задачі 4.6 в залежності від співвідношень між та може мати точний розвязок або визначене згідно 4.
23034. Моделювання неперервної початково-крайової задачі динаміки систем з розподіленими параметрами 355.5 KB
  Моделювання неперервної початковокрайової задачі динаміки систем з розподіленими параметрами 5. Постановка задачі та проблеми її розвязання. Розглянутий вище варіант постановки та розвязання проблеми моделювання початковокрайової задачі динаміки системи 1.5 Для того щоб методику розвязання дискретизованої задачі моделювання динаміки розглядуваної системи розвинуту в рамках лекції 3 успішно узагальнену далі лекція 4 на задачі моделювання дискретизованих початковокрайових умов неперервними функціями та поширити на задачу 5.
23035. Моделювання динамічних систем з розподіленими параметрами при наявності спостережень за ними 563 KB
  Відомі функції невідомі 6. Відомі функції невідомі 6. Відомі функції невідомі 6. Відомі функції невідомі 6.
23036. Задачі оптимізації структури лінійних динамічних систем з розподіленими параметрами 289.5 KB
  Задачі оптимізації структури лінійних динамічних систем з розподіленими параметрами 7. Розглянуті вище задачі моделювання початковокрайових умов див. Розглянемо варіант розвязання задачі моделювання коли розвязок її знаходиться шляхом обернення системи інтегральних рівнянь 7.14 помилки розвязання задачі моделювання 7.
23037. Дослідження та оптимізація структури дискретизованих динамічних систем 335.5 KB
  вказувалося що структура матриці С та векторів визначається вибором точок розміщення спостерігачів та керувачів системи проблеми оптимального розміщення яких будуть розвязані якщо будуть знайдені явні залежності матриці від елементів множин координат спостерігачів та координат керувачів. Будуть побудовані аналітичні залежності елементів матриці від довільного елемента множини та елемента множини а також формули диференціювання матриці по цих елементах. В процесі розвязання цієї проблеми будуть побудовані формули...
23038. Оптимізаційні методи в задачах моделювання дискретних початково-крайових умов 325 KB
  Постановка задачі та проблеми її розвязання. Поставлені вище задачі а також запропоновані там алгоритми їх розвязання досить широкі і можуть бути використані для оптимізації розміщення входіввиходів довільної лінійної системи в тому числі і для розвязання задачі оптимізації розміщення спостерігачівкерувачів при моделюванні дискретизованих початковокрайових умов дискретно розміщеними фіктивними зовнішньодинамічними збуреннями. Більш точною і більш природною постановкою задачі моделювання дискретизованих початковокрайових умов є...
23039. ОПЕРАЦІЙНІ ПІДСИЛЮВАЧІ (позитивний зворотній зв’язок) 436.5 KB
  Форма генерованої напруги може бути різноманітною: гармонічною прямокутною пилкоподібною або будьякою іншою. У підсилювачі із негативним зворотним звязком у відсутності вхідного сигналу будьяка флуктуація напруги на вході підсилена операційним підсилювачем на виході придушується ланкою негативного зворотного звязку тобто сама себе послаблює. В кінці кінців на виході встановиться напруга близька до напруги живлення додатної чи відємної в залежності від полярності початкової флуктуації. Припустимо що в момент включення на виході...
23040. Операційні підсилювачі (негативний зворотний зв`язок) 68.5 KB
  Вступ Операційний підсилювач це диференційний підсилювач постійного струму який в ідеалі має нескінченний коефіцієнт підсилення за напругою і нульову вихідну напругу за відсутністю сигналу на вході великий вхідний опір і малий вихідний а також необмежену смугу частот сигналів що підсилюються. Мета роботи ознайомитись із властивостями операційних підсилювачів опанувати способи підсилення електричних сигналів в ОП охопленому негативним зворотним зв`язком та способи виконання математичних операцій за допомогою ОП. Операційні...
23041. Пасивні RC-фільтри 129.5 KB
  Пасивний чотириполюсник не містить у собі джерела енергії; потужність що виділяється в елементі кола підключеного до виходу чотириполюсника менше потужності що споживається від джерела сигналу підключеного до входу чотириполюсника; на виході такого чотириполюсника ніколи не буває гармонік яких би не було у поданому на його вхід сигналі якщо цей чотириполюсника створений на базі лінійних елементів. Функцію перетворення будьякого чотириполюсника можна подати кількома варіантами в залежності від способу впливу...