МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ... Федеральное государственное бюджетное образовательное учреждение

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
‹‹КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ››
(ФГБОУ ВПО ‹‹КубГУ››)
Кафедра вычислительных технологий
ФИЗИЧЕСКАЯ МОДЕЛЬ УСКОРИТЕЛЯ ЧАСТИЦ В
ИГРОВОЙ ФОРМЕ НА МОБИЛЬНОЙ ПЛАТФОРМЕ iOS
П.Д. Генералов
Краснодар 2014
СОДЕРЖАНИЕ
Введение....................................................................................................... 3
1 Типы ускорителей .................................................................................... 3
1.1 Линейные ............................................................................................ 3
1.2 Циклические ....................................................................................... 4
1.3 БАК ...................................................................................................... 5
2 Столкновения частиц ............................................................................... 6
2.1 Столкновение на низкой энергии ..................................................... 6
2.2 Столкновение с появлением тяжелых частиц ................................. 6
3 Реализация модели ................................................................................... 8
3.1 Общая информация об Objective-C ................................................... 8
3.2 Общая информация о cocos2D......................................................... 11
3.3 Используемые средства cocos2D ..................................................... 12
3.4 Сцена «Главное меню» ..................................................................... 14
3.5 Сцена «Игра» ..................................................................................... 16
Заключение ................................................................................................ 19
Список использованных источников ...................................................... 20
Приложение А. Код программы .............................................................. 21
2
ВВЕДЕНИЕ
Целью выполнения работы было изучение средств программирования
для мобильных платформ (конкретно – iOS) и получение начального
опыта практической работы с ними. В ходе выполнения работы были
освоены язык программирования Objective-C, среда разработки Xcode, а
также игровой движок для платформы iOS cocos2D.
Написанная в ходе выполнения работы программа является портом на
iOS физической модели ускорителя частиц в игровой форме, написанной
мной в прошлом семестре. Напомню, что эта модель писалась с целью
приближённо, в игровой форме, показать процессы, происходящие в
ускорителях элементарных частиц при экспериментах на них.
Частицы ускоряются электрическим полем высокого напряжения и
направляются либо в неподвижную мишень, либо во встречный пучок
частиц (ускорители на встречных пучках называются коллайдерами). В
столкновении с частицами мишени\встречного пучка способны рождаться
новые элементарные частицы (как правило, очень нестабильные),
служащие объектом изучения.
3
1 Типы ускорителей.
1.1
Линейные. Они бывают разных конструкций, но общий принцип
у них один – ускоряемые частицы летят по прямой камере, вдоль которой
расположены ускоряющие электроды. Есть высоковольтные ускорители
прямого действия, где создаётся постоянное электрическое поле очень
высокого напряжения, непосредственно придающее энергию частицам.
Максимально возможное напряжение в таких ускорителях – 20-25
мегавольт (при очень высоких напряжениях возникает электрический
пробой, что ограничивает дальнейшее повышение), что позволяет
сообщить частицам энергию до 25 мегаэлектронвольт (МэВ).
1.2
Циклические. Они куда как разнообразнее по конструкции, но
их главное отличие от линейных – ускорительная камера имеет
тороидальную форму, и ускоряемые частицы движутся по кругу,
многократно проходя одни и те же ускоряющие участки. Круговое
движение частиц обеспечивается магнитным полем, не влияющим на их
энергию и скорость, но искривляющим траекторию. Итоговая энергия
частиц получается выше, но такие ускорители требуют создания очень
мощного магнитного поля (чем выше скорость и энергия частиц, тем
сложнее управлять их траекторией), поэтому современные ускорители
являются огромными и дорогостоящими установками.
Ускорители на встречных пучках (коллайдеры) имеют преимущество
по сравнению с ускорителями, направляющими разогнанные частицы в
неподвижную мишень, потому что в случае неподвижной мишени
значительная часть энергии ускоренных частиц тратится на перемещение
центра масс системы «ускоренная частица – частица мишени» (т.к. частица
4
мишени перемещается под «напором» врезавшейся в неё ускоренной
частицы).
1.3 БАК.
Большой адронный коллайдер имеет тороидальную камеру длиной 26,7
км и является самым мощным ускорителем на текущий момент. Стоит
пояснить, что разгоняемые частицы (обычные протоны либо ядра атомов
свинца) не сразу же попадают в главное кольцо БАК:
1)
Начальным источником частиц служат два слабых линейных
ускорителя Linac 2 и Linac 3.
2)
Частицы попадают в PS-бустер (PS – Proton Synchrotron,
протонный синхротрон) и потом в сам протонный синхротрон,
где разгоняются до энергии 28 ГэВ. При этом они уже
приобретают околосветовые скорости.
3)
После PS частицы попадают в SPS (Super-Proton Synchrotron), где
наращивают энергию до 500 ГэВ.
Только после этой цепочки ускорителей протоны или ядра свинца
попадают в главное кольцо БАК, где ускоряются до максимальной энергии
7 ТэВ (тераэлектронвольт), и в точках столкновения встречных пучков
детекторы фиксируют происходящие события. В модели начальной
энергией считается 1 ТэВ, то есть, протоны уже находятся в главном
кольце БАК. Протоны на энергии 7 ТэВ имеют скорость, всего на 3 метра
в секунду меньше скорости света.
Стоит заметить, что ни в одном настоящем ускорителе однократное
прохождение частицами ускоряющего электрического поля не способно
повысить их энергию сразу на 1 ТэВ, т.к. получить такое напряжение
просто невозможно. Ускорение до больших энергий обеспечивается
именно многократным прохождением частицы сквозь ускоряющие
электроды – миллиарды раз. В игре, конечно, невозможно придать
5
частицам околосветовую скорость и обеспечить настолько многократное
прохождение полос ускорения, поэтому каждое ускорение добавляет 1
ТэВ для удобства.
2 Столкновения частиц.
Гонка за повышением энергии объясняется тем, что чем выше энергия
сталкивающихся частиц, тем в более глубинные процессы внутри материи
можно проникнуть. Как это выглядит:
3.1 Столкновение на низкой энергии.
Столкновение двух протонов на низкой энергии почти наверняка будет
упругим – т.е. они просто разлетятся, как бильярдные шары, без всяких
изменений во внутренней структуре. Такое столкновение не даст никакой
информации
о
внутреннем
устройстве
столкнувшихся
протонов.
Вероятность неупругого столкновения (при котором структура частиц
изменяется, и рождаются новые частицы) повышается с ростом энергии и
становится ~93% при 100 ГэВ, с дальнейшим повышением энергии почти
не меняется. В игре произошедшее упругое столкновение отнимает очки, а
частица, столкновение с которой будет упругим, окрашена в синий цвет.
3.2 Столкновение с появлением тяжёлых частиц.
Для
возможности
появления
тяжёлых
частиц
энергия
взаимодействующих не может быть меньше энергии покоя тяжёлой
частицы (по известной формуле E=mc2, где m в данном случае – масса
покоя
образующейся
частицы).
Скажем,
переносчики
слабого
взаимодействия – промежуточные бозоны W+, W- и Z0 – имеют массу
покоя 80,385±0,015 ГэВ/c2 (оба W) или 91,1876±0,0021 ГэВ/c2 (Z). Немного
пояснений по такой странной единице измерения: энергия частиц обычно
6
измеряется в электронвольтах (1 эВ – энергия, необходимая для переноса
элементарного заряда (по модулю равен заряду протона или электрона) в
электростатическом поле между точками с разностью потенциалов 1 В). А
всё по той же формуле Эйнштейна массу частицы можно выразить через
её
энергию:
m=E/c2.
Таким
образом,
единица
измерения
–
электронвольт/скорость света в квадрате (не путать с секундой в квадрате).
Обычно делитель опускают, поэтому может встретиться запись просто
80,385 ГэВ (для примера с W-бозоном). Что это число значит? Значит то,
что суммарная энергия сталкивающихся частиц не может быть меньше 80
ГэВ, чтоб эти частицы могли породить W-бозон (положительно или
отрицательно заряженный) или 91 ГэВ для рождения нейтрального Zбозона.
7
3 Реализация модели.
Программа написана на языке Objective-C с использованием игрового
движка cocos2D. Среда разработки - Xcode.
Между платформами iOS, Android и Windows Phone выбор был сделан
в пользу первой по причине наличия как опыта работы с устройствами на
этой платформе, так и самих этих устройств.
3.1 Общая информация об Objective-C.
Objective-C
—
компилируемый
объектно-ориентированный
язык
программирования, используемый корпорацией Apple, построенный на
основе языка Си и парадигм Smalltalk. В частности, объектная модель
построена в стиле Smalltalk — то есть, объектам посылаются сообщения.
Язык Objective-C является надмножеством языка Си, поэтому Си-код
полностью понятен компилятору Objective-C.
Компилятор Objective-C входит в GCC и доступен на большинстве
основных платформ. Язык используется в первую очередь для Mac OS X
(Cocoa) и GNUstep — реализаций объектно-ориентированного интерфейса
OpenStep. Также язык используется для iOS (Cocoa Touch).
Objective-C возник в 80-x как модификация С в сторону Smalltalk.
Причем модификация эта состояла в добавлении новых синтаксических
конструкций и специальном препроцессоре для них (который, проходя по
коду преобразовывал их в обычные вызовы функций С), а также
библиотеке времени выполнения (эти вызовы обрабатывающей). Таким
образом, изначально Objective-C воспринимался как надстройка над C. В
каком-то смысле это так и до сих пор: можно написать программу на
8
чистом С, а после добавить к ней немного конструкций из Objective-C (при
необходимости), или же, наоборот, свободно пользоваться С в программах
на Objective-C. Кроме того, все это касается и программ на С++. В 1988
NeXT (а впоследствии Apple) лицензировала Objective-C и написала для
него компилятор и стандартную библиотеку (по сути SDK). В 1992 к
усовершенствованию языка и компилятора подключились разработчики
проекта GNU в рамках проекта OpenStep. С тех пор GCC поддерживает
Objective-C. После покупки NeXT Apple взяла их SDK (компилятор,
библиотеки, IDE) за основу для своих дальнейших разработок. IDE для
кода назвали Xcode, а для GUI – Interface Builder. Фреймворк Cocoa для
GUI разработок (и не только) на сегодня является наиболее значимой
средой разработки программ на Objective-C.
Файлы модулей на Objective-C имеют расширение “.m” (если
использовалась смесь С++ и Objective-С, то расширение “.mm”).
Заголовочные файлы – “.h”. Все создаваемые в Objective-С объекты
классов должны размещаться в динамической памяти. Поэтому особое
значение приобретает тип id, который является указателем на объект
любого класса (по сути void *). Нулевой указатель именуется константой
nil. Таким образом, указатель на любой класс можно привести к типу id.
Возникает проблема: как узнать к какому классу относится объект,
скрывающийся под id? Это делается благодаря инварианту isa, который
присутствует в любом объекте класса, унаследовавшего специальный
базовый класс NSObject (приставка NS обозначает NeXT Step). Инвариант
isa относится к зарезервированному типу Class. Объект такого типа
позволяет узнавать имена своего и базового класса, набор инвариантов
класса, а также прототипы всех методов, которые реализовал этот объект и
их
адреса
(посредством
зарезервированные
слова
локального
списка
Objective-C,
селекторов).
отличающиеся
Все
от
зарезервированных слов языка С, начинаются с символа @ (например
@protocol, @selector, @interface). Обычно имена инвариантов классов с
9
ограниченной областью видимости (@private, @protected) начинаются с
символа подчеркивания. Для строк в Cocoa имеется очень удобный класс
NSString. Строковая константа такого класса записывается как @”Hello
world”, а не как обычная для С строковая константа “Hello world”. Тип
BOOL (по сути unsigned char) может принимать константные значения
YES и NO. Все особые для Objective-C зарезервированные слова
приведены ниже.
 @interface Начинает объявление класса или категории (категория –
расширение класса дополнительными методами без наследования)
 @implementation Начинает определение класса или категории
 @protocol Начинает объявление протокола (аналог класса С++,
состоящего из чисто виртуальных функций)
 @end Завершает объявление\определение любого класса, категории
или протокола
 @private Ограничивает область видимости инвариантов класса
методами класса (аналогично С++)
 @protected Стоит по умолчанию. Ограничивает область видимости
инвариантов класса методами класса и методами производных
классов (аналогично С++)
 @public Удаляет ограничения на область видимости (аналогично С++)
 @try Определяет блок
с
возможной
генерацией
исключений
(аналогично С++)
 @throw Генерирует объект-исключение (аналогично С++)
 @catch
()
Обрабатывает
исключение,
сгенерированное
в
предшествующем блоке @try (аналогично С++)
 @finally Определяет блок после блока @try, в который предается
управление независимо от того, было или нет сгенерировано
исключение
10
 @class
Сокращенная
форма
объявления
класса
(только
имя
(аналогично С++))
 @selector(method_name) Возвращает скомпилированный селектор для
имени метода method_name
 @protocol(protocol_name) Возвращает экземпляр класса-протокола с
именем protocol_name
 @encode(type_spec) Инициализирует строку символов, которая будет
использована для шифрования данных типа type_spec
 @synchronized() Определяет блок кода, выполняющегося только
одной нитью в любой определенный момент времени
3.2 Общая информация о cocos2D.
Cocos2d — это бесплатный открытый фреймворк для разработки игр
для iPhone, iPad, iPod Touch, а с недавнего времени и для Mac OS X.
Фреймворк написан на Objective-C (существуют также версии фреймворка
на других языках) и в сравнении с использованием OpenGL в чистом виде
позволяет разрабатывать игры для iOS гораздо быстрее.
Работа всех версий cocos2D основана на использовании спрайтов.
Спрайты можно рассматривать как простые 2D изображения. В cocos2D
расположенные вместе спрайты создают сцену, к примеру, уровень игры
или главное меню. Спрайтами можно управлять на основе событий в
исходном коде или как часть анимации. Над спрайтами можно проводить
всевозможные действия: перемещать, поворачивать, масштабировать,
изменять изображение и так далее.
cocos2D
обеспечивает
базовые
примитивы
анимации,
которые
используют спрайты. Некоторые версии cocos2D позволяют эффекты
частиц и применение шейдерных фильтров (warp, ripple и тд.).
11
cocos2D предоставляет примитивы для создания простых элементов
графического интерфейса. Они включают в себя текстовые поля, надписи,
меню, кнопки и другие распространённые элементы.
Множество реализаций cocos2D идут вместе с распространенными
реализациями 2D физических движков, таких как Box2D и Chipmunk.
Различные версии cocos2D имеют звуковые библиотеки, обертки над
OpenAL или другими библиотеками.
Также поддерживается биндинг с Javascript, Lua и другими.
3.3 Используемые средства cocos2D.
В cocos2d самым базовым объектом является узел (node) - это объект
любого класса, наследуемого от встроенного в cocos2d класса CCNode.
Что такое узел? Узлом может быть что угодно - например,
обыкновенная надпись на экране, реализуемая классом CCLabelTTF,
является узлом. Или текстура (класс CCSprite) - она тоже является узлом.
Узел может и не отражаться на экране - например, есть узлы CCLayer
(слой) и CCScene (сцена), которые не имеют отображения.
Каждый узел может содержать в себе другие узлы (эти узлы принято
называть "дочерними узлами"). В cocos2d для каждой сцены на экране
обычно создается узел CCScene (сцена), который содержит в себе все
остальные узлы.
12
Рисунок 1 – Пример сцены
Рассмотрим пример на рисунке 1. Сцена содержит в себе три дочерних
узла - Background Layer (фоновое изображение космоса), Game objects
Layer (слой с игровыми объектами) и Virtual Joypad Layer (слой с
виртуальным джойстиком).
В свою очередь, слой с игровыми объектами содержит в себе объект с
нашим кораблем, с кораблями противника, изображениями выстрелов и
т.д.
То есть, по сути, каждый объект в игре - это узел. Корабль игрока - это
класс, который мы унаследуем от CCNode и в который добавим игровую
логику, корабли противника - это тоже узлы (классы, унаследованные от
CCNode), в которые мы опять же добавим некий искусственный
интеллект.
Иными словами, сцена (CCScene) и слой (CCLayer) не имеют
отображения, но зато они являются контейнерами для других объектов
(кораблей, космоса, джойстика и т.д.), которые как раз таки отображаются
на экране.
13
Класс CCDirector – это класс-режиссер, позволяющий управлять
сценами и переходами между ними. По сути, это - сердце движка cocos2d.
С точки зрения программирования этот класс реализует паттерн
"Одиночка" (Синглтон). Синглтон - это объект класса, который может
быть создан только в единственном экземпляре (и доступен этот объект
глобально из всего приложения).
Режиссер хранит в себе глобальные настройки cocos2d и управляет
сценами.
Вот его функции:
 Предоставление доступа к текущей сцене
 Запуск, замена, добавление и удаление сцен
 Доступ к глобальной конфигурации cocos2d
 Доступ к OpenGL
 Пауза, продолжение, замедление, ускорение и остановка игры
 Конвертация координат между UIKit-координатами (пиксельные
координаты экрана) и координатами OpenGL (координаты от 0 до
1)
 Определение обновления статуса игры
Прежде чем проводить какие-то действия с объектами на сцене, нужно
задать фон, создав узел CCNodeColor *background и задав ему некий цвет в
формате RGBA. По умолчанию такой узел черного цвета создается
автоматически для каждой новой сцены.
В нашей игре сцен 4: сцена «Главное Меню», сцена «Игра», сцена «Как
играть» и сцена «Авторы». Каждой сцене соответствует свой файл
«*Scene.m» в ресурсах игры.
3.4 Сцена «Главное Меню».
14
Рисунок 2 – Главное меню
При запуске игры игроку показывается сцена «Главное Меню». В ней
содержатся 3 кнопки перехода в другие сцены, «Игра», «Как играть» и
«Авторы», а также кнопка сброса настроек. Кнопки являются узлами
CCButton, и к каждой из них прикреплен свой обработчик нажатия,
которые в cocos2D называются селекторами.
В игре предусмотрен механизм сохранения/загрузки рекордного
результата из ячейки памяти, предоставленной игре для этой цели. Это
возможно благодаря встроенному в iOS фреймворку Foundation для
работы с данными. Рекорд отображается вверху экрана (кроме случая,
когда игра запускается впервые), а также после каждой игры. Вызов
рекорда
из
ресурсов
игры
происходит
по
команде
valueForKey:@"SavedHighScore". При желании можно стереть свой
рекорд, нажав на кнопку «Сброс».
Также благодаря фреймворку Foundation возможно варьировать
значения строк, то есть, переводить все строки в игре на язык
пользователя. В моей игре все строки переведены на русский и английский
15
языки, по умолчанию выбран английский. Программа узнает язык
пользователя
после
выполнения
команды
objectForKey:
NSLocaleLanguageCode.
Фон
главного
червоточины
–
меню
оно
является
статичным,
анимировано.
кроме
изображения
Анимированные
изображения
обрабатываются тем же узлом CCSprite, что и статичные, но для работы с
ними сначала необходимо конвертировать анимированное изображение в
его раскадровку и задать спрайту действие постоянной смены кадров.
Конвертация осуществляется специальными инструментами, например,
программой Zwoptex.
Также
в
момент
загрузки
игры
начинает
играть
музыка,
воспроизведение задается командой [OALSimpleAudio sharedInstance]
playBg.
3.5 Сцена «Игра».
16
Рисунок 3 - Интерфейс игры
На рисунке 3 показан интерфейс игры. Сверху отображаются счет
игрока, энергия протонов и номер эксперимента, в верхних углах экрана
располагаются кнопки паузы и включения/выключения звука. Остальное
место отведено под изображение трубы ускорителя и летящих в ней
протонов.
Протоны
красного
цвета
управляются
непосредственно
касаниями игрока.
В
сцене
«Игра»
задействован
физический
движок
Chipmunk,
использующийся для создания границ экрана и для регистрации
столкновений протонов. Он подключается как узел CCPhysicsNode.
Частицы являются анимированными спрайтами (CCSprite), и для каждой
задается своя группа коллизий. Коллизии обрабатываются именно между
этими группами. Счет игрока, номер эксперимента и накопленная энергия
подсчитываются в переменных score, expnum и energy соответственно и
выводятся на экран в составе узлов scoreLabel, expnumLabel и energyLabel
типа CCLabelTTF.
Для обработки касаний требуется сначала активировать обработчик в
соответствующей сцене командой
self.isTouchEnabled = YES;
Обычно это делается в классе init. После выполнения команды cocos2d
сможет распознавать у нашего слоя 3 метода:
 -(void)ccTouchesBegan:(NSSet
*)touches
withEvent:(UIEvent
*)event - вызывается, когда пользователь начал касание
 -(void)ccTouchesMoved:(NSSet
*)touches
withEvent:(UIEvent
*)event - вызывается каждый раз, когда пользователь переместил
палец (или пальцы) по экрану
 -(void)ccTouchesEnded:(NSSet
*)touches
withEvent:(UIEvent
*)event - вызывается, когда касания закончились
17
Во многих случаях, к примеру, в моей игре, требуется знать, где именно
произошло нажатие. Для того, чтобы получить точку в координатах
OpenGL, нужно выполнить следующий код:
-(CGPoint) locationFromTouches:(NSSet *)touches {
UITouch *touch = [touches anyObject];
CGPoint touchLocation = [touch locationInView: [touch view]]; return
[[CCDirector sharedDirector] convertToGL:touchLocation]; }
За генерацию встречных протонов и полос ускорения отвечает
специальная функция cocos2D, называемая Планировщик (Scheduler).
Например, если нам нужно генерировать ускоряющую полосу каждые 7
секунд игры, мы выполняем команду [self schedule:@selector(addspeedup)
interval:7.0].
При достижении полосы ускорения игра ускоряется ([CCDirector
sharedDirector].scheduler.timeScale
+=
0.5),
причем
Планировщик
выполняет команду [self scheduleOnce:@selector(bktonorm) delay:2.0],
которая через 2 секунды вернет прежнюю скорость игры.
При
нажатии
кнопки
«Пауза»
происходит
приостановка
игры
([[CCDirector sharedDirector] pause]) с отображением промежуточного
меню, из которого можно выйти в Главное Меню или продолжить игру.
При нажатии кнопки «Звук» происходит выключение\включение
музыки в игре с помощью команды setMuted.
По
окончанию
игры
отображается
промежуточное
меню,
где
показывается счет игрока, а также кнопки «Главное Меню» и «Новая
Игра».
Сцены
«Как
играть»
и
«Авторы»
не
содержат
элементов,
заслуживающих особого внимания, поэтому их подробное описание здесь
не приводится.
18
ЗАКЛЮЧЕНИЕ
В ходе выполнения работы был получен опыт программирования на
платформе iOS с использованием игрового движка cocos2D.
В ближайший месяц планируется выпуск игры в AppStore для
бесплатного скачивания и начало работы над следующей игрой для iOS.
Выражаю благодарность Ольге Палагиной за любезно предоставленные
текстуры для игры, а также Александру Петрову за не менее любезно
предоставленное музыкальное сопровождение.
И в заключение немного о «пасхальном яйце» - концовке «Вы
уничтожили мир, создав чёрную дыру», возникающей при достижении
энергии 7 ТэВ (порог возможности настоящего БАК). В 2008 году, при
начальном запуске ускорителя, была выдвинута гипотеза о возможности
19
образования микроскопических чёрных дыр в точках столкновения. Это
предположение стало наиболее часто упоминаемым в прессе и обществе,
как главный довод опасности экспериментов на БАК. В игре при
достижении энергии 7 ТэВ встречные частицы выглядят чёрными, а при
столкновении с такой частицей образуется чёрная дыра.
Рисунок 4 - Образование чёрной дыры
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Sef. Русские уроки cocos2d. [Электронный ресурс] –
http://cocos2d-ru.blogspot.ru/ - 04.02.2014.
2. Кэбин Э. И. Ядерная физика в Интернете. [Электронный ресурс] -
http://nuclphys.sinp.msu.ru/ - 01.02.2014.
3. Дрёмин И. М. Физика на Большом адронном коллайдере. // УФН:
журнал. — 2009. — Т. 179. — № 6 - 10.03.2014.
4. Иванов И. Столкновение на встречных курсах. // Вокруг света:
журнал. — июль 2007. — № 7 (2802) – 22.03.2014.
20
ПРИЛОЖЕНИЕ А
Код программы.
Файл IntroScene.h
#import "cocos2d.h"
#import "cocos2d-ui.h"
@interface IntroScene : CCScene
+ (IntroScene *)scene;
- (id)init;
@end
Файл IntroScene.m
#import "IntroScene.h"
#import "HelloWorldScene.h"
#import "aScene.h"
#import "howScene.h"
#import "CCAnimation.h"
@implementation IntroScene
{
NSUserDefaults *defaults;
CCAnimation *bhan;
CCSprite *bhole;}
+ (IntroScene *)scene
{ return [[self alloc] init]; }
- (id)init
{self = [super init];
if (!self) return(nil);
self.userInteractionEnabled = YES;
CCSprite *back = [CCSprite spriteWithImageNamed:@"mainmenu.png"];
back.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
[self addChild:back];
21
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"bhAnim.plist"];
NSMutableArray *bhFrames = [NSMutableArray array];
for(int i=1; i<=7; ++i)
{[bhFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"blackhole%d.png", i]]];}
bhan = [CCAnimation animationWithSpriteFrames:bhFrames delay:0.02f];
bhole = [CCSprite spriteWithImageNamed:@"blackhole1.png"];
bhole.position = CGPointMake( self.contentSize.width/6 +
self.contentSize.width/70, self.contentSize.height/2 +
self.contentSize.height/17);
CCActionAnimate *bhac = [CCActionAnimate actionWithAnimation:bhan];
CCActionRepeatForever *bhrf = [CCActionRepeatForever actionWithAction:bhac];
[bhole runAction:bhrf];
bhole.scale = 1.7;
[self addChild:bhole z:1];
defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
NSDictionary* temp = [NSLocale
componentsFromLocaleIdentifier:currentLanguage];
NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode];
if ([languageCode isEqualToString:@"ru"])
{CCButton *helloWorldButton = [CCButton buttonWithTitle:@"Начать игру"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
helloWorldButton.positionType = CCPositionTypeNormalized;
helloWorldButton.position = ccp(0.842f, 0.6f);
helloWorldButton.label.outlineWidth = 2;
helloWorldButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
helloWorldButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[helloWorldButton setTarget:self selector:@selector(onSpinningClicked:)];
[self addChild:helloWorldButton];
CCButton *howtoButton = [CCButton buttonWithTitle:@"Как играть"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
howtoButton.positionType = CCPositionTypeNormalized;
howtoButton.position = ccp(0.842f, 0.45f);
howtoButton.label.outlineWidth = 2;
howtoButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
howtoButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[howtoButton setTarget:self selector:@selector(onhowClicked:)];
[self addChild:howtoButton];
CCButton *aButton = [CCButton buttonWithTitle:@"Авторы"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
aButton.positionType = CCPositionTypeNormalized;
aButton.position = ccp(0.842f, 0.15f);
aButton.label.outlineWidth = 2;
aButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
aButton.label.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
aButton setTarget:self selector:@selector(onaClicked:)];
[self addChild:aButton]; } else {
CCButton *helloWorldButton = [CCButton buttonWithTitle:@"Start"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
helloWorldButton.positionType = CCPositionTypeNormalized;
helloWorldButton.position = ccp(0.842f, 0.6f);
helloWorldButton.label.outlineWidth = 2;
helloWorldButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
helloWorldButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[helloWorldButton setTarget:self selector:@selector(onSpinningClicked:)];
[self addChild:helloWorldButton];
CCButton *howtoButton = [CCButton buttonWithTitle:@"How to play"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
howtoButton.positionType = CCPositionTypeNormalized;
howtoButton.position = ccp(0.842f, 0.45f);
howtoButton.label.outlineWidth = 2;
howtoButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
howtoButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
22
[howtoButton setTarget:self selector:@selector(onhowClicked:)];
[self addChild:howtoButton];
CCButton *aButton = [CCButton buttonWithTitle:@"Authors"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
aButton.positionType = CCPositionTypeNormalized;
aButton.position = ccp(0.842f, 0.15f);
aButton.label.outlineWidth = 2;
aButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
aButton.label.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[aButton setTarget:self selector:@selector(onaClicked:)];
[self addChild:aButton];}
int highScore;
highScore = [[defaults valueForKey:@"SavedHighScore"] intValue];
if (highScore != 0) {
CCLabelTTF *hslabel = [CCLabelTTF labelWithString:@""
fontName:@"Techno28Normal.ttf" fontSize:90.0f];
hslabel.positionType = CCPositionTypeNormalized;
hslabel.outlineWidth = 3.0;
hslabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
hslabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
hslabel.position = ccp(0.6f, 0.885f);
[self addChild:hslabel z:5];
[hslabel setString:[NSString stringWithFormat:@"%d", highScore]];
if ([languageCode isEqualToString:@"ru"])
{CCLabelTTF *rec =[CCLabelTTF labelWithString:@"Рекорд"
fontName:@"Techno28Normal.ttf" fontSize:33.0f];
rec.positionType = CCPositionTypeNormalized;
rec.outlineWidth = 1.2;
rec.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
rec.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
rec.position = ccp(0.6f, 0.96f);
[self addChild:rec z:5];
CCButton *eraseButton = [CCButton buttonWithTitle:@"Сброс"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
eraseButton.positionType = CCPositionTypeNormalized;
eraseButton.position = ccp(0.842f, 0.3f);
eraseButton.label.outlineWidth = 2;
eraseButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
eraseButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[eraseButton setTarget:self selector:@selector(oneraseClicked:)];
[self addChild:eraseButton]; } else {
CCLabelTTF *rec =[CCLabelTTF labelWithString:@"Highscore"
fontName:@"Techno28Normal.ttf" fontSize:33.0f];
rec.positionType = CCPositionTypeNormalized;
rec.outlineWidth = 1.2;
rec.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
rec.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
rec.position = ccp(0.6f, 0.96f);
[self addChild:rec z:5];
CCButton *eraseButton = [CCButton buttonWithTitle:@"Reset"
fontName:@"Techno28Normal.ttf" fontSize:48.0f];
eraseButton.positionType = CCPositionTypeNormalized;
eraseButton.position = ccp(0.842f, 0.3f);
eraseButton.label.outlineWidth = 2;
eraseButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
eraseButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[eraseButton setTarget:self selector:@selector(oneraseClicked:)];
[self addChild:eraseButton]; }}
[[OALSimpleAudio sharedInstance] playBg:@"PE-menu.mp3" loop:YES];
[OALSimpleAudio sharedInstance].allowIpod = NO;
[OALSimpleAudio sharedInstance].honorSilentSwitch = YES;
return self;}
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [touch locationInNode:self];
if (ccpDistance(touchLocation, bhole.position) < self.contentSize.height/8) {
if (bhole.scale < 3.0){
bhole.scale += 0.05; }}}
- (void)onSpinningClicked:(id)sender
23
{ [[OALSimpleAudio sharedInstance] playBg:@"PE-game.mp3" loop:YES];
[[CCDirector sharedDirector] replaceScene:[HelloWorldScene scene]
withTransition:[CCTransition
transitionPushWithDirection:CCTransitionDirectionLeft duration:1.0f]]; }
- (void)onhowClicked:(id)sender
{ [[CCDirector sharedDirector] replaceScene:[howScene scene]
withTransition:[CCTransition
transitionPushWithDirection:CCTransitionDirectionRight duration:1.0f]]; }
- (void)oneraseClicked:(id)sender
{ [defaults setObject:[NSNumber numberWithInt:0] forKey:@"SavedHighScore"];
[defaults synchronize];
[[CCDirector sharedDirector] replaceScene:[IntroScene scene]
withTransition:[CCTransition
transitionCrossFadeWithDuration:1.0f]]; }
- (void)onaClicked:(id)sender
{ [[CCDirector sharedDirector] replaceScene:[aScene scene]
withTransition:[CCTransition
transitionCrossFadeWithDuration:1.0f]];}
@end
Файл aScene.h
#import "cocos2d.h"
#import "cocos2d-ui.h"
@interface aScene : CCScene
+ (aScene *)scene;
- (id)init;
@end
Файл aScene.m
#import "IntroScene.h"
#import "HelloWorldScene.h"
#import "aScene.h"
@implementation aScene {
CCLabelTTF *label2;
CCLabelTTF *label3;
CCLabelTTF *label4;
CCLabelTTF *label5;
CCLabelTTF *label6;
CCLabelTTF *label7;
CCLabelTTF *label9;
CCButton *aButton;
NSUserDefaults *defaults;}
+ (aScene *)scene
{ return [[self alloc] init]; }
- (id)init
{ self = [super init];
if (!self) return(nil);
CCSprite *back = [CCSprite spriteWithImageNamed:@"mainmenu-static.png"];
back.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
[self addChild:back];
CCLabelTTF *label = [CCLabelTTF labelWithString:@"v1.0"
fontName:@"Techno28Normal.ttf" fontSize:28.0f];
label.positionType = CCPositionTypeNormalized;
label.outlineWidth = 2;
label.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
label.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label.position = ccp(0.964f, 0.78f);
[self addChild:label];
defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
NSDictionary* temp = [NSLocale
componentsFromLocaleIdentifier:currentLanguage];
NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode];
if ([languageCode isEqualToString:@"ru"])
24
{label2 = [CCLabelTTF labelWithString:@"Автор:" fontName:@"Verdana"
fontSize:22.0f];
label3 = [CCLabelTTF labelWithString:@"Павел Саймон Генералов"
fontName:@"Verdana" fontSize:22.0f];
label4 = [CCLabelTTF labelWithString:@"Идея и дизайн:"
fontName:@"Verdana" fontSize:22.0f];
label5 = [CCLabelTTF labelWithString:@"Ольга Палагина"
fontName:@"Verdana" fontSize:22.0f];
label6 = [CCLabelTTF labelWithString:@"Музыка:" fontName:@"Verdana"
fontSize:22.0f];
label7 = [CCLabelTTF labelWithString:@"Александр Петров"
fontName:@"Verdana" fontSize:22.0f];
label9 = [CCLabelTTF labelWithString:@"Спасибо за игру!"
fontName:@"Verdana" fontSize:22.0f];
aButton = [CCButton buttonWithTitle:@"Назад"
fontName:@"Techno28Normal.ttf" fontSize:66.0f]; } else {
label2 = [CCLabelTTF labelWithString:@"Programming:"
fontName:@"Verdana" fontSize:22.0f];
label3 = [CCLabelTTF labelWithString:@"Pavel Simon Generalov"
fontName:@"Verdana" fontSize:22.0f];
label4 = [CCLabelTTF labelWithString:@"Idea and design:"
fontName:@"Verdana" fontSize:22.0f];
label5 = [CCLabelTTF labelWithString:@"Olga Palagina"
fontName:@"Verdana" fontSize:22.0f];
label6 = [CCLabelTTF labelWithString:@"Music:" fontName:@"Verdana"
fontSize:22.0f];
label7 = [CCLabelTTF labelWithString:@"Alexander Petrov"
fontName:@"Verdana" fontSize:22.0f];
label9 = [CCLabelTTF labelWithString:@"Thanks for playing!"
fontName:@"Verdana" fontSize:22.0f];
aButton = [CCButton buttonWithTitle:@"Back"
fontName:@"Techno28Normal.ttf" fontSize:66.0f]; }
label2.positionType = CCPositionTypeNormalized;
label2.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label2.position = ccp(0.842f, 0.71f);
[self addChild:label2];
label3.positionType = CCPositionTypeNormalized;
label3.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label3.position = ccp(0.842f, 0.62f);
[self addChild:label3];
label4.positionType = CCPositionTypeNormalized;
label4.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label4.position = ccp(0.842f, 0.53f);
[self addChild:label4];
label5.positionType = CCPositionTypeNormalized;
label5.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label5.position = ccp(0.842f, 0.44f);
[self addChild:label5];
label6.positionType = CCPositionTypeNormalized;
label6.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label6.position = ccp(0.842f, 0.35f);
[self addChild:label6];
label7.positionType = CCPositionTypeNormalized;
label7.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label7.position = ccp(0.842f, 0.26f);
[self addChild:label7];
label9.positionType = CCPositionTypeNormalized;
label9.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
label9.position = ccp(0.842f, 0.17f);
[self addChild:label9];
aButton.positionType = CCPositionTypeNormalized;
aButton.position = ccp(0.842f, 0.08f);
aButton.label.outlineWidth = 2;
aButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
aButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[aButton setTarget:self selector:@selector(onaClicked:)];
[self addChild:aButton];
return self; }
- (void)onaClicked:(id)sender
25
{ [[CCDirector sharedDirector] replaceScene:[IntroScene scene]
withTransition:[CCTransition
transitionCrossFadeWithDuration:1.0f]];}
@end
Файл howScene.h
#import "cocos2d.h"
#import "cocos2d-ui.h"
@interface howScene : CCScene
+ (howScene *)scene;
- (id)init;
@end
Файл howScene.m
#import "IntroScene.h"
#import "HelloWorldScene.h"
#import "howScene.h"
#import "CCAnimation.h"
@implementation howScene{
NSUserDefaults *defaults;
CCButton *aButton;
CCLabelTTF *expLabel;
CCLabelTTF *energyLabel;
CCLabelTTF *expnumLabel;
CCLabelTTF *label2;
CCLabelTTF *label3;
CCLabelTTF *label4;
CCLabelTTF *label5;
CCLabelTTF *label6;
CCLabelTTF *label7;
CCLabelTTF *label8;
CCLabelTTF *label9;}
+ (howScene *)scene
{ return [[self alloc] init]; }
- (id)init
{
self = [super init];
if (!self) return(nil);
defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [languages objectAtIndex:0];
NSDictionary* temp = [NSLocale
componentsFromLocaleIdentifier:currentLanguage];
NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode];
CCSprite *frame = [CCSprite spriteWithImageNamed:@"frame.png"];
CCSprite *back = [CCSprite spriteWithImageNamed:@"back.png"];
back.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
frame.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
[self addChild:frame z:4];
[self addChild:back z:1];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"VeloAnim.plist"];
NSMutableArray *veloFrames = [NSMutableArray array];
for(int i=1; i<=5; ++i)
{ [veloFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"velo%d.png", i]]]; }
CCAnimation *veloan = [CCAnimation animationWithSpriteFrames:veloFrames
delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"bhAnim.plist"];
NSMutableArray *bhFrames = [NSMutableArray array];
for(int i=1; i<=7; ++i)
{ [bhFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"blackhole%d.png", i]]];}
CCAnimation *bhan = [CCAnimation animationWithSpriteFrames:bhFrames
delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"pr1anim.plist"];
26
NSMutableArray *pr1Frames = [NSMutableArray array];
for(int i=1; i<=6; ++i)
{ [pr1Frames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"proton1%d.png", i]]]; }
CCAnimation *pr1an = [CCAnimation animationWithSpriteFrames:pr1Frames
delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"pr2anim.plist"];
NSMutableArray *pr2Frames = [NSMutableArray array];
for(int i=1; i<=6; ++i)
{ [pr2Frames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"proton2%d.png", i]]]; }
CCAnimation *pr2an = [CCAnimation animationWithSpriteFrames:pr2Frames
delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"apanim.plist"];
NSMutableArray *apFrames = [NSMutableArray array];
for(int i=1; i<=6; ++i)
{ [apFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"antiproton%d.png", i]]]; }
CCAnimation *apan = [CCAnimation animationWithSpriteFrames:apFrames
delay:0.02f];
CCSprite *_player = [CCSprite spriteWithImageNamed:@"proton11.png"];
CCActionAnimate *pr1ac = [CCActionAnimate actionWithAnimation:pr1an];
CCActionRepeatForever *pr1rf = [CCActionRepeatForever actionWithAction:pr1ac];
_player.positionType = CCPositionTypeNormalized;
_player.position = ccp(0.15, 0.72);
[_player runAction:pr1rf];
[self addChild:_player z:3];
CCSprite *speed = [CCSprite spriteWithImageNamed:@"velo1.png"];
speed.positionType = CCPositionTypeNormalized;
speed.position = ccp(0.5, 0.45);
CCActionAnimate *veloac = [CCActionAnimate actionWithAnimation:veloan];
CCActionRepeatForever *velorf = [CCActionRepeatForever
actionWithAction:veloac];
[speed runAction:velorf];
[self addChild:speed z:3];
CCSprite *monster = [CCSprite spriteWithImageNamed:@"antiproton1.png"];
monster.positionType = CCPositionTypeNormalized;
monster.position = ccp(0.5, 0.72);
CCActionAnimate *apac = [CCActionAnimate actionWithAnimation:apan];
CCActionRepeatForever *aprf = [CCActionRepeatForever actionWithAction:apac];
[monster runAction:aprf];
[self addChild:monster z:3];
CCSprite *gg = [CCSprite spriteWithImageNamed:@"proton21.png"];
gg.positionType = CCPositionTypeNormalized;
gg.position = ccp(0.85, 0.72);
CCActionAnimate *pr2ac = [CCActionAnimate actionWithAnimation:pr2an];
CCActionRepeatForever *pr2rf = [CCActionRepeatForever actionWithAction:pr2ac];
[gg runAction:pr2rf];
[self addChild:gg z:3];
CCSprite *bhole = [CCSprite spriteWithImageNamed:@"blackhole1.png"];
bhole.positionType = CCPositionTypeNormalized;
bhole.position = ccp(0.32, 0.2);
CCActionAnimate *bhac = [CCActionAnimate actionWithAnimation:bhan];
CCActionRepeatForever *bhrf = [CCActionRepeatForever actionWithAction:bhac];
[bhole runAction:bhrf];
[self addChild:bhole z:3];
CCLabelTTF *scoreLabel = [CCLabelTTF labelWithString:@""
fontName:@"Techno28Normal.ttf" fontSize:75];
scoreLabel.positionType = CCPositionTypeNormalized;
scoreLabel.outlineWidth = 3;
scoreLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
scoreLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
scoreLabel.position = ccp(0.5f, 0.895f);
[self addChild:scoreLabel z:6];
languages = [defaults objectForKey:@"AppleLanguages"];
currentLanguage = [languages objectAtIndex:0];
temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage];
languageCode = [temp objectForKey:NSLocaleLanguageCode];
27
int r1 = 6;
int rr1 = (arc4random() % r1)+1;
int r2 = 49;
int rr2 = (arc4random() % r2)+1;
int r3 = 200;
int rr3 = (arc4random() % r3);
[scoreLabel setString:[NSString stringWithFormat:@"%d", rr3]];
if ([languageCode isEqualToString:@"ru"])
{ energyLabel = [CCLabelTTF labelWithString:@"Энергия: 3 TeV"
fontName:@"Techno28Normal.ttf" fontSize:33];
expLabel = [CCLabelTTF labelWithString:@"Счет"
fontName:@"Techno28Normal.ttf" fontSize:33];
expnumLabel = [CCLabelTTF labelWithString:@"Эксперимент 5"
fontName:@"Techno28Normal.ttf" fontSize:33];
aButton = [CCButton buttonWithTitle:@"Назад"
fontName:@"Techno28Normal.ttf" fontSize:60.0f];
label2 = [CCLabelTTF labelWithString:@"Ваши протоны"
fontName:@"Verdana" fontSize:22.0f];
label3 = [CCLabelTTF labelWithString:@"+10 очков" fontName:@"Verdana"
fontSize:22.0f];
label4 = [CCLabelTTF labelWithString:@"-10 очков, +1 очко если
пролетел мимо" fontName:@"Verdana" fontSize:22.0f];
label5 = [CCLabelTTF labelWithString:@"Кратковременное ускорение, +1
ТэВ" fontName:@"Verdana" fontSize:22.0f];
label6 = [CCLabelTTF labelWithString:@"Червоточина, появляется при
достижении" fontName:@"Verdana" fontSize:22.0f];
label9 = [CCLabelTTF labelWithString:@"очень высокой энергии"
fontName:@"Verdana" fontSize:22.0f];
label7 = [CCLabelTTF labelWithString:@"У вас всего 50 экспериментов!"
fontName:@"Verdana" fontSize:22.0f];
label8 = [CCLabelTTF labelWithString:@"Тераэлектронвольт"
fontName:@"Verdana" fontSize:22.0f]; } else {
energyLabel = [CCLabelTTF labelWithString:@"Energy: 3 TeV"
fontName:@"Techno28Normal.ttf" fontSize:33];
expLabel = [CCLabelTTF labelWithString:@"Score"
fontName:@"Techno28Normal.ttf" fontSize:33];
expnumLabel = [CCLabelTTF labelWithString:@"Experiment 5"
fontName:@"Techno28Normal.ttf" fontSize:33];
aButton = [CCButton buttonWithTitle:@"Back"
fontName:@"Techno28Normal.ttf" fontSize:60.0f];
label2 = [CCLabelTTF labelWithString:@"Your protons"
fontName:@"Verdana" fontSize:22.0f];
label3 = [CCLabelTTF labelWithString:@"+10 points" fontName:@"Verdana"
fontSize:22.0f];
label4 = [CCLabelTTF labelWithString:@"-10 points, +1 point if
avoided" fontName:@"Verdana" fontSize:22.0f];
label5 = [CCLabelTTF labelWithString:@"Temporary boost, +1 TeV"
fontName:@"Verdana" fontSize:22.0f];
label6 = [CCLabelTTF labelWithString:@"Wormhole, appears only"
fontName:@"Verdana" fontSize:22.0f];
label9 = [CCLabelTTF labelWithString:@"when a lot of energy is
amassed" fontName:@"Verdana" fontSize:22.0f];
label7 = [CCLabelTTF labelWithString:@"You only have 50 experiments!"
fontName:@"Verdana" fontSize:22.0f];
label8 = [CCLabelTTF labelWithString:@"Teraelectronvolt"
fontName:@"Verdana" fontSize:22.0f]; }
energyLabel.positionType = CCPositionTypeNormalized;
energyLabel.position = ccp(0.78f, 0.953f);
energyLabel.outlineWidth = 1.2;
energyLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
energyLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[self addChild:energyLabel z:6];
expLabel.positionType = CCPositionTypeNormalized;
expLabel.position = ccp(0.5f, 0.96f);
expLabel.outlineWidth = 1;
expLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
expLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[self addChild:expLabel z:6];
expnumLabel.positionType = CCPositionTypeNormalized;
28
expnumLabel.position = ccp(0.22f, 0.953f);
expnumLabel.outlineWidth = 1.2;
expnumLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
expnumLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[self addChild:expnumLabel z:6];
if ([languageCode isEqualToString:@"ru"]) {
[energyLabel setString:[NSString stringWithFormat:@"Энергия: %d TeV", rr1]];
[expnumLabel setString:[NSString stringWithFormat:@"Эксперимент %d", rr2]]; }
else { [expnumLabel setString:[NSString stringWithFormat:@"Experiment %d",
rr2]];
[energyLabel setString:[NSString stringWithFormat:@"Energy: %d TeV", rr1]]; }
CCSprite *abback = [CCSprite spriteWithImageNamed:@"new_highscore.png"];
abback.positionType = CCPositionTypeNormalized;
abback.position = ccp(0.8, 0.155);
[self addChild:abback z:8];
aButton.positionType = CCPositionTypeNormalized;
aButton.position = ccp(0.8f, 0.15f);
aButton.label.outlineWidth = 2;
aButton.label.outlineColor = [CCColor blackColor];
aButton.color = [CCColor redColor];
[aButton setTarget:self selector:@selector(onaClicked:)];
[self addChild:aButton z:9];
label2.positionType = CCPositionTypeNormalized;
label2.outlineWidth=1;
label2.outlineColor = [CCColor blackColor];
label2.color = [CCColor whiteColor];
label2.position = ccp(0.15f, 0.62f);
[self addChild:label2 z:9];
label3.positionType = CCPositionTypeNormalized;
label3.outlineWidth=1;
label3.outlineColor = [CCColor blackColor];
label3.color = [CCColor whiteColor];
label3.position = ccp(0.85f, 0.62f);
[self addChild:label3 z:9];
label4.positionType = CCPositionTypeNormalized;
label4.outlineWidth=1;
label4.outlineColor = [CCColor blackColor];
label4.color = [CCColor whiteColor];
label4.position = ccp(0.5f, 0.62f);
[self addChild:label4 z:9];
label5.positionType = CCPositionTypeNormalized;
label5.outlineWidth=1;
label5.outlineColor = [CCColor blackColor];
label5.color = [CCColor whiteColor];
label5.position = ccp(0.5f, 0.36f);
[self addChild:label5 z:9];
label6.positionType = CCPositionTypeNormalized;
label6.outlineWidth=1;
label6.outlineColor = [CCColor blackColor];
label6.color = [CCColor whiteColor];
label6.position = ccp(0.32f, 0.11f);
[self addChild:label6 z:9];
label9.positionType = CCPositionTypeNormalized;
label9.outlineWidth=1;
label9.outlineColor = [CCColor blackColor];
label9.color = [CCColor whiteColor];
label9.position = ccp(0.32f, 0.08f);
[self addChild:label9 z:9];
label7.positionType = CCPositionTypeNormalized;
label7.outlineWidth=1;
label7.outlineColor = [CCColor blackColor];
label7.color = [CCColor whiteColor];
label7.position = ccp(0.22f, 0.885f);
[self addChild:label7 z:9];
label8.positionType = CCPositionTypeNormalized;
label8.outlineWidth=1;
label8.outlineColor = [CCColor blackColor];
label8.color = [CCColor whiteColor];
label8.position = ccp(0.78f, 0.885f);
[self addChild:label8 z:9];
29
return self; }
- (void)onaClicked:(id)sender
{ [[CCDirector sharedDirector] replaceScene:[IntroScene scene]
withTransition:[CCTransition
transitionPushWithDirection:CCTransitionDirectionLeft duration:1.0f]];}
@end
Файл HelloWorldScene.h
#import "cocos2d.h"
#import "cocos2d-ui.h"
@interface HelloWorldScene : CCScene <CCPhysicsCollisionDelegate>{
CCLabelTTF *scoreLabel;
CCLabelTTF *energyLabel;
CCLabelTTF *expnumLabel;
CCLabelTTF *pLabel;
CCLabelTTF *pLabel1;
CCButton *bButton;
CCButton *rButton;
CCSprite *veil; }
+ (HelloWorldScene *)scene;
- (id)init;
@end
Файл HelloWorldScene.m
#import "HelloWorldScene.h"
#import "IntroScene.h"
#import "CCAnimation.h"
#import "CCDirector_private.h"
@implementation HelloWorldScene
{ CCLabelTTF *hslabel;
CCLabelTTF *expLabel;
CCLabelTTF *label;
CCLabelTTF *label2;
CCLabelTTF *new;
CCLabelTTF *new2;
CCLabelTTF *dngr;
CCNodeColor *danger;
CCButton *pauseButton;
CCButton *helloWorldButton;
CCButton *back1Button;
CCSprite *speed;
CCSprite *_player;
CCSprite *_player2;
CCSprite *bhole;
CCPhysicsNode *_physicsWorld;
CCNode *bottomBody;
NSUserDefaults *defaults;
CCAnimation *veloan;
CCAnimation *bhan;
CCAnimation *pr2an;
CCAnimation *apan;
NSArray *languages;
NSString *currentLanguage;
NSDictionary* temp;
NSString * languageCode; }
bool alive;
bool paused;
bool spedup;
int score;
int energy;
int expnum;
float timescale;
bool far;
bool invul;
const int maxexpnum = 50;
const int maxenergy = 7;
+ (HelloWorldScene *)scene
30
{ return [[self alloc] init]; }
- (id)init
{ alive = true;
paused = false;
energy = 1;
expnum = 1;
invul=false;
far = true;
spedup=false;
self = [super init];
if (!self) return(nil);
self.userInteractionEnabled = YES;
self.multipleTouchEnabled = YES;
timescale=1.0;
_physicsWorld = [CCPhysicsNode node];
_physicsWorld.gravity = ccp(0,0);
_physicsWorld.collisionDelegate = self;
[self addChild:_physicsWorld z:4];
defaults = [NSUserDefaults standardUserDefaults];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"VeloAnim.plist"];
NSMutableArray *veloFrames = [NSMutableArray array];
for(int i=1; i<=5; ++i)
{ [veloFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"velo%d.png", i]]]; }
veloan = [CCAnimation animationWithSpriteFrames:veloFrames delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"bhAnim.plist"];
NSMutableArray *bhFrames = [NSMutableArray array];
for(int i=1; i<=7; ++i)
{ [bhFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"blackhole%d.png", i]]]; }
bhan = [CCAnimation animationWithSpriteFrames:bhFrames delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"pr1anim.plist"];
NSMutableArray *pr1Frames = [NSMutableArray array];
for(int i=1; i<=6; ++i)
{ [pr1Frames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"proton1%d.png", i]]]; }
CCAnimation *pr1an = [CCAnimation animationWithSpriteFrames:pr1Frames
delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"pr2anim.plist"];
NSMutableArray *pr2Frames = [NSMutableArray array];
for(int i=1; i<=6; ++i)
{ [pr2Frames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"proton2%d.png", i]]]; }
pr2an = [CCAnimation animationWithSpriteFrames:pr2Frames delay:0.02f];
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"apanim.plist"];
NSMutableArray *apFrames = [NSMutableArray array];
for(int i=1; i<=6; ++i)
{ [apFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"antiproton%d.png", i]]]; }
apan = [CCAnimation animationWithSpriteFrames:apFrames delay:0.02f];
CGRect bottomRect = CGRectMake(-20, -20, [[CCDirector sharedDirector]
viewSize].width+20,[[CCDirector sharedDirector] viewSize].height/20-20);
bottomBody = [CCNode node];
bottomBody.physicsBody = [CCPhysicsBody bodyWithRect:bottomRect
cornerRadius:0];
bottomBody.physicsBody.collisionGroup = @"bottomBodyGroup";
bottomBody.physicsBody.collisionType = @"bottomBodyCollision";
bottomBody.physicsBody.type =
CCPhysicsBodyTypeStatic;
[_physicsWorld addChild:bottomBody];
_player = [CCSprite spriteWithImageNamed:@"proton11.png"];
_player.physicsBody = [CCPhysicsBody
bodyWithCircleOfRadius:_player.contentSize.width/3.0f
andCenter:_player.anchorPointInPoints];
_player.physicsBody.collisionGroup
= @"playerGroup";
_player.physicsBody.collisionType = @"playerCollision";
CCActionAnimate *pr1ac = [CCActionAnimate actionWithAnimation:pr1an];
31
CCActionRepeatForever *pr1rf = [CCActionRepeatForever actionWithAction:pr1ac];
player.position = ccp(self.contentSize.width/8,self.contentSize.height/8);
[_player runAction:pr1rf];
[_physicsWorld addChild:_player z:5];
CCSprite *frame = [CCSprite spriteWithImageNamed:@"frame.png"];
CCSprite *back = [CCSprite spriteWithImageNamed:@"back.png"];
back.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
frame.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
[self addChild:frame z:6];
[self addChild:back z:1];
_player2 = [CCSprite spriteWithImageNamed:@"proton11.png"];
_player2.physicsBody = [CCPhysicsBody
bodyWithCircleOfRadius:_player2.contentSize.width/3.0f
andCenter:_player2.anchorPointInPoints];
_player2.physicsBody.collisionGroup = @"playerGroup";
_player2.physicsBody.collisionType = @"playerCollision";
_player2.position =
ccp(self.contentSize.width/2+self.contentSize.width/3,self.contentSize.height/
8);
CCActionAnimate *pr11ac = [CCActionAnimate actionWithAnimation:pr1an];
CCActionRepeatForever *pr11rf = [CCActionRepeatForever
actionWithAction:pr11ac];
[_player2 runAction:pr11rf];
[_physicsWorld addChild:_player2 z:5];
CCButton *backButton = [CCButton buttonWithTitle:@""
spriteFrame:[CCSpriteFrame frameWithImageNamed:@"sound_on.png"]
highlightedSpriteFrame:[CCSpriteFrame frameWithImageNamed:@"sound_off.png"]
disabledSpriteFrame:[CCSpriteFrame frameWithImageNamed:@"sound_off.png"]];
backButton.togglesSelectedState = YES;
backButton.positionType = CCPositionTypeNormalized;
backButton.position = ccp(0.94f, 0.955f);
backButton.exclusiveTouch = NO;
backButton.claimsUserInteraction = NO;
[backButton setTarget:self selector:@selector(onMuteClicked:)];
[self addChild:backButton z:6];
score = 0;
scoreLabel = [CCLabelTTF labelWithString:@"0" fontName:@"Techno28Normal.ttf"
fontSize:75];
scoreLabel.positionType = CCPositionTypeNormalized;
scoreLabel.outlineWidth = 3;
scoreLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
scoreLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
scoreLabel.position = ccp(0.5f, 0.895f);
[self addChild:scoreLabel z:6];
languages = [defaults objectForKey:@"AppleLanguages"];
currentLanguage = [languages objectAtIndex:0];
temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage];
languageCode = [temp objectForKey:NSLocaleLanguageCode];
if ([languageCode isEqualToString:@"ru"])
{ energyLabel = [CCLabelTTF labelWithString:@"Энергия: 1 ТэВ"
fontName:@"Techno28Normal.ttf" fontSize:33];
expLabel = [CCLabelTTF labelWithString:@"Счет"
fontName:@"Techno28Normal.ttf" fontSize:33];
expnumLabel = [CCLabelTTF labelWithString:@"Эксперимент 1"
fontName:@"Techno28Normal.ttf" fontSize:33]; } else {
energyLabel = [CCLabelTTF labelWithString:@"Energy: 1 TeV"
fontName:@"Techno28Normal.ttf" fontSize:33];
expLabel = [CCLabelTTF labelWithString:@"Score"
fontName:@"Techno28Normal.ttf" fontSize:33];
expnumLabel = [CCLabelTTF labelWithString:@"Experiment 1"
fontName:@"Techno28Normal.ttf" fontSize:33]; }
energyLabel.positionType = CCPositionTypeNormalized;
energyLabel.position = ccp(0.78f, 0.953f);
energyLabel.outlineWidth = 1.2;
energyLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
energyLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[self addChild:energyLabel z:6];
expLabel.positionType = CCPositionTypeNormalized;
expLabel.position = ccp(0.5f, 0.96f);
expLabel.outlineWidth = 1;
32
expLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
expLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[self addChild:expLabel z:6];
expnumLabel.positionType = CCPositionTypeNormalized;
expnumLabel.position = ccp(0.22f, 0.953f);
expnumLabel.outlineWidth = 1.2;
expnumLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
expnumLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
[self addChild:expnumLabel z:6];
pauseButton = [CCButton buttonWithTitle:@"" spriteFrame:[CCSpriteFrame
frameWithImageNamed:@"pause.png"]
highlightedSpriteFrame:[CCSpriteFrame frameWithImageNamed:@"pause.png"]
disabledSpriteFrame:[CCSpriteFrame frameWithImageNamed:@"pause.png"]];
pauseButton.togglesSelectedState = YES;
pauseButton.positionType = CCPositionTypeNormalized;
pauseButton.position = ccp(0.06f, 0.955f);
pauseButton.exclusiveTouch = NO;
pauseButton.claimsUserInteraction = NO;
[pauseButton setTarget:self selector:@selector(onPauseClicked:)];
[self addChild:pauseButton z:6];
return self; }
- (void)addPlate
{ CCSprite *plate = [CCSprite spriteWithImageNamed:@"paral.png"];
plate.position = CGPointMake(self.contentSize.width/2,
self.contentSize.width/2 + plate.contentSize.width/2);
[self addChild:plate z:1];
CCAction *actionMove = [CCActionMoveTo actionWithDuration:3.0
position:CGPointMake(self.contentSize.width/2, -plate.contentSize.width/2)];
CCAction *actionRemove = [CCActionRemove action];
[plate runAction:[CCActionSequence
actionWithArray:@[actionMove,actionRemove]]]; }
- (void)addspeedup {
if (!invul) { speed = [CCSprite spriteWithImageNamed:@"velo1.png"];
speed.position = CGPointMake(self.contentSize.width/2,
self.contentSize.width/2 + speed.contentSize.width/2);
spedup=true;
CCActionAnimate *veloac = [CCActionAnimate actionWithAnimation:veloan];
CCActionRepeatForever *velorf = [CCActionRepeatForever
actionWithAction:veloac];
[speed runAction:velorf];
[self addChild:speed z:2];
CCAction *actionMove = [CCActionMoveTo actionWithDuration:3.0
position:CGPointMake(self.contentSize.width/2, -speed.contentSize.width/2)];
CCAction *actionRemove = [CCActionRemove action];
[speed runAction:[CCActionSequence
actionWithArray:@[actionMove,actionRemove]]]; }}
- (void)update:(CCTime)dt {
float dist = ccpDistance(_player.position, _player2.position);
if (dist < 100 && far) { far = false;
timescale -=0.5; }
if (dist > 100 && !far) { far = true;
timescale +=0.5; }
if (((speed.position.y < _player.position.y)||(speed.position.y <
_player2.position.y))&&(spedup)) {
if (alive && !invul) {
[self addenergy]; }
spedup=false;
danger = [CCNodeColor nodeWithColor:[CCColor colorWithRed:1.0f green:0.0f
blue:0.0f alpha:0.1f]];
[self addChild:danger z:3];
dngr = [CCLabelTTF labelWithString:@"!" fontName:@"Techno28Normal.ttf"
fontSize:135];
dngr.positionType = CCPositionTypeNormalized;
dngr.outlineWidth = 3;
dngr.outlineColor = [CCColor redColor];
dngr.color = [CCColor whiteColor];
dngr.position = ccp(0.5f, 0.75f);
[self addChild:dngr z:2];
timescale += 0.5;
33
[self scheduleOnce:@selector(bktonorm) delay:2.0]; }
[CCDirector sharedDirector].scheduler.timeScale = timescale; }
- (void)addPoint
{ score++;
[scoreLabel setString:[NSString stringWithFormat:@"%d", score]]; }
- (void)addenergy
{ energy++;
if ([languageCode isEqualToString:@"ru"]) {
[energyLabel setString:[NSString stringWithFormat:@"Энергия: %d ТэВ",
energy]]; } else {
[energyLabel setString:[NSString stringWithFormat:@"Energy: %d TeV", energy]];
}}
- (void)addnum
{ expnum++;
if ([languageCode isEqualToString:@"ru"]) {
[expnumLabel setString:[NSString stringWithFormat:@"Эксперимент %d", expnum]];
} else {
[expnumLabel setString:[NSString stringWithFormat:@"Experiment %d", expnum]];
}}
- (void)dealloc{}
- (void)onEnter
{
[super onEnter];
[self schedule:@selector(addMonster) interval:0.5];
[self schedule:@selector(addPlate) interval:0.6];
[self schedule:@selector(addspeedup) interval:7.0];
[self schedule:@selector(addbh) interval:1.5]; }
- (void)onExit
{ [super onExit]; }
-(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
if (alive && !paused) {
CGPoint touchLocation = [touch locationInNode:self];
if (touchLocation.y < self.contentSize.height/2) {
if (touchLocation.x < self.contentSize.width/2) {
_player.position = touchLocation; } else {
_player2.position = touchLocation; }}}}
-(void) touchMoved:(UITouch *)touch withEvent:(UIEvent *)event {
if (alive && !paused) {
CGPoint touchLocation = [touch locationInNode:self];
if (touchLocation.y < self.contentSize.height/2) {
if (touchLocation.x < self.contentSize.width/2) {
_player.position = touchLocation; } else {
_player2.position = touchLocation; }}}}
- (void)onSpinningClicked:(id)sender
{
alive = true;
[[CCDirector sharedDirector] replaceScene:[HelloWorldScene scene]
withTransition:[CCTransition
transitionPushWithDirection:CCTransitionDirectionLeft duration:1.0f]]; }
- (void)onMuteClicked:(id)sender
{ if ([[OALSimpleAudio sharedInstance] muted]) {
[[OALSimpleAudio sharedInstance] setMuted:false]; } else {
[[OALSimpleAudio sharedInstance] setMuted:true]; }}
- (void)onBackClicked:(id)sender
{
[[CCDirector sharedDirector] resume];
[[CCDirector sharedDirector] replaceScene:[IntroScene scene]
withTransition:[CCTransition
transitionPushWithDirection:CCTransitionDirectionRight duration:1.0f]]; }
-(void)onPauseClicked:(id)sender
{ if (alive) { (!paused) { paused = true;
[pauseButton removeFromParent];
[[CCDirector sharedDirector] pause];
veil = [CCSprite spriteWithImageNamed:@"pausemenu.png"];
veil.position = ccp(self.contentSize.width/2, self.contentSize.height/2);
[self addChild:veil z:5];
if ([languageCode isEqualToString:@"ru"]) {
pLabel = [CCLabelTTF labelWithString:@"Пауза" fontName:@"Techno28Normal.ttf"
fontSize:76];
rButton = [CCButton buttonWithTitle:@"Продолжить"
fontName:@"Techno28Normal.ttf" fontSize:56.0f];
bButton = [CCButton buttonWithTitle:@"Главное меню"
fontName:@"Techno28Normal.ttf" fontSize:56.0f]; } else {
34
pLabel = [CCLabelTTF labelWithString:@"Paused" fontName:@"Techno28Normal.ttf"
fontSize:76];
rButton = [CCButton buttonWithTitle:@"Resume" fontName:@"Techno28Normal.ttf"
fontSize:56.0f];
bButton = [CCButton buttonWithTitle:@"Main Menu"
fontName:@"Techno28Normal.ttf" fontSize:56.0f]; }
pLabel.positionType = CCPositionTypeNormalized;
pLabel.outlineWidth = 3;
pLabel.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
pLabel.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
pLabel.position = ccp(0.5f, 0.7f); [self addChild:pLabel z:5];
rButton.positionType = CCPositionTypeNormalized;
rButton.position = ccp(0.5f, 0.44f);
rButton.label.outlineWidth = 2;
rButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
rButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
rButton.exclusiveTouch = NO;
rButton.claimsUserInteraction = NO;
[rButton setTarget:self selector:@selector(onResClicked:)];
[self addChild:rButton z:5];
bButton.positionType = CCPositionTypeNormalized;
bButton.position = ccp(0.5f, 0.24f);
bButton.label.outlineWidth = 2;
bButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
bButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
bButton.exclusiveTouch = NO;
bButton.claimsUserInteraction = NO;
[bButton setTarget:self selector:@selector(onBackClicked:)];
[self addChild:bButton z:5]; }}}
- (void)onResClicked:(id)sender
{
[self addChild:pauseButton];
[self removeChild:pLabel];
[self removeChild:veil];
[self removeChild:rButton];
[self removeChild:bButton];
paused=false;
[[CCDirector sharedDirector] resume]; }
- (void)addMonster { if (!invul) { if (energy < maxenergy) {
CCSprite *monster = [CCSprite spriteWithImageNamed:@"antiproton1.png"];
int minY = monster.contentSize.height / 2;
int maxY = self.contentSize.width - monster.contentSize.height / 2;
int rangeY = maxY - minY;
int randomY = (arc4random() % rangeY) + minY;
monster.position = CGPointMake(randomY, self.contentSize.width +
monster.contentSize.width/2);
monster.physicsBody = [CCPhysicsBody
bodyWithCircleOfRadius:monster.contentSize.width/3.0f
andCenter:monster.anchorPointInPoints];
monster.physicsBody.collisionGroup = @"monsterGroup";
monster.physicsBody.collisionType = @"monsterCollision";
CCActionAnimate *apac = [CCActionAnimate actionWithAnimation:apan];
CCActionRepeatForever *aprf = [CCActionRepeatForever actionWithAction:apac];
[monster runAction:aprf];
[_physicsWorld addChild:monster z:5];
int minDuration = 2.0;
int maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int randomDuration = (arc4random() % rangeDuration) + minDuration;
CCAction *actionMove = [CCActionMoveTo actionWithDuration:randomDuration
position:CGPointMake(randomY, -monster.contentSize.width/2)];
CCAction *actionRemove = [CCActionRemove action];
[monster runAction:[CCActionSequence
actionWithArray:@[actionMove,actionRemove]]]; }}}
- (void)addbh { if (!invul) { if (energy < maxenergy) {
CCSprite *gg = [CCSprite spriteWithImageNamed:@"proton21.png"];
int minY = gg.contentSize.height / 2;
int maxY = self.contentSize.width - gg.contentSize.height / 2;
int rangeY = maxY - minY;
int randomY = (arc4random() % rangeY) + minY;
35
gg.position = CGPointMake(randomY, self.contentSize.width +
gg.contentSize.width/2);
gg.physicsBody = [CCPhysicsBody
bodyWithCircleOfRadius:gg.contentSize.width/3.0f
andCenter:gg.anchorPointInPoints];
gg.physicsBody.collisionGroup = @"ggGroup";
gg.physicsBody.collisionType = @"ggCollision";
CCActionAnimate *pr2ac = [CCActionAnimate actionWithAnimation:pr2an];
CCActionRepeatForever *pr2rf = [CCActionRepeatForever actionWithAction:pr2ac];
[gg runAction:pr2rf];
[_physicsWorld addChild:gg z:5];
int minDuration = 2.0;
int maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int randomDuration = (arc4random() % rangeDuration) + minDuration;
CCAction *actionMove = [CCActionMoveTo
actionWithDuration:randomDuration position:CGPointMake(randomY, gg.contentSize.width/2)];
CCAction *actionRemove = [CCActionRemove action];
[gg runAction:[CCActionSequence
actionWithArray:@[actionMove,actionRemove]]]; } else {
bhole = [CCSprite spriteWithImageNamed:@"blackhole1.png"];
int minY = bhole.contentSize.height / 2;
int maxY = self.contentSize.width - bhole.contentSize.height / 2;
int rangeY = maxY - minY;
int randomY = (arc4random() % rangeY) + minY;
bhole.position = CGPointMake(randomY, self.contentSize.width +
bhole.contentSize.width/2);
bhole.physicsBody = [CCPhysicsBody
bodyWithCircleOfRadius:bhole.contentSize.width/2.0f
andCenter:bhole.anchorPointInPoints];
bhole.physicsBody.collisionGroup = @"bhGroup";
bhole.physicsBody.collisionType = @"bhCollision";
CCActionAnimate *bhac = [CCActionAnimate actionWithAnimation:bhan];
CCActionRepeatForever *bhrf = [CCActionRepeatForever actionWithAction:bhac];
[bhole runAction:bhrf];
[_physicsWorld addChild:bhole z:5];
int minDuration = 2.0;
int maxDuration = 4.0;
int rangeDuration = maxDuration - minDuration;
int randomDuration = (arc4random() % rangeDuration) + minDuration;
CCAction *actionMove = [CCActionMoveTo
actionWithDuration:randomDuration position:CGPointMake(randomY, bhole.contentSize.width/2)];
CCAction *actionRemove = [CCActionRemove action];
[bhole runAction:[CCActionSequence
actionWithArray:@[actionMove,actionRemove]]]; }}}
- (BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair
monsterCollision:(CCNode *)monster bottomBodyCollision:(CCNode *)bottomBody {
if (alive && !invul) {
[self addPoint]; }
return YES; }
- (BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair
monsterCollision:(CCNode *)monster playerCollision:(CCNode *)player {
if (!invul) { pauseButton removeFromParent];
[[OALSimpleAudio sharedInstance] playEffect:@"phit.mp3"];
energy=1;
if ([languageCode isEqualToString:@"ru"]) {
[energyLabel setString:[NSString stringWithFormat:@"Энергия: %d ТэВ",
energy]]; } else {
[energyLabel setString:[NSString stringWithFormat:@"Energy: %d TeV",
energy]]; }
if (score >= 10) { score -= 10; } else { score = 0; }
[scoreLabel setString:[NSString stringWithFormat:@"%d", score]];
if (expnum < maxexpnum) {
invul=true;
paused=true;
[self addnum];
veil = [CCSprite spriteWithImageNamed:@"pausemenu.png"];
veil.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
36
[self addChild:veil z:5];
if ([languageCode isEqualToString:@"ru"]) {
pLabel1 = [CCLabelTTF labelWithString:@"След. эксперимент..."
fontName:@"Techno28Normal.ttf" fontSize:56]; } else {
pLabel1 = [CCLabelTTF labelWithString:@"Next experiment..."
fontName:@"Techno28Normal.ttf" fontSize:56]; }
pLabel1.positionType = CCPositionTypeNormalized;
pLabel1.outlineWidth = 2;
pLabel1.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
pLabel1.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
timescale += 20.0;
pLabel1.position = ccp(0.5f, 0.48f);
[self addChild:pLabel1 z:5];
[self scheduleOnce:@selector(nxtexp) delay:3.0]; } else {
[self losegame]; }}
return YES; }
- (BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair
ggCollision:(CCNode *)gg playerCollision:(CCNode *)player {
if (!invul) { [pauseButton removeFromParent];
[[OALSimpleAudio sharedInstance] playEffect:@"phit.mp3"];
energy=1;
if ([languageCode isEqualToString:@"ru"]) {
[energyLabel setString:[NSString stringWithFormat:@"Энергия: %d ТэВ",
energy]]; } else {
[energyLabel setString:[NSString stringWithFormat:@"Energy: %d TeV", energy]];
} score += 10;
[scoreLabel setString:[NSString stringWithFormat:@"%d", score]];
if (expnum < maxexpnum) {
invul=true;
paused=true;
[self addnum];
veil = [CCSprite spriteWithImageNamed:@"pausemenu.png"];
veil.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
[self addChild:veil z:5];
if ([languageCode isEqualToString:@"ru"]) {
pLabel1 = [CCLabelTTF labelWithString:@"След. эксперимент..."
fontName:@"Techno28Normal.ttf" fontSize:56]; } else {
pLabel1 = [CCLabelTTF labelWithString:@"Next experiment..."
fontName:@"Techno28Normal.ttf" fontSize:56]; }
pLabel1.positionType = CCPositionTypeNormalized;
pLabel1.outlineWidth = 2;
pLabel1.outlineColor = [CCColor colorWithRed:0.0 green:0.68 blue:0.93];
pLabel1.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
timescale += 20.0;
pLabel1.position = ccp(0.5f, 0.5f);
[self addChild:pLabel1 z:5];
[self scheduleOnce:@selector(nxtexp) delay:3.0]; } else {
[self losegame]; }}
return YES; }
- (BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair
bhCollision:(CCNode *)bh playerCollision:(CCNode *)player {
if (alive && !invul) {
[pauseButton removeFromParent];
[[OALSimpleAudio sharedInstance] playEffect:@"bhhit.mp3"];
alive = false;
[_player removeFromParent];
[_player2 removeFromParent];
veil = [CCSprite spriteWithImageNamed:@"pausemenu.png"];
veil.position = ccp(self.contentSize.width/2,self.contentSize.height/2);
[self addChild:veil z:5];
score += 100;
[scoreLabel setString:[NSString stringWithFormat:@"%d", score]];
int highScore;
highScore = [[defaults valueForKey:@"SavedHighScore"] intValue];
if (score > highScore) {
[defaults setObject:[NSNumber numberWithInt:score] forKey:@"SavedHighScore"];
[defaults synchronize];
highScore = score;
[self newhi]; }
37
hslabel = [CCLabelTTF labelWithString:@"" fontName:@"Techno28Normal.ttf"
fontSize:68.0f];
hslabel.positionType = CCPositionTypeNormalized;
hslabel.outlineWidth = 3;
hslabel.outlineColor = [CCColor blackColor];
hslabel.color = [CCColor redColor];
hslabel.position = ccp(0.5f, 0.15f);
[self addChild:hslabel z:5];
if ([languageCode isEqualToString:@"ru"]) {
label = [CCLabelTTF labelWithString:@"О нет!.." fontName:@"Techno28Normal.ttf"
fontSize:76.0f];
label2 = [CCLabelTTF labelWithString:@"Вы уничтожили мир, создав черную дыру!"
fontName:@"Techno28Normal.ttf" fontSize:41.0f];
helloWorldButton = [CCButton buttonWithTitle:@"Рестарт"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
back1Button = [CCButton buttonWithTitle:@"Главное меню"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
[hslabel setString:[NSString stringWithFormat:@"Рекорд: %d", highScore]];
} else { label = [CCLabelTTF labelWithString:@"Oh noes!.."
fontName:@"Techno28Normal.ttf" fontSize:76.0f];
label2 = [CCLabelTTF labelWithString:@"You created a black hole and destroyed
the world!" fontName:@"Techno28Normal.ttf" fontSize:41.0f];
helloWorldButton = [CCButton buttonWithTitle:@"Restart"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
back1Button = [CCButton buttonWithTitle:@"Main Menu"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
[hslabel setString:[NSString stringWithFormat:@"Highscore: %d", highScore]];
} label.positionType = CCPositionTypeNormalized;
label.outlineWidth = 3;
label.outlineColor = [CCColor blackColor];
label.color = [CCColor redColor];
label.position = ccp(0.5f, 0.7f);
[self addChild:label z:5];
label2.positionType = CCPositionTypeNormalized;
label2.outlineWidth = 1.2;
label2.outlineColor = [CCColor blackColor];
label2.color = [CCColor redColor];
label2.position = ccp(0.5f, 0.63f);
[self addChild:label2 z:5];
helloWorldButton.positionType = CCPositionTypeNormalized;
helloWorldButton.position = ccp(0.5f, 0.47f);
helloWorldButton.label.outlineWidth = 2;
helloWorldButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
helloWorldButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
helloWorldButton.exclusiveTouch = NO;
helloWorldButton.claimsUserInteraction = NO;
[helloWorldButton setTarget:self
selector:@selector(onSpinningClicked:)];
[self addChild:helloWorldButton z:5];
back1Button.positionType = CCPositionTypeNormalized;
back1Button.position = ccp(0.5f, 0.33f);
back1Button.exclusiveTouch = NO;
back1Button.label.outlineWidth = 2;
back1Button.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
back1Button.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
back1Button.claimsUserInteraction = NO;
[back1Button setTarget:self selector:@selector(onBackClicked:)];
[self addChild:back1Button z:5]; }
return YES; }
- (void) nxtexp { paused=false;
invul=false;
timescale -= 20.0;
[self removeChild:pLabel1];
[self removeChild:veil];
[self addChild:pauseButton]; }
- (BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair
speedCollision:(CCNode *)speed playerCollision:(CCNode *)player {
return YES; }
38
- (void) bktonorm { timescale -= 0.5;
[danger removeFromParent];
[dngr removeFromParent]; }
- (void) losegame { if (alive) { alive = false;
[_player removeFromParent];
[_player2 removeFromParent];
veil = [CCSprite spriteWithImageNamed:@"pausemenu.png"];
veil.position =
ccp(self.contentSize.width/2,self.contentSize.height/2);
[self addChild:veil z:5];
int highScore;
highScore = [[defaults valueForKey:@"SavedHighScore"] intValue];
if (score > highScore) {
[defaults setObject:[NSNumber numberWithInt:score] forKey:@"SavedHighScore"];
[defaults synchronize];
highScore = score; [self newhi]; }
hslabel = [CCLabelTTF labelWithString:@"" fontName:@"Techno28Normal.ttf"
fontSize:68.0f];
hslabel.positionType = CCPositionTypeNormalized;
hslabel.outlineWidth = 3;
hslabel.outlineColor = [CCColor blackColor];
hslabel.color = [CCColor redColor];
hslabel.position = ccp(0.5f, 0.15f);
[self addChild:hslabel z:5];
if ([languageCode isEqualToString:@"ru"])
{ label = [CCLabelTTF labelWithString:@"Игра окончена!"
fontName:@"Techno28Normal.ttf" fontSize:76.0f];
helloWorldButton = [CCButton buttonWithTitle:@"Рестарт"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
back1Button = [CCButton buttonWithTitle:@"Главное меню"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
[hslabel setString:[NSString stringWithFormat:@"Рекорд: %d", highScore]];
} else { label = [CCLabelTTF labelWithString:@"Game over!"
fontName:@"Techno28Normal.ttf" fontSize:76.0f];
helloWorldButton = [CCButton buttonWithTitle:@"Restart"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
back1Button = [CCButton buttonWithTitle:@"Main Menu"
fontName:@"Techno28Normal.ttf" fontSize:58.0f];
[hslabel setString:[NSString stringWithFormat:@"Highscore: %d", highScore]];
} label.positionType = CCPositionTypeNormalized;
label.outlineWidth = 3;
label.outlineColor = [CCColor blackColor];
label.color = [CCColor redColor];
label.position = ccp(0.5f, 0.7f);
[self addChild:label z:5];
helloWorldButton.positionType = CCPositionTypeNormalized;
helloWorldButton.position = ccp(0.5f, 0.51f);
helloWorldButton.label.outlineWidth = 2;
helloWorldButton.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
helloWorldButton.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
helloWorldButton.exclusiveTouch = NO;
helloWorldButton.claimsUserInteraction = NO;
[helloWorldButton setTarget:self selector:@selector(onSpinningClicked:)];
[self addChild:helloWorldButton z:5];
back1Button.positionType = CCPositionTypeNormalized;
back1Button.position = ccp(0.5f, 0.33f);
back1Button.label.outlineWidth = 2;
back1Button.label.outlineColor = [CCColor colorWithRed:0.0 green:0.68
blue:0.93];
back1Button.color = [CCColor colorWithRed:0.52 green:0.85 blue:0.97];
back1Button.exclusiveTouch = NO;
back1Button.claimsUserInteraction = NO;
[back1Button setTarget:self selector:@selector(onBackClicked:)];
[self addChild:back1Button z:5]; }}
- (void) newhi {
CCSprite *hsplate = [CCSprite spriteWithImageNamed:@"new_highscore.png"];
hsplate.positionType = CCPositionTypeNormalized;
hsplate.position = ccp(0.77f, 0.5f);
[self addChild:hsplate z:6];
39
if ([languageCode isEqualToString:@"ru"])
{ new = [CCLabelTTF labelWithString:@"Новый" fontName:@"Techno28Normal.ttf"
fontSize:38.0f];
new2 = [CCLabelTTF labelWithString:@"рекорд!"
fontName:@"Techno28Normal.ttf" fontSize:38.0f]; } else {
new = [CCLabelTTF labelWithString:@"New" fontName:@"Techno28Normal.ttf"
fontSize:38.0f];
new2 = [CCLabelTTF labelWithString:@"highscore!"
fontName:@"Techno28Normal.ttf" fontSize:38.0f]; }
new.positionType = CCPositionTypeNormalized;
new.outlineWidth = 1.2;
new.outlineColor = [CCColor blackColor];
new.color = [CCColor redColor];
new.position = ccp(0.77f, 0.525f);
[self addChild:new z:7];
new2.positionType = CCPositionTypeNormalized;
new2.outlineWidth = 1.2;
new2.outlineColor = [CCColor blackColor];
new2.color = [CCColor redColor];
new2.position = ccp(0.77f, 0.475f);
[self addChild:new2 z:7];
[self scheduleOnce:@selector(fl1) delay:0.7]; }
- (void) fl1 { [new removeFromParent];
[new2 removeFromParent];
[self scheduleOnce:@selector(fl2) delay:0.7]; }
- (void) fl2 { [self addChild:new z:7];
[self addChild:new2 z:7];
[self scheduleOnce:@selector(fl1) delay:0.7]; }
@end
40
Download