Mario - персонаж игр, ставший популярным на долгие годы. Сейчас каждый желающий может играть в Марио онлайн. Представлено большое количество бесплатных игр, которые можно проходить без скачивания на компьютер. Прямо в браузере управляйте легендарным персонажам, сражайтесь с врагами, выполняйте сложные уровни и просто получайте удовольствие. Здесь собраны старые и новые игры, они позволят оживить воспоминания, как на Денди. Среди всего списка есть классическая версия, способная порадовать многих! Советуем играть на весь экран, геймплей смотрится ощутимо лучше.
Хорошо известный герой, который существует много лет. Каждый проходил игры с участием Марио, но насколько хорошо вы знаете этого персонажа? Предлагаем познакомиться с героем чуть ближе, чтобы понять смысл и идею его существования.
– один из самых известных персонажей компании Nintendo. За счёт невероятного успеха стал талисманов компании и смог появиться в сотнях разнообразных играх. Персонаж появился в своём нынешнем облике не сразу, он прошёл долгий путь развития. Всё началось с аркады под названием Donkey Kong, которая вышла в далёком 1981 году для автоматов. По сюжету игры главный герой по имени Прыгун должен пройти сложные испытания и спасти возлюбленную девушку. На тот момент Прыгун являлся плотником и не имел богатой предыстории, но развитие продолжалось. В дальнейших новинках Марио получил своё нынешнее имя и стал сантехником. Внешний вид немного изменился, теперь на голове красная кепка, а на теле специальный комбинезон. По мере развития компьютерных технологий разработчики улучшали внешний вид героя, добавляя новые уникальные черты. На сегодняшний день каждый человек сформировал в голове образ персонажа и знает, как тот выглядит.
Первый эпизод игры на сегодняшний день мало кто помнит. Главным злодеем была огромная горилла Данки Конг, которая смогла взять в плен Марио и его любимую девушку Полину. Главный герой должен был преодолеть многочисленные преграды, справиться со всеми испытаниями и спасти возлюбленную. При успешном выполнении заданий Марио побеждает Конга и сажает его в клетку, но сын гориллы продолжает сражаться. В итоге сын спасается и отправляется на остров обезьян. На этом первый эпизод заканчивался.
В дальнейших играх Марио и его брат Луиджи ремонтируют трубопровод, постоянно сражаются со странными существами и случайно попадают в знаменитое Грибное королевство. Главным злодеем становится некий Боузер, который постоянно похищает милую принцессу. С этими частями игры большинство людей прекрасно знакомы. Разработчики продолжают работу над улучшением серии, постоянно выходят интересные новинки, где персонаж отправляется в очередные приключения.
Маленький герой, который кажется совсем безобидным, обладает уникальными талантами. Многие навыки были продемонстрированы в разных частях игр. К примеру, в одном эпизоде герой смог запросто поднять целый замок. В другом эпизоде отважный сантехник хватает за хвост огромного врага, крутит его с невероятной скоростью и потом кидает на землю. Изначально Марио известен под именем Прыгун, поэтому особенность успешно перешла к нынешнему герою. Персонаж способен прыгать на огромную высоту, падения практически не страшны. Аналогичными талантами обладает только его брат, способный иногда прыгать ещё выше. В определённых условиях Марио способен управлять огнём, он ловко кидается огненными шарами во врагов и уничтожает их. Таланты настолько разнообразны, что в будущем можно ожидать чего-то нового более необычного.
Верным другом Марио является его брат Луиджи, который всегда придёт на помощь в трудный момент. Этого персонажа все прекрасно знают по многочисленным играм. Знаменитая принцесса Персик – возлюбленная главного героя, которая зачастую попадает в беду и нуждается в помощи. Марио с детства знаком с принцессой, они симпатизируют друг другу и между ними есть определённые романтические отношения. Например, после спасения Персик всегда награждает Марио нежным поцелуем в щёку. В играх есть менее известные персонажи: Тод, Розалина и Йоши. Они всегда на стороне добра и рады помочь главному герою в его приключениях.
Заклятым врагом Марио и всего королевства является Боузер. Это некий монстр, который напоминает огромную черепаху с шипастым панцирем. Боузер постоянно предпринимает попытки захватить власть во всём Грибном королевстве, но на его пути всегда стоит отважный сантехник, готовый в любую минуту отправиться на спасение всего мира. Это вечное противостояние добра и зла. Существует менее опасный враг по имени Варио. Этот герой настоящий бизнесмен и всегда соперничает с Марио. В определённых ситуациях два персонажа объединяются против общего врага, чтобы одержать победу. Такие сцены обычно небольшие, но весьма приятные.
Игры с популярным героем являются самыми продаваемыми во всём мире. Это интересный факт, что даже современные новинки в шикарной графике и со сложной сюжетной линией не могут обогнать простого сантехника. За всё время существования Марио вышло около 200 игр. Большинство действий разворачивается по определённому сюжету, где надо спасти принцессу и победить всех врагов или же остановить злодея Боузера. Многие люди прекрасно помнят одни из первых игр про Марио, которые были на 8-им битных приставках Денди. На сегодняшний день технологии шагнули далеко и вперёд и приставки ушли в прошлое, их больше не найти в продаже. Популярный герой успешно смог перебраться на современные компьютеры, благодаря усердиям разработчиков. Популярность продолжает расти, а значит выходят интересные новинки и любительские версии. Сейчас вы можете запросто поиграть в Марио онлайн в окне браузера. Удобные флеш игры позволяют проходить любимые игрушки без скачивания файлов на компьютер.
Внешний облик персонажа всем хорошо знаком. Приблизительно его можно описать так: полноватый мужчина небольшого роста, работающий сантехником. Он всегда в привычной одежде: синий комбинезон, из под которого видна красная рубашка, а на груди всегда две большие золотые пуговицы. На голове надета красная кепка с буквой М, в честь имени героя. Марио всегда носит усы, которые у многих ассоциируются с сантехниками. Вся экипировка героя со временем получила практическое применение. Например, кепка является важным защитным предметов. Если герой её теряет, то получает больше урона от врагов и прочих действий. Начальный облик персонажа был достаточно примитивным, это объяснялось ограниченными компьютерными ресурсами. Для прорисовки использовалось сильно ограниченное число пикселей, но развитие компьютеров позволило создать полноценный облик, где видна каждая мелочь.
С характером Марио дела обстоят более неопределённо. Разработчики решили не углубляться в моральные принципы, не наделять героя какими-то сложными чертами характера. Каждый человек сам создаёт и додумывает образ. По сериям игр можно определённо сказать, что Марио отважный сантехник, который постоянно сражается на стороне добра. Его чувство справедливости толкает его на опасные действия, он готов помогать друзьям и рисковать ради них жизнью. Скорее всего, за счёт таких положительных характеристик герой стал настолько популярным.
На этой странице мы предлагаем вам лучше познакомиться с серией игр про Марио. Тут представлены различные жанры, среди которых можно найти привычные аркады и гонки, но есть необычные головоломки и драки. Добавлена классическая старая версия игры Super Mario Bros. Crossover, которую многие полюбили на приставках Денди. Играть можно в онлайне бесплатно, все флеш приложения доступны без регистрации.
Описание флеш игры
Хотите создать свою игру по вселенной всеми любимой игры Марио ? Тогда давайте приступим. Это полноценный игровой редактор, который позволит создать свой набор уровней, сюжетную ленту, а также заключительную битву с любым боссом. Иными словами, создать полностью свою игру. Для начала придумайте сюжет. Например, Марио снова отправляется в путешествие за приключениями. Раскрасьте игровые локации, как вам угодно. Это могут быть леса, пустыни, тропические деревни и поля. Главное, что они были красочные и интересные. Затем проработайте игровую карту. Добавьте побольше препятствий и игровых объектов, чтобы было интереснее играть . Не забывайте о врагах. Их тоже нужно расположить на карте, чтобы игра не была такая легкая, чем выше уровень – тем мощнее враги. Определите, какое количество очков, будет получать персонаж за убийство определенного монстра. Ещё немного и игра будет готова. Теперь перейдем к самому главному – боссу. Он должен быть очень мощный, чтобы игрок изрядно потрудился, чтобы его победить. Можете оснастить его оружием, или дополнительными умениями. Рядом с ним, поставьте несколько предметов, которые можно использовать в битве, например, камни или горящие факелы. В такую игру, будет очень интересно сыграть многим любителям Марио!
Описание флеш игры
Супер-Марио любимая игра многих игроков. Ведь она создана ещё очень-очень давно. Её проходили уже большое количество раз, и она остается одной из самых любимых и популярных игр на игровую приставку Денди. Впоследствии было выпущено очень много игр про Марио , самых разных. Но сегодня, у вас есть возможность поиграть в продолжение культовой серии. Теперь у Марио есть новые уровни, которые срочно требуют вашего прохождения. Зайдя в игру, вы увидите родного и знакомого персонажа, который ждал, чтобы вы вернулись в игру уже давно. В мире Марио, тоже всё осталось по старому, разные существа желают ему смерти, но он не сдается и продвигается вперед, собирая при этом золотые монетки. На уровнях присутствует очень много опасных мест, где можно потерять жизнь и начать сначала, поэтому проходите их с особой аккуратностью. Новые уровни такие же интересные, как и старые, ведь рассказывают продолжение истории. Пройдя их, вы узнаете, что же случилось с персонажем и его друзьями, после событий в первой части игры. Уже интересно? Тогда бегом играть! И помогать любимому персонажу справится с армией вражеских гуманоидов.
Для начала скачайте стартовый проект для этого туториала. Распакуйте его, откройте в Xcode, запустите. На экране эмулятора должно появится нечто подобное:Все правильно - просто скучный пустой экран! :] Мы полностью его заполним по мере прохождения туториала
В стартовый проект уже добавлены все необходимые картинки и звуки. Пробежимся по содержимому проекта:
Если вы посмотрите на боковую панель, вы увидите, что у нас есть три разных слоя:
@interface GameLevelLayer() {
CCTMXTiledMap *map;
}
@end
Мы добавили локальную переменную map класса CCTMXTiledMap для работы с ячеистыми картами в наш головной класс.
Далее мы поместим ячеистую карту на наш слой прямо во время инициализации слоя. Добавим следующее в метод init:
CCLayerColor *blueSky = [ initWithColor:ccc4(100, 100, 250, 255)];
;
map = [ initWithTMXFile:@"level1.tmx"];
;
Во-первых, мы добавили задник (CCLayerColor) цвета синего неба. Следующие две строки кода это просто подгрузка переменной map (CCTMXTiledMap) и добавление ее на слой.
#import "Player.h"
Все еще в GameLevelLayer.m
добавим следующую локальную переменную в секцию @ interface:
Player = [ initWithFile:@"koalio_stand.png"];
player.position = ccp(100, 50);
;
Этот код загружает спрайт-объект Коалы, задает ему позицию и добавляет его на объект нашей карты.
Вы спросите, зачем добавлять объект коалы на карту, вместо того, чтобы просто добавить его напрямую на слой? Все просто. Мы хотим непосредственно контролировать какой слой будет перед Коалой, а какой за ней. Так что мы делаем Коалу ребенком карты, а не главного слоя. Мы хотим, чтобы Коала была спереди, так что даем ей Z-порядок, равный 15. Так же, когда мы прокручиваем карту, Коала все еще находится на той же позиции, относительно карты, а не главного слоя.
Отлично, давайте попробуем! Запустите ваш проект и вы должны увидеть следующее:
Выглядит как игра, но Коалио игнорирует гравитацию! Пришло время опустить его с небес на землю - при помощи физического движка:]
;
Далее добавьте новый метод в класс:
- (void)update:(ccTime)dt {
;
}
Далее откройте Player.h
и измените его, чтобы он выглядил так:
#import
Добавьте следующий код в Player.m
:
Нажми меня
#import "Player.h" @implementation Player @synthesize velocity = _velocity; // 1 - (id)initWithFile:(NSString *)filename { if (self = ) { self.velocity = ccp(0.0, 0.0); } return self; } - (void)update:(ccTime)dt { // 2 CGPoint gravity = ccp(0.0, -450.0); // 3 CGPoint gravityStep = ccpMult(gravity, dt); // 4 self.velocity = ccpAdd(self.velocity, gravityStep); CGPoint stepVelocity = ccpMult(self.velocity, dt); // 5 self.position = ccpAdd(self.position, stepVelocity); } @end
Уууууупс - Коалио падает сквозь пол! Давайте это починим.
-(CGRect)collisionBoundingBox;
И добавьте в Player.m
:
- (CGRect)collisionBoundingBox {
return CGRectInset(self.boundingBox, 2, 0);
}
CGRectInset сжимает CGRect на количество пикселов из второго и третьего аргументов. В нашем случае, ширина нашей рамки столкновений будет на шесть пикселов меньше - три пиксела с каждой стороны.
- (CGPoint)tileCoordForPosition:(CGPoint)position {
float x = floor(position.x / map.tileSize.width);
float levelHeightInPixels = map.mapSize.height * map.tileSize.height;
float y = floor((levelHeightInPixels - position.y) / map.tileSize.height);
return ccp(x, y);
}
- (CGRect)tileRectFromTileCoords:(CGPoint)tileCoords {
float levelHeightInPixels = map.mapSize.height * map.tileSize.height;
CGPoint origin = ccp(tileCoords.x * map.tileSize.width, levelHeightInPixels - ((tileCoords.y + 1) * map.tileSize.height));
return CGRectMake(origin.x, origin.y, map.tileSize.width, map.tileSize.height);
}
Первый метод возвращает нам координаты ячейки, находящейся на координатах в пикселях, которые мы передаем в метод. Чтобы получить позицию ячейки, мы просто делим координаты на размер ячеек.
Нам нужно инвертировать координаты высоты, так как координаты системы Cocos2D/OpenGL начинаются с левого нижнего угла, а системные координаты начинаются с левого верхнего угла. Стандарты - ну разве это не круто?
Второй метод делает все наоборот. Он умножает координату ячейки на размер ячеек и вовзращает CGRect данной ячейки. Опять же, нам нужно развернуть высоту.
Зачем нам добавлять единицу к y-координате высоты? Запомните, координаты ячеек начинаются с нуля, так 20 ячейка имеет реальную координату 19. Если мы не добавим единицу к высоте, точка будет 19 * tileHeight.
Нажми меня
- (NSArray *)getSurroundingTilesAtPosition:(CGPoint)position forLayer:(CCTMXLayer *)layer { CGPoint plPos = ; //1 NSMutableArray *gids = ; //2 for (int i = 0; i < 9; i++) { //3 int c = i % 3; int r = (int)(i / 3); CGPoint tilePos = ccp(plPos.x + (c - 1), plPos.y + (r - 1)); int tgid = ; //4 CGRect tileRect = ; //5 NSDictionary *tileDict = , @"gid", , @"x", , @"y", ,@"tilePos", nil]; ; } ; atIndex:6]; ; ; ; //6 for (NSDictionary *d in gids) { NSLog(@"%@", d); } //7 return (NSArray *)gids; }
1.
Для начала мы получаем координаты ячейки для ввода (которыми и будут координаты Коалы).
2.
Далее, мы создаем новый массив, который будет возвращать информацию о ячейке.
3.
Далее, мы запускаем цикл 9 раз - так как у нас есть 9 возможных ячеек перемещения, включая ячейку, в которой коала уже находится. Следующие несколько строк определяют позиции девяти ячеек и сохраняют из в переменной tilePos.
Обратите внимание: нам нужна информация только о восьми ячейках, так как нам никогда не придется определять столкновения с ячейкой, на которой коала уже находится.
Мы всегда должны ловить этот случай и перемещать Коалу в одну из ячеек вокруг. Если Коалио находится внутри твердой ячейки, значит больше половины спрайта Коалио вошло внутрь. Он не должен двигаться так быстро - как минимум, в этой игре!
Чтобы легче оперировать над этими восьми ячейками, просто добавим ячейку Коалио по началу, а в конце ее удалим.
7. Цикл в секции семь позволяет нам следить за ячейками в реальном времени. Так, мы можем точно знать, что все идет по плану.
Мы почти готовы к следующему запуску нашей игры! Однако все еще нужно сделать пару вещиц. Нам нужно добавить слой walls как переменную в класс GameLevelLayer так, чтобы мы смогли ее использовать.
Внутри GameLevelLayer.m осуществите следующие изменения:
// Добавить в @interface
CCTMXLayer *walls;
// Добавить в метод init, после того, как на слой добавляется карта
walls = ;
// добавить в метод update
;
Запускайте! Но, к сожалению, игра крашится. Мы видим в консоли нечто следующее:
Сначала мы получаем информацию о позициях ячеек и значения GID (хотя в основном нули, так как сверху пустая местность).
В конце, все крашится с ошибкой «TMXLayer: invalid position». Такое происходит, когда в метод tileGIDat: передается позиция, которая находится вне краев карты.
Мы избежим этой ошибки чуть позже - но сначала, мы собираемся изменить существующее определение столкновений.
Если Коала будет самостоятельно обновлять свою позицию, то в конце концов она начнет скакать как бешеная! А мы же этого не хотим, нет?
Так что Коала требует дополнительной переменной desiredPosition, при помощи которой она будет взаимодействовать с GameLevelLayer.
Мы хотим, чтобы класс Коалы самостоятельно высчитывал свою следующую позцию. Но GameLevelLayer должен перемещать Коалу в желаемую позицию только после проверки ее на валидность. То же самое применимо и к циклу определения столкновений - мы не хотим обновлять реальный спрайт до того, как все ячейки были проверены на предмет столкновений.
Нам нужно поменять несколько вещей. Сначала, добавьте следующее в Player.h
@property (nonatomic, assign) CGPoint desiredPosition;
И синтезируйте добавленное в Player.m
:
@synthesize desiredPosition = _desiredPosition;
Теперь, измените метод collisionBoundingBox
в Player.m
, чтобы он выглядел так:
- (CGRect)collisionBoundingBox {
CGRect collisionBox = CGRectInset(self.boundingBox, 3, 0);
CGPoint diff = ccpSub(self.desiredPosition, self.position);
CGRect returnBoundingBox = CGRectOffset(collisionBox, diff.x, diff.y);
return returnBoundingBox;
}
Этот кусок кода вычисляет рамку, основываясь на желаемой позиции, которую GameLevelLayer будет использовать для определения столкновений.
Обратите внимание: Есть множество различных способов вычисления рамок столкновений. Вы можете написать код, похожий на тот, что уже имеется в классе CCNode, но наш нынешний способ гораздо проще, несмотря на некоторую неочевидность.Далее, осуществите следующие изменения в методе update так, чтобы он обновлял desiredPosition заместо текущей позиции:
// Замените "self.position = ccpAdd(self.position, stepVelocity);" на: self.desiredPosition = ccpAdd(self.position, stepVelocity);
Нажми меня
- (void)checkForAndResolveCollisions:(Player *)p { NSArray *tiles = ; //1 for (NSDictionary *dic in tiles) { CGRect pRect = ; //2 int gid = [ intValue]; //3 if (gid) { CGRect tileRect = CGRectMake([ floatValue], [ floatValue], map.tileSize.width, map.tileSize.height); //4 if (CGRectIntersectsRect(pRect, tileRect)) { CGRect intersection = CGRectIntersection(pRect, tileRect); //5 int tileIndx = ; //6 if (tileIndx == 0) { //Ячейка прямо под Коалой p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y + intersection.size.height); } else if (tileIndx == 1) { //Ячейка прямо над Коалой p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y - intersection.size.height); } else if (tileIndx == 2) { //Ячейка слева от Коалы p.desiredPosition = ccp(p.desiredPosition.x + intersection.size.width, p.desiredPosition.y); } else if (tileIndx == 3) { //Ячейка справа от Коалы p.desiredPosition = ccp(p.desiredPosition.x - intersection.size.width, p.desiredPosition.y); } else { if (intersection.size.width > intersection.size.height) { //7 //Ячейка диагональна, но решаем проблему вертикально float intersectionHeight; if (tileIndx > 5) { intersectionHeight = intersection.size.height; } else { intersectionHeight = -intersection.size.height; } p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y + intersection.size.height); } else { //Ячейка диагональна, но решаем проблему горизонтально float resolutionWidth; if (tileIndx == 6 || tileIndx == 4) { resolutionWidth = intersection.size.width; } else { resolutionWidth = -intersection.size.width; } p.desiredPosition = ccp(p.desiredPosition.x , p.desiredPosition.y + resolutionWidth); } } } } } p.position = p.desiredPosition; //7 }
1.
Сначала мы получаем набор ячеек, окружающих Коалу. Далее мы проходимся циклом по каждой ячейке из этого набора. Каждый раз, когда мы проходимся по ячейке, мы проверяем ее на предмет столкновений. Если произошло столкновение, мы меняем desiredPosition у Коалы.
2.
Внутри каждой петли цикла, мы сначала получаем текущую рамку Коалы. Каждый раз, когда определяется столкновение, переменная desiredPosition меняет свое значение на такое, при котором столкновения больше не происходит.
3.
Следующий шаг это получение GID, который мы хранили в NSDictionary, который может являться нулем. Если GID равен нулю, то текущая петля завершается и мы переходим к следующей ячейке.
4.
Если в новой позиции находится ячейка, нам нужно получить ее CGRect. В ней может быть, а может и не быть столкновения. Мы осуществляем этот процесс при помощи следующей строчки кода и сохраняем в переменную tileRect. Теперь, имея CGRect Коалы и ячейки, мы можем проверить их на предмет столкновения.
5.
Чтобы проверить ячейки на предмет столкновения, мы запускаем CGRectIntersectsRect. Если произошло столкновение, то мы получим CGRect, описывающий CGRect пересечения при помощи функции CGRectIntersection().
6.
Шестая секция позволяет нам получить индекс текущей ячейки. Мы используем индекс ячейки чтобы получать позицию ячейки. Мы собираемся оперировать над прилегающими ячейками индивидуально, смещая Коалу, вычитая или добавляя длину или высоту столкновения. Довольно просто. Однако как только дело доходит до диагональных ячеек, мы собираемся применять алгоритм, описаный в предыдущей секции.
7.
В седьмой секции мы определяем, какая наша область столкновения: широкая или вытянутая вверх? Если широкая - работаем вертикально. Если индекс ячейки больше 5, то двигаем Коалу вверх. Если область вытянута вверх - работаем горизонтально. Действуем по похожему принципу порядка индексов ячейки. В конце мы присваиваем Коале полученую позицию.
Этот метод - мозг нашей системы определения столкновений.
Давайте используем все имеющиеся знания на практике! Измените метод update (все еще в GameLevelLayer: )
// Замените ";" на:
;
Также вы можете удалить или закомментировать блок getSurroundingTilesAtPosition:forLayer:
/*
for (NSDictionary *d in gids) {
NSLog(@"%@", d);
} //8 */
Запускаем! Удивлены результатом?
Пол останавливает Коалио, но тот тут же в него утопает! Почему?
Можете догадаться, что мы упустили? Помните - каждый шаг игры мы добавляем силу гравитации к скорости Коалы. Это обозначает, что Коала постоянно ускоряется вниз.
Мы постоянно добавляем скорость к траектории Коалы вниз, пока она не становится размером с ячейку - мы перемещаемся сквозь целую ячейку за один шаг, что и вызывает проблемы (помните, мы недавно об этом говорили).
Как только мы засекаем столкновение, нам нужно обнулять скорость коалы в направлении ячейки, с которой столкнулись! Коала перестала двигаться, так что и скорость должна с ней считаться.
Если мы этого не осуществим, то у нас будет довольно странное поведение игры. Как мы уже заметили ранее, нам нужен способ определять, касается ли Коала земли, чтобы Коала не смогла прыгать еще выше. Мы выставим этот флажок прямо сейчас. Добавьте следующие строки в checkForAndResolveCollisions:
Нажми меня
- (void)checkForAndResolveCollisions:(Player *)p { NSArray *tiles = ; //1 p.onGround = NO; //////Здесь for (NSDictionary *dic in tiles) { CGRect pRect = ; //3 int gid = [ intValue]; //4 if (gid) { CGRect tileRect = CGRectMake([ floatValue], [ floatValue], map.tileSize.width, map.tileSize.height); //5 if (CGRectIntersectsRect(pRect, tileRect)) { CGRect intersection = CGRectIntersection(pRect, tileRect); int tileIndx = ; if (tileIndx == 0) { //ячейка под Коалой p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y + intersection.size.height); p.velocity = ccp(p.velocity.x, 0.0); //////Здесь p.onGround = YES; //////Здесь } else if (tileIndx == 1) { //ячейка над Коалой p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y - intersection.size.height); p.velocity = ccp(p.velocity.x, 0.0); //////Здесь } else if (tileIndx == 2) { //ячейка слева p.desiredPosition = ccp(p.desiredPosition.x + intersection.size.width, p.desiredPosition.y); } else if (tileIndx == 3) { //ячейка справа p.desiredPosition = ccp(p.desiredPosition.x - intersection.size.width, p.desiredPosition.y); } else { if (intersection.size.width > intersection.size.height) { //tile is diagonal, but resolving collision vertially p.velocity = ccp(p.velocity.x, 0.0); //////Здесь float resolutionHeight; if (tileIndx > 5) { resolutionHeight = intersection.size.height; p.onGround = YES; //////Здесь } else { resolutionHeight = -intersection.size.height; } p.desiredPosition = ccp(p.desiredPosition.x, p.desiredPosition.y + resolutionHeight); } else { float resolutionWidth; if (tileIndx == 6 || tileIndx == 4) { resolutionWidth = intersection.size.width; } else { resolutionWidth = -intersection.size.width; } p.desiredPosition = ccp(p.desiredPosition.x + resolutionWidth, p.desiredPosition.y); } } } } } p.position = p.desiredPosition; //8 }
@property (nonatomic, assign) BOOL onGround;
И в Player.m
:
@synthesize onGround = _onGround;
Запускаем! Все работает так, как и задумывалось? Да! О, этот великолепный день! Ура!
Флеш-игра Super Mario Flash – клон знаменитого Супер Марио. А если точнее, то разработчик вдохновлялся Super Mario Bros 3, которые вышли на Денди в 1988 году. Если у вас нет приставки и картриджа, нет эмулятора и необходимых знаний, как запустить эмулятор – не важно. Это бесплатная игра и она запускается прямо в браузере, если в нем включена поддержка Flash. Заходите с компьютеров и пробуйте.
Управление: в меню мышкой, затем клавиши со стрелками и пробел. Выберите 1 player, чтобы начать игру.
В игре можно играть за обоих братьев, Марио и Луиджи , как в оригинале. Между уровнями можно переходить по карте мира. А в конце надо спасти принцессу в битве с боссом по имени Боузер.
А ещё здесь есть редактор уровней , который можно сохранить как набор цифр. Эти уровни можно загрузить на сайт разработчика или, наоборот, взять оттуда новые уровни.
Это целый мир Марио - и встроенный редактор впридачу
Графика и многие объекты скопированы точно. Но все уровни сделаны заново, хотя и очень похожи на оригинальные. Если вы хотите, то можете достать в интернете экраны той самой игры и сделать полную копию в редакторе уровней. Мы тестировали – по ощущениям игрушка очень близко воспроизводит оригинал. Но это не абсолютно точная копия. Хотя так даже интереснее.
Зайдите на сайт разработчика этой флеш-игры сюда в раздел Level portal . Там лежат тысячи уровней, которые можно скопировать и вставить через буфер обмена.
Просто как обычный текст. Выбираете уровень, выделяете его текстовые исходники, копируете, переходите на игру, открываете редактор и вставляете текст.
В начале игры кликните мышкой Level Editor. Затем кликните на одном из персонажей – Луиджи или Марио. После этого выберите Load и вставьте код уровня, если он у вас есть.
Сохранять коды уровней тоже лучше отдельно в обычном текстовом файле на своем компе.
Вообще о том, как работать в редакторе, можно немного прочитать на странице второй игры - Супер Марио Флэш 2 . Там на русском. И кстати, возможностей там гораздо больше в самой игре.