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


 

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

45518. Примеры бинарных связей 52 KB
  Отношение эквивалентности Определение 8. Отношение на множестве называется отношением эквивалентности если оно обладает следующими свойствами: для всех рефлексивность Если то симметричность Если и то транзитивность Обычно отношение эквивалентности обозначают знаком или и говорят что оно отношение задано на множестве а не на . Условия 13 в таких обозначениях выглядят более естественно: для всех рефлексивность Если то симметричность Если и то транзитивность Легко доказывается что если на множестве задано...
45520. Архитектуры БД 37.5 KB
  По этой причине при построении информационной системы приходится решать задачу согласованного управления распределенной базой данных иногда применяя методы репликации данных. При однородном построении распределенной базы данных на основе однотипных серверов баз данных эту задачу обычно удается решить на уровне СУБД большинство производителей развитых СУБД поддерживает средства управления распределенными базами данных. для управления отдельными частями распределенной базы данных используются разные серверы то приходится прибегать к...
45521. Проектирование базы данных с помощью нормализации 49.5 KB
  Таблица находится в первой нормальной форме 1Н. Таблица находится во второй нормальной форме 2Н. Таблица находится в третьей нормальной форме 3Н. Таблица находится в нормальной форме БойсаКодда Н.
45522. Операция «соединение» и ее свойства 34 KB
  Внутренняя а естественное соединение осуществляется по равенству значений в одноименных столбцах. rBC sBD = qBCD 11 112 11b 112b 123 42c 113 113b 421c операция соединения для таблиц с одинаковыми схемами равносильна операции пересечения: rB sB = qB 11...
45523. Разложение без потерь. Теорема. Примеры 29.5 KB
  Договоримся, что малыми латинскими буквами мы будем обозначать таблицы, большими латинскими буквами – атрибуты и множества атрибутов. Например, r(R) – это таблица r со множеством атрибутов R
45524. Полностью соединимые отношения. Примеры 24.5 KB
  Пример: rB sB qBC b1 b1c b1c b2 B b – неполное соединение BC b1c полное соединение. Для того чтобы было полное соединение необходимо чтобы в соединяемых столбцах были все значения R и S.
45525. Операторы описания данных в SQL 42 KB
  Check Условие – это значение должно быть истинным чтобы компьютер признал все изменения правильными; Unique список полей – все значения в комбинации полей должны быть уникальными; Primry key список полей – указывается на уровне таблицы если первичный ключ состоит из нескольких полей; References имя_поля1 from имя_таблицы1 поле1 – в нашей таблице имя_поля1 берется из таблицы1 поля1. Restrict указывает каким образом поддерживается On delete cscde...
45526. Технологии «клиент-сервер» 45.5 KB
  Имеют место следующие операторы: Prepre имя_оператора from строка Select Insert Delete Updte Execute имя_оператора – позволяет выполнить запомненный на сервере оператор; Drop имя_оператора – позволяет удалит оператор; Эти операторы передаются в интерактивном режиме а если хотим записать в рамках какойто программы то например на Паскале это будет выглядеть так: Exec sql “sql операторâ€. Описание курсора на SQL: Declre имя_курсора [scroll] cursor for подзапрос [for updte]. Операции с курсором: Open имя_курсора – позволяет...