Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 1815 сообщений
Cообщения с меткой

html5 - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

[Перевод] Autofill: чего не знают веб-разработчики, хотя должны знать

Четверг, 26 Мая 2016 г. 15:51 (ссылка)






Многим известно, что в мобильной версии Safari можно отсканировать свою банковскую карту. Но многие ли разработчики умеют создавать формы, поддерживающие эту возможность?



Готов поспорить, что немногие.



Дело осложняет полное отсутствие документации от Apple по работе этой функции. Но тут есть один момент. Функция сканирования банковских карт является подмножеством автозаполнения — браузерного функционала, давно игнорируемого веб-разработчиками. Понятно, почему они не уделяли ему должного внимания: когда регулярно заполняешь форму тестовыми данными, автозаполнение обычно мешает. Но для наших пользователей это важная функция. В Google выяснили, что при использовании автозаполнения пользователи на 30% быстрее заполняют формы. Так что давайте изучим работу автозаполнения, разберёмся, как создавать формы, поддерживающие кросс-браузерное автозаполнение, и воспользуемся преимуществами новых возможностей наподобие сканирования банковских карт.

Читать дальше →

https://habrahabr.ru/post/301840/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
hamaris

Pixie v1.4 - скрипт редактора изображений » Азбука Халявы - сайт о бесплатном

Воскресенье, 15 Мая 2016 г. 07:49 (ссылка)
azbukafree.ru/skripty/skrip...heniy.html


Pixie - скрипт редактора изображений. Он идеально подходит для интеграции в другие проекты или самостоятельного использования. В отличие от других аналогичных продуктов Pixie построен на HTML5 и

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест свежих материалов из мира фронтенда, дизайна и IT за последнюю неделю №210 (2 — 8 мая 2016)

Понедельник, 09 Мая 2016 г. 22:21 (ссылка)

Мы немного переименовались и предлагаем вашему вниманию очередную подборку с ссылками на полезные ресурсы и материалы из области фронтенда и дизайна




























Веб-разработка
CSS
Javascript
Браузеры
Дизайн
Занимательное

Веб-разработка



CSS





JavaScript





Браузеры





Дизайн





Подборка бесплатных дизайнерских печенек





Новости и занимательное





Просим прощения за возможные опечатки или неработающие/дублирующиеся ссылки. Если вы заметили проблему — напишите пожалуйста в личку, мы стараемся оперативно их исправлять.



Дайджест за прошлую неделю.

Материал подготовили dersmoll и alekskorovin.



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/283172/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №209 (25 апреля — 1 мая 2016)

Понедельник, 02 Мая 2016 г. 13:35 (ссылка)

Предлагаем вашему вниманию подборку с ссылками на полезные ресурсы, интересные материалы и IT-новости


























Веб-разработка
CSS
Javascript
Браузеры
Дизайн
Новости


Веб-разработка





CSS





JavaScript







Браузеры





Сайты с интересным дизайном и функциональностью





Дизайн





Подборка бесплатных дизайнерских печенек







Новости и Занимательное





Просим прощения за возможные опечатки или неработающие/дублирующиеся ссылки. Если вы заметили проблему — напишите пожалуйста в личку, мы стараемся оперативно их исправлять.



Дайджест за прошлую неделю.

Материал подготовили dersmoll и alekskorovin.



Original source: habrahabr.ru.

https://habrahabr.ru/post/282836/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №208 (18 — 24 апреля 2016)

Воскресенье, 24 Апреля 2016 г. 22:10 (ссылка)

Предлагаем вашему вниманию подборку с ссылками на полезные ресурсы, интересные материалы и IT-новости































Веб-разработка
CSS
Javascript
Браузеры
Дизайн
Новости
Занимательное

Веб-разработка





CSS





JavaScript





Браузеры





Дизайн





Новости и занимательное





Просим прощения за возможные опечатки или неработающие/дублирующиеся ссылки. Если вы заметили проблему — напишите пожалуйста в личку, мы стараемся оперативно их исправлять.



Дайджест за прошлую неделю.

Материал подготовили dersmoll и alekskorovin.



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/282325/

Комментарии (0)КомментироватьВ цитатник или сообщество
SoftLabirint

HTML5 и CSS3 с нуля до профи (2016) Видеокурс » SoftLabirint.Ru: Скачать бесплатно и без регистрации - Самые Популярные Новости Интернета

Суббота, 23 Апреля 2016 г. 20:49 (ссылка)
softlabirint.ru/video/video...okurs.html


HTML5 и CSS3 с нуля до профи (2016) Видеокурс

Без преувеличения на сегодняшний день это самый полный и актуальный курс в Рунете. Вдумайтесь сами: только лишь основной раздел курса (без учета бонусов) состоит из 47 подробнейших видеоуроков, образующих собой пошаговую практическую систему.

После изучения этой системы вы освоите полностью адаптивную верстку с использованием последних новшеств этих двух языков гипертекстовой разметки и каскадных таблиц стилей.

В нашем новом курсе ВСЕ макеты верстаются сразу АДАПТИВНЫМИ и КРОССБРАУЗЕРНЫМИ.

Изучение курса построено по принципу «от простого к сложному» и от «теории к практике».

Я не просто научу вас верстать простейшие веб-страницы, мы с вами очень подробно (вплоть до малейших деталей) проработаем верстку на примере трех различных по своей сложности наиболее популярных видов веб-сайтов в современном Интернете:

• сайта-визитки

• блога и...

• интернет-магазина



Содержание курса:



ПЕРВАЯ ЧАСТЬ

Верстка макета сайта-визитки

Урок 1. Введение. Настройка страницы

Урок 2. Определение разметки для страницы

Урок 3. Описание стилей шапки сайта

Урок 4. Описание стилей основного блока сайта. Часть1

Урок 5. Описание стилей основного блока сайта. Часть2. Заключение



ВТОРАЯ ЧАСТЬ

Верстка макета блога

Урок 1. Введение. Настройка страницы

Урок 2. Определение разметки шапки сайта

Урок 3. Подключение нестандартных шрифтов

Урок 4. Описание стилей шапки сайта

Урок 5. Описание разметки основного блока сайта

Урок 6. Описание разметки блока постов

Урок 7. Назначение стилей для блока постов

Урок 8. Описание разметки боковой колонки

Урок 9. Назначение стилей для боковой колонки

Урок 10. Описание разметки постраничной навигации

Урок 11. Назначение стилей для постраничной навигации

Урок 12. Верстка footer’а сайта

Урок 13. Доработка верстки макета

Урок 14. Адаптация верстки под мобильные устройства. Часть 1

Урок 15. Адаптация верстки под мобильные устройства. Часть 2

Урок 16. Добавление эффектов CSS3 на страницу. Часть 1

Урок 17. Добавление эффектов CSS3 на страницу. Часть 2



ТРЕТЬЯ ЧАСТЬ

Верстка макета интернет-магазина

Урок 1. Введение

Урок 2. Подключение нестандартного шрифта к странице

Урок 3. Определение разметки шапки сайта

Урок 4. Описание стилей шапки сайта. Часть 1

Урок 5. Описание стилей шапки сайта. Часть 2

Урок 6. Подключение слайдера к странице

Урок 7. Назначение стилей и настройка слайдера

Урок 8. Описание разметки блока новостей

Урок 9. Назначение стилей для блока новостей

Урок 10. Описание разметки блока «Популярные продукты»

Урок 11. Назначение стилей для блока «Популярные продукты». Часть 1

Урок 12. Назначение стилей для блока «Популярные продукты». Часть 2

Урок 13. Улучшение блока «Популярные продукты»

Урок 14. Описание разметки блока «О магазине»

Урок 15. Назначение стилей для блока «О магазине»

Урок 16. Описание разметки блока «Подписка»

Урок 17. Назначение стилей для блока «Подписка»

Урок 18. Описание разметки для footer’a

Урок 19. Назначение стилей для блока «footer»

Урок 20. Делаем макет адаптивным. Часть 1

Урок 21. Делаем макет адаптивным. Часть 2

Урок 22. Делаем макет адаптивным. Часть 3

Урок 23. Делаем макет адаптивным. Часть 4

Урок 24. Делаем макет адаптивным. Часть 5

Урок 25. Заключение



БОНУС 1

Премиум курс. Учебник по основам HTML

Урок 1. Введение. Основы HTML

Урок 2. Структура HTML документа

Урок 3. Теги форматирования текста

Урок 4. Изображения

Урок 5. Ссылки. Ссылки-изображения

Урок 6. Списки

Урок 7. Таблицы

Урок 8. Формы



БОНУС 2

Премиум курс. Учебник по основам CSS

Урок 1. Способы подключения

Урок 2. Назначения классов и id

Урок 3. Свойства шрифта

Урок 4. Свойства текста

Урок 5. Фон

Урок 6. Ширина, высота. Тег Div и Span

Урок 7. Рамка

Урок 8. Отступы

Урок 9. Основы CSS. Float, Clear, Display

Урок 10. Основы CSS. Свойство position



БОНУС 3

Премиум курс. Верстка сайтов для начинающих

Урок 1. Определение разметки

Урок 2. Описание разметки

Урок 3. CSS шапки сайта

Урок 4. CSS области контента

Урок 5. Доработка верстки



БОНУС 4

Премиум курс. HTML 5: основы

Урок 1. Структура документа HTML 5

Урок 2. Обзор тегов header и footer

Урок 3. Тег article

Урок 4. Тег section

Урок 5. Теги nav, main и aside

Урок 6. Теги figure и figcaption

Урок 7. Кроссбраузерное оформление

HTML 5 тегов

Урок 8. Тег input. Новые типы тега в html 5.

Часть 1

Урок 9. Тег input. Новые типы тега в html 5. Часть 2

Урок 10. HTML 5 video. Вставка видео на сайт

Урок 11. HTML 5 audio. Вставка аудио на сайт

Урок 12. HTML 5 canvas. Рисование в HTML 5

Урок 13. HTML 5 geolocation. Определение местоположения в HTML 5



БОНУС 5

Премиум курс по CSS3

Урок 1. Работа с фоном в CSS3

Урок 2. Тени и закругленные углы

Урок 3. Прозрачность фона, картинки, текста и цвета в CSS

Урок 4. Линейные градиенты CSS

Урок 5. Колонки

Урок 6. Радиальные градиенты

Урок 7. Шрифт

Урок 8. Работа с текстом в css 3

Урок 9. Псевдоклассы

Урок 10. Селекторы

Урок 11. Трансформация



БОНУС 6

Анатомия прибыльного лендинг пейдж

Урок 1. Анатомия прибыльного лендинг пейдж



БОНУС 7

Создание лендинг пейдж за один вечер

Урок 1. Введение

Урок 2. Подключаем нестандартный шрифт к странице

Урок 3. Определяем разметку шапки сайта

Урок 4. Описываем стили шапки сайта

Урок 5. Определяем разметку слайдера

Урок 6. Назначаем стили для слайдера

Урок 7. Верстаем блок "Особенности"

Урок 8. Верстаем блок "Галерея"

Урок 9. Определяем разметку блока видео

Урок 10. Описываем стили блока видео

Урок 11. Верстаем блок "Скачать приложение"

Урок 12. Просматриваем макет. Устраняем недочеты

Урок 13. Определяем разметку блока контактов

Урок 14. Описываем стили блока контактов

Урок 15. Верстаем футер

Урок 16. Адаптируем слайдер

Урок 17. Заключение

 








Информация о курсе:

Название: HTML5 и CSS3 с нуля до профи

Год выпуска: 2016

Автор: Андрей Бернацкий

Жанр: Обучающее видео

Выпущено: Россия

Продолжительность: 25:51:27



Файл

Формат: MP4

Качество: PCRec

Видео: AVC/H.264, 1024x768, ~283 - 681 Kbps

Аудио: AAC, 2 ch, 106 Kbps

Размер: 4,11 GB



Скачать: HTML5 и CSS3 с нуля до профи (2016) Видеокурс >>>



 



Подписка на новости сайта…

http://feeds.feedburner.com/Soft-Labirint

http://feeds.feedburner.com/Soft-Labirint?format=xml

https://feedburner.google.com/fb/a/mailverify?uri=Soft-Labirint

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Основы разработки 3D-игр в Intel XDK на BabylonJS

Четверг, 21 Апреля 2016 г. 17:25 (ссылка)

И снова привет, Хабр! Сегодня поговорим о разработке 3D-игр на HTML5 в Intel XDK с использованием BabylonJS. Возможности Intel XDK позволят как создать игру, так и протестировать её во встроенном эмуляторе и на различных мобильных платформах, таких, как iOS, Android и Windows.





BabylonJS



BabylonJS – это 3D-фреймворк, основанный на JavaScript, предназначенный для разработки игр с использованием HTML5 и WebGL.



В приведённом здесь примере рассматривается то, с чего обычно начинается знакомство с любой средой разработки трёхмерных игр. Мы создадим куб и заставим его вращаться. Разобравшись с этим материалом, вы узнаете о создании и анимации объёмных игровых объектов с использованием таких средств, как Mesh (сетка), Texture (текстура), Lighting (освещение), Camera (камера) и Animation (анимация). Всё это – понятия, универсальные для различных сред разработки 3D-игр. Они нашли отражение и в BabylonJS.



О структуре проекта



Обратите внимание на то, что для правильной работы этого примера нужно, чтобы в проекте присутствовали следующие файлы:




  1. babylon.2.3.js – это главный файл фреймворка, его надо загрузить отсюда и поместить в папку lib, которая находится в папке www проекта




  2. babylonjs.png – это может быть любое изображение, которое послужит текстурой для трёхмерного куба. Оно должно находиться в папке asset, которая так же расположена в папке www.



Проект создан с использованием шаблона Standard HTML5.





Структура проекта



Подключение библиотеки



BabylonJS можно загрузить с GitHub. Мы пользуемся Babylon.2.3.js. Этот файл нужно скачать и подключить к файлу Index.html, в котором имеется элемент HTML5 Canvas – цифровой холст, который предназначен для создания растровых изображений средствами JavaScript. Выглядеть это будет так:






   
   
   
   


   



В BabylonJS имеется объект engine, который позволяет создать игровую сцену (scene), добавить в игру 3D-объекты, камеру, освещение, текстуры и делать многое другое.



Объект Engine



Построение игровой логики начинается с создания объекта engine. При этом ему передаётся имеющийся в HTML5-документе элемент canvas.



var canvas = document.getElementById('gameCanvas');
var engine = new BABYLON.Engine(canvas, true);


После инициализации этого объекта можно создать объект Scene, а уже после этого – добавить в игру объекты Camera, Lighting, Mesh, Texture.



Объект Scene



Сцена – это площадка, на которой строится игра, с ней связаны остальные объекты. При её создании нужно передать в конструктор объект класса Engine.



var scene = new BABYLON.Scene(engine);


Объект Camera



Камера используется для того, чтобы отображать некоторую часть трёхмерного пространства, на которое она направлена. При создании соответствующего объекта ему передаётся ранее созданный объект Scene и задаются параметры, влияющие на то, что появится на экране.



var camera = new BABYLON.FreeCamera('camera1', new BABYLON.Vector3(0, 5,-10), scene);
camera.setTarget(BABYLON.Vector3.Zero());


Объект Lighting



Объект Lighting – это источник освещения для трёхмерной сцены. При его создании указываются параметры и уже знакомый нам объект Scene.



var light = new BABYLON.HemisphericLight('light1', new BABYLON.Vector3(0,1,0), scene);


Объект Mesh



Объект класса Mesh – это то, что позволяет задать форму трёхмерного объекта. В данном случае создаётся предопределённый объект – куб.



var box = new BABYLON.Mesh.CreateBox('box1', 2.0, scene);


Объект Texture



Объект Texture – это изображение, которое накладывается на трёхмерный объект.



var texture = new BABYLON.StandardMaterial("texture1", scene);
texture.bumpTexture = new BABYLON.Texture("asset/babylonjs.png", scene);
box.material = texture;


Объект Animation



Объект Animation позволяет настроить анимацию других объектов, в нашем случае – куба, на который наложена текстура.



var animationX = new BABYLON.Animation.CreateAndStartAnimation('boxrotate', box, 'rotation.x', 60, 360, 1, 10);
var animationY = new BABYLON.Animation.CreateAndStartAnimation('boxrotate', box, 'rotation.y', 60, 360, 1, 10);


Рендеринг сцены



Вышеприведённые команды позволили создать сцену. Теперь нужно вывести всё, что получилось на экран.



engine.runRenderLoop(function(){
      scene.render();
});


Запустим пример в эмуляторе Intel XDK:





Проект в эмуляторе Intel XDK



Полный код примера



Ниже приведён полный код рассматриваемого примера, который можно скопировать и вставить в файл Index.html:






   
   
   
   


   
   



Выводы



Только что состоялось ваше первое знакомство с BabylonJS. Для того, чтобы оценить возможности этого трёхмерного движка, загляните на его официальный сайт. Там можно найти множество демонстрационных примеров и дополнительных материалов по нему. И не забудьте о документации. Если вы решите создать собственную трёхмерную игру на BabylonJS, а мы надеемся, что так и будет, документация вам точно пригодится.



Читайте также про разработку HTML5-игр в Intel XDK в 7 частях:



Часть 1 » Часть 2 » Часть 3 » Часть 4 » Часть 5 » Часть 6 » Часть 7



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/282089/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Разработка HTML5-игр в Intel XDK. Часть 7. Оформление игры

Вторник, 19 Апреля 2016 г. 18:15 (ссылка)



Часть 1 » Часть 2 » Часть 3 » Часть 4 » Часть 5 » Часть 6 » Часть 7 // Конец )





В прошлый раз у нас получилась почти готовая игра. Теперь осталось лишь навести красоту. А именно: сделать систему подсчёта очков, экраны меню и завершения игры, поработать над сложностью. Всем этим сегодня и займёмся.





Система подсчёта очков



В этом проекте задействована простая система подсчёта очков. Каждый раз, когда змея съедает печенье, игрок получает одно очко. Помимо начисления очков, нужно отображать их на экране. Для того, чтобы это сделать, создадим слой ScoreLayer. В нём будет реализовано всё, что имеет отношение к игровым очкам.



1. Необязательный шаг. Создайте новый файл «score.js» и дополните соответствующим образом файл project.json.



"jsList" : [
   "src/resource.js",
   "src/biscuit.js",
   "src/score.js",
   "src/game.js"
]


2. Добавьте следующий код в файл score.js, или, если вы решили обойтись без него – в game.js.



var ScoreLayer = cc.Layer.extend({
   score: 0,
   labelScore: null,
   ctor: function() {
       /* Вызываем конструктор суперкласса */
       this._super();
       /* Инициализация */
       this.init();
   },
   init: function() {
       /* Создаём текст для вывода сведений об очках */
       this.labelScore = cc.LabelTTF.create("Score: 0");
       this.labelScore.setColor(cc.color(255, 255, 255, 255));
       this.labelScore.setPosition(cc.p(240, 700));
       this.addChild(this.labelScore);
       
   },
   scoreIncrease: function() {
       /* Увеличиваем набранные очки и обновляем текст */
       this.score += 1;
       this.labelScore.setString("Score: " + this.score);
   }
});


Слой этот устроен довольно просто. У него имеется спрайт, который отвечает за вывод сведений о набранных очках на экран, и метод, который увеличивает число набранных очков на единицу каждый раз, когда его вызывают. Теперь свяжем слой, ответственный за очки, с игрой.



1. Создайте экземпляр ScoreLayer в классе GameScene.



var GameScene = cc.Scene.extend({
   snake_layer: {},

score_layer: {},
   onEnter:function () {
       this._super();
       // Добавьте в код строку, расположенную ниже
       this.score_layer = new ScoreLayer();
       this.snake_layer = new SnakeLayer();
       // Добавьте в код строку, расположенную ниже
       this.addChild(this.score_layer, 1);
       this.addChild(this.snake_layer, 0);        
   }
});


2. Настройте SnakeLayer так, чтобы метод scoreIncrease вызывался каждый раз, когда змея съедает печенье. Для этого внесите следующие изменения в метод checkCollision, а именно – туда, где находится проверка на столкновение змеи с печеньем.



checkCollision: function() {
     ...  
     /* Проверка на столкновение с печеньем */
     if (head.x == this.biscuit.x && head.y == this.biscuit.y) {
           /* Увеличиваем число набранных очков */
           this.parent.score_layer.scoreIncrease();
           /* Обновляем позицию печенья */
           this.updateBiscuit();
           /* Увеличиваем длину змеи */
           this.addPart();
     }
     ...        
},


Мы получаем доступ к слою, ответственному за очки, через слой, на котором расположена змея, посредством общего родителя – GameScene, после чего вызываем метод scoreIncrease.



После того, как выполнены вышеописанные изменения игровой экран должен выглядеть так, как показано ниже.





Сведения о набранных очках на игровом экране



Теперь, как только змея съедает очередное печенье, увеличивается число набранных очков.



Экран меню



Займёмся экраном меню. Он будет не сложнее той конструкции, с помощью которой мы считали очки. Этот экран будет состоять из одной сцены, содержащей два спрайта. Один, заголовок, будет выводить название игры, второй, играющий роль подзаголовка, будет приглашать пользователя щёлкнуть мышью или коснуться экрана для продолжения.



1. Необязательный шаг. Создайте новый файл и назовите его «menu.js». Добавьте его в список файлов в project.json так, как показано ниже.



"jsList" : [
   "src/resource.js",
   "src/biscuit.js",
   "src/score.js",
   "src/menu.js",
   "src/game.js"
]


2. Добавьте следующий код в menu.js, или, если вы решили этот файл не создавать, в game.js.



var MenuScene = cc.Scene.extend({
   titleSprite: {},
   subTitleSprite: {},
   onEnter: function() {
       this._super();
       /* Получим размер окна */
       var winSize = cc.view.getDesignResolutionSize();
       
       /* Создадим заголовок */
       this.titleSprite = cc.LabelTTF.create("Snake.", "Arial", 50);
       this.titleSprite.x = winSize.width / 2;
       this.titleSprite.y = winSize.height / 2;
       this.addChild(this.titleSprite);
       
       /* Создаём подзаголовок */
       this.subTitleSprite = cc.LabelTTF.create("Click anywhere to play", "Arial", 20);
       this.subTitleSprite.x = winSize.width / 2;
       this.subTitleSprite.y = winSize.height / 2 - 80;
       this.addChild(this.subTitleSprite);
       
       /* Добавляем прослушиватель события касания для запуска игры */
       cc.eventManager.addListener({
           event: cc.EventListener.TOUCH_ONE_BY_ONE,
           onTouchBegan: function (touches, event) {                
               cc.director.runScene(new GameScene());          
           },
       }, this);
    
   },    
});


При входе в эту сцену мы создаём два текстовых спрайта и добавляем прослушиватель, который ожидает касания экрана (или другого события ввода) для начала игры, то есть – для запуска GameScene.



3. В файле main.js настройте управляющий объект так, чтобы он запускал сцену MenuScene вместо GameScene. Для этого отредактируйте нижеприведённую строку:



cc.director.runScene(new GameScene());


Она должна выглядеть так:



cc.director.runScene(new MenuScene());


Если запустить теперь игру в эмуляторе, то вместо игрового экрана появится экран меню.





Экран меню с предложением начать игру



Экран завершения игры



Последний экран, который мы собираемся создать – это тот, который пользователь видит после завершения игры. Он очень похож на экран главного меню. На нём будут три текстовых спрайта. Один будет содержать текст «Game Over». Второй – отображать набранные в текущем сеансе игры очки, а третий предложит сыграть снова.



1. Необязательный шаг. Создайте новый файл, «gameOver.js». Добавьте его описание в project.json:



"jsList" : [
   "src/resource.js",
   "src/biscuit.js",
   "src/score.js",
   "src/gameOver.js",
   "src/menu.js",
   "src/game.js"
]


2. Вставьте следующий код в файл gameOver.js, или, если на предыдущем шаге вы его не создавали – в game.js.



var GameOverScene = cc.Scene.extend({
   finalScore: 0,
   labelGameOver: {},
   labelScore: {},
   labelPrompt: {},
   ctor: function(score) {
       this._super();
       this.finalScore = score;
       
       /* Прослушиватель события касания, запускает экран меню */
       cc.eventManager.addListener({
           event: cc.EventListener.TOUCH_ONE_BY_ONE,
           onTouchBegan: function(touch, event) {
               cc.director.runScene(new MenuScene());
           }
       }, this);
       
   },
   onEnter: function() {
       this._super();
       /* размер окна */
       var winSize = cc.view.getDesignResolutionSize();
       
       /* Надписи для сцены GameOver */
       this.labelGameOver = new cc.LabelTTF("Game Over", "Arial", 60);    
       this.labelGameOver.x = winSize.width * 0.50;
       this.labelGameOver.y = winSize.height * 0.50;
       this.addChild(this.labelGameOver);
       
       /* Надпись, содержащая сведения о набранных очках */        
       this.labelScore = new cc.LabelTTF("Score: " + this.finalScore, "Arial", 30);
       this.labelScore.x = winSize.width * 0.50;
       this.labelScore.y = winSize.height * 0.43;
       this.addChild(this.labelScore);
       
       /* Предложение сыграть снова */
       this.labelPrompt = new cc.LabelTTF("Click or Tap To Try Again");
       this.labelPrompt.x = winSize.width * 0.50;
       this.labelPrompt.y = winSize.height * 0.39;
       this.addChild(this.labelPrompt);
   },
});


Обратите внимание на то, что в конструктор сцены передаётся параметр, содержащий сведения о набранных очках. Если этого не сделать, сцена не сможет правильно выполнять свои функции.



1. Добавьте обращение к управляющему объекту для того, чтобы запустить сцену GameOverScene, передав конструктору сведения о набранных очках. Сделать это нужно после того, как произойдёт столкновение головы змеи с одним из фрагментов её тела.



var SnakeLayer = cc.Layer.extend({
...
   checkCollision: function() {

...
       /* Проверка на столкновение с собственным фрагментом */
       for (var part = 1; part < body.length; part++) {
           if (head.x == body[part].x && head.y == body[part].y) {
               /* Запуск сцены GameOver */
               //this.snakeParts = null;
              // Добавьте эту строку ниже
               cc.director.runScene(
               new GameOverScene
                 (this.parent.score_layer.score)
               );
           }
       }    
       ...
   },

...
});


Теперь, в случае проигрыша, появится такой экран.





Экран завершения игры



Настройка сложности игры



И, наконец, нужно увеличивать сложность игры, основываясь на том, сколько очков набрал пользователь. Если змейка постоянно движется с одной и той же скоростью, играть в Snake довольно просто, а значит – скучно.



1. Добавьте в код SnakeLayer следующий метод.



updateDifficulty: function(curScore) {
var scoreToDiff = {};

/* Задаём уровни сложности путём настройки соответствия количества набранных очков и временного интервала, используемого для управления скоростью перемещения змеи */

scoreToDiff[0] = 0.15;
scoreToDiff[5] = 0.10;
scoreToDiff[15] = 0.05;
scoreToDiff[25] = 0.03;
scoreToDiff[35] = 0.01;

/* Обновляем интервал */

if (scoreToDiff[curScore] !== undefined) {
this.interval = scoreToDiff[curScore];
}        
},


2. Задайте вызов метода updateDifficulty в моменты, когда змея съедает печенье и при создании слоя SnakeLayer.



var SnakeLayer = cc.Layer.extend({
   ...
   ctor: function () {

 ...
       // Добавьте код ниже
       /* Инициализация подсистемы управления сложностью */
       this.updateDifficulty();
   },    
   ...
   checkCollision: function() {
       /* Проверяем столкновение с печеньем */
       if (head.x == this.biscuit.x && head.y == this.biscuit.y) {
           /* Увеличиваем очки */
           this.parent.score_layer.scoreIncrease();
           /* Обновляем позицию печенья */
           this.updateBiscuit();
           /* Увеличиваем длину змеи */
           this.addPart();
           // Добавьте код ниже
           /* Увеличим сложность, если набрано соответствующее следующему уровню сложности количество очков */
           this.updateDifficulty(this.parent.score_layer.score);
       }                
   },
   ...
});


Выводы



Итак, сегодня вы узнали:




  • Как создать экран меню.

  • Как создать экран завершения игры.

  • Как создать систему подсчёта очков.

  • Как настраивать сложность игры.



Игра готова! Примите поздравления с успешным освоением этого учебного руководства, и с тем, что вы создали свою первую HTML5-игру в Intel XDK! Испытайте игру, выясните, всё ли хорошо работает, измените её так, как вам захочется. А, если что-то в её функционировании вам всё ещё непонятно, разберитесь с этим.



Для того чтобы узнать подробности о том, как собрать дистрибутив игры для различных платформ, таких, как iOS, Android и Windows 8, загляните в документацию по Intel XDK.



Теперь – самое время заняться собственным проектом.





Часть 1 » Часть 2 » Часть 3 » Часть 4 » Часть 5 » Часть 6 » Часть 7 // Конец )



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/281981/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Разработка HTML5-игр в Intel XDK. Часть 6. Угощение для змеи и обработка столкновений

Понедельник, 18 Апреля 2016 г. 18:58 (ссылка)



Часть 1 » Часть 2 » Часть 3 » Часть 4 » Часть 5 » Часть 6



Сегодня добавим в игру кое-что вкусное для змеи и реализуем систему обработки столкновений.





Печенье



Печенье (biscuit) – это главная цель игры. Задача игрока заключается в том, чтобы, направляя змею, позволить ей съесть как можно больше подобных угощений. В нашей реализации печенье – это всегда один и тот же спрайт, предназначение которого заключается в том, чтобы появиться на экране, быть съеденным и появиться снова в другом месте.



То, как именно реализовано появление печенья в новой позиции, является одним из факторов, определяющих сложность игры. В нашем случае это – полностью случайный процесс. Создадим печенье.




  1. Необязательный шаг. Создайте новый файл – «biscuit.js» в папке src. Если вы это сделали – добавьте его в список в файле «project.json». Список должен выглядеть так, как показано ниже.



    "jsList" : [
       "src/resource.js",
       "src/biscuit.js",
       "src/game.js"
    ]





  2. Добавьте в biscuit.js нижеприведённый код для создания спрайта Biscuit. Если вы пропустили первый шаг, то разместите его в game.js



    var Biscuit = cc.Sprite.extend({
       winSize: 0,
       ctor: function(snakeParts) {
           /* Вызов метода суперкласса */        
           this._super(asset.SnakeBiscuit_png);          
           /* Настройка winSize */
           this.winSize = cc.view.getDesignResolutionSize();
           /* Установка позиции спрайта */
           this.randPosition(snakeParts);
       },    
    });


    Обратите внимание на то, что в конце конструктора вызывается метод randPosition(). При создании спрайт размещается на экране случайным образом.




  3. Добавьте реализацию метода randPosition.



    randPosition: function(snakeParts) {            
           var step = 20;
           var randNum = function(range) {
               /* Возвратим случайную позицию в пределах диапазона range */
               return Math.floor(Math.random() * range);        
           };
           /* Диапазон возможных координат, где может располагаться печенье */
           var range = {
               x: (this.winSize.width / step) - 1,
               y: (this.winSize.height / step) - 1             
           }                          
           /* Возможная позиция */
           var possible = {
                x: randNum(range.x) * step,
                y: randNum(range.y) * step
           }                        
           var flag = true;
           var hit = false;
           
           /* Если нужна дополнительная попытка */
           while (flag) {            
               /* Для каждого фрагмента змеи */
               for (var part = 0; part < snakeParts.length; part++) {
        /* Проверяем сгенерированные координаты на столкновение с любым фрагментом змеи */
    if (snakeParts[part].x == possible.x &&
       snakeParts[part].y == possible.y)
       {
                       /* Если столкновение произошло, установим переменную hit */
                       hit = true;
                   }
               }
               /* Если было обнаружено столкновение */
               if (hit == true) {                
                   /* Попытаемся снова */
                   possible.x = randNum(range.x) * step;
                   possible.y = randNum(range.y) * step;                
                   hit = false;
               } else { /* В противном случае */
                   /* Новая позиция найдена */
                   flag = false;
                   this.x = possible.x;
                   this.y = possible.y;
               }            
           }        
       },    



Первая часть метода довольно проста. Используя шаг, нацело делящий ширину и высоту (20), мы создали нечто вроде невидимой сетки, по которой движется змея, и в соответствии с которой выполняется размещение на игровом поле печенья. Игровой экран разбит на клетки размером 20х20 пикселей.



Объект range принимает количество этих клеток, поэтому у нас имеются сведения о максимальном количестве клеток по осям x и y. Причём, для того, чтобы печенье не перешло за край экрана, что не очень хорошо выглядит, уменьшено количество доступных клеток по ширине и высоте на единицу.



После того, как максимум известен, генерируется случайное число в доступном диапазоне и умножается на размер шага для того, чтобы определить координаты x и y клетки, в которую мы хотим переместить печенье.



Затем полученные координаты проверяются на предмет их совпадения с одним из фрагментов тела змеи. Делается это для того, чтобы печенье не появилось прямо на змее. Если оказалось так, что в предложенной позиции печенье пересечётся со змеёй – генерируются новые координаты и проверка проводится снова. Делается это до тех пор, пока не будет получена подходящая позиция, в которую и будет перемещён спрайт, символизирующий угощение.



Добавляем печенье на игровой экран



Код, реализующий печенье, готов. Осталось лишь добавить его на игровой экран.




  1. Добавьте новый член класса в слой SnakeLayer. Он будет хранить ссылку на объект Biscuit.



    biscuit: null, // ссылка на печенье



  2. Добавьте новый метод, updateBisquit, который предназначен для обновления состояния печенья.



    updateBiscuit: function() {
    /* Если печенье уже есть на игровом экране */
    if (this.biscuit) {
    /* Переместить его */
    this.biscuit.randPosition(this.snakeParts);        
    /* Если нет */
    } else {
    /* Создать новый спрайт */
    this.biscuit = new Biscuit(this.snakeParts);
    /* и добавить к сцене в качестве объекта-потомка */
    this.addChild(this.biscuit);
    }
    },



  3. Добавьте вызов updateBiscuit в метод ctor слоя SnakeLayer.



    ctor: function () {
    ...                
    /* Дополнение для работы с печеньем */
    this.updateBiscuit();
    ...
    },



  4. Запустите проект в эмуляторе и взгляните на печенье, которое управляемая игроком змея скоро сможет попробовать!





    Печенье и змея




Сейчас, даже если змею направить на печенье, съесть она его пока не может. Исправим это.



Обнаружение столкновений



Нам нужно разобраться с несколькими вопросами. Во-первых – с тем, что должно происходить, когда змея находит печенье. Во-вторых – с поведением игрового персонажа при достижении им границ экрана. В-третьих – что случается, когда змея наталкивается на собственный хвост.



Учитывая особенности архитектуры игры, можно каждый такт выполнять простую проверку на равенство для координат головы змеи, фрагментов её тела и печенья. Это возможно потому что объекты ShakeParts и Biscuit могут располагаться только в координатах, делимых нацело на шаг перемещения (20 пикселей). Как результат, сравнивать придётся целые числа. Если бы пришлось работать с дробными величинами, понадобилась бы гораздо более сложная система.



Займёмся реализацией системы обнаружения столкновений.




  1. Добавьте в SnakeLayer следующий метод.



    checkCollision: function() {
    var winSize = cc.view.getDesignResolutionSize();
    var head = this.snakeParts[0];
    var body = this.snakeParts;
    /* Проверка столкновения с границей экрана */
    if (head.x < 0) {
    head.x = winSize.width;
    } else if (head.x > winSize.width) {
    head.x = 0;
    }
    if (head.y < 0) {
    head.y = winSize.height;
    } else if (head.y > winSize.height) {
    head.y = 0;
    }
    /* Проверка столкновения с собой */
    for (var part = 1; part < body.length; part++) {
    if (head.x == body[part].x && head.y == body[part].y) {
    /* Запуск сцены GameOver */
    }
    }    
    /* Проверка столкновения с печеньем */
    if (head.x == this.biscuit.x && head.y == this.biscuit.y) {
    /* Обновление позиции печенья */
    this.updateBiscuit();
    /* Увеличение длины змеи */
    this.addPart();
    }
    },



  2. Добавьте вызов нового метода в метод update объекта SnakeLayer.



    update: function(dt) {

    /* Набор значений, задающих направление перемещения */

    var up = 1;

    /* Перемещаем объект только если истёк интервал */

    if (this.counter < this.interval) {
    this.counter += dt;   
    } else {
    this.counter = 0;

    /* Перемещаем змею */
    this.moveSnake(this.curDir);                        

    /* Проверяем, столкнулась ли голова змеи с границей экрана, её телом или с печеньем */

    this.checkCollision();            
    }
    },



Метод checkCollision выполняет три проверки. Он проверяет, пересек ли объект ShakeHead одну из границ экрана, и, если это случилось, перемещает змею так, чтобы она продолжала движение с другой стороны экрана. Он проверяет, не столкнулась ли голова змеи с одним из фрагментов её тела. Сейчас мы ничего не предпринимаем, если это случится, но уже в следующей части разберёмся с этим. И, наконец, проводится проверка на столкновение змеи с печеньем. Если это произошло, печенье переносится в новое место, а змея растёт.



Так как теперь змея, поедая печенье, растёт, можно убрать код, задающий её начальную длину, из метода ctor. Вот цикл, который больше не нужен.



ctor: function () {
...
for (var parts = 0; parts < 10; parts++) {
this.addPart();
}
},
   

Исправление недочётов управления



В управлении змеёй имеется фундаментальный недочёт. Она может наползти сама на себя. И, если только это не самое начало, и змея не состоит из одной лишь головы, она не должна, даже при нажатии соответствующей кнопки, двигаться в направлении, противоположном тому, в котором двигается в текущий момент. Это позволит предотвратить неожиданный проигрыш, когда змея начнёт двигаться в направлении собственного тела и, естественно, её голова столкнётся с одним из его фрагментов.



Для того, чтобы это исправить, нужно отслеживать текущее состояние змеи, а именно – направление, в котором она двигается.




  1. Добавьте в SnakeLayer новый член класса nextDir.



    var SnakeLayer = cc.Layer.extend({
       ...
       curDir: 0,
       nextDir: 0,
       ...
    });



  2. Уберите параметр dir из moveSnake.



    var SnakeLayer = cc.Layer.extend({
       ...
       moveSnake: function() {
           ...                    
       },
       update: function(dt) {
           ...
           this.moveSnake(this.nextDir);
           this.moveSnake();                       
           ...
       }   
    });



  3. Замените все ссылки curDir на nextDir.



    var SnakeLayer = cc.Layer.extend({
       ...
       ctor: function () {            
           /* Регистрируем обработчики событий клавиатуры */
           cc.eventManager.addListener({
    ...
                   /* Обрабатываем нажатия на клавиши */
                   if (keyMap[keyCode] !== undefined) {
                       //targ.curDir = keyMap[keyCode]; // СТАРАЯ СТРОКА

    targ.nextDir = keyMap[keyCode];  // НОВАЯ СТРОКА
                   }                           
               }            
           }, this);
           
           /* Регистрация прослушивателя событий касания */
           cc.eventManager.addListener({
               onTouchMoved: function(touch, event) {
    ...
    /* Если нет изменений */

    if (delta.x !== 0 && delta.y !== 0) {
    if (Math.abs(delta.x) > Math.abs(delta.y)) {                    
    /* Определяем направление посредством знака */
    //targ.curDir = Math.sign(delta.x) * right;  // СТАРАЯ СТРОКА
    targ.nextDir = Math.sign(delta.x) * right;   // НОВАЯ СТРОКА
    } else if (Math.abs(delta.x) < Math.abs(delta.y)) {
    /* Определяем направление посредством знака */
    //targ.curDir = Math.sign(delta.y) * up; // СТАРАЯ СТРОКА                        
    targ.nextDir = Math.sign(delta.y) * up;  // НОВАЯ СТРОКА                      
    }                            
    }            
    }                  
           }, this);
       },    
       moveSnake: function() {
           ...                     
           /* Старый блок кода */
    /* Перемещаем голову змеи в текущем направлении */    
           //if (dirMap[dir] !== undefined) {
           //   dirMap[dir]();    
           //}
    /* Новый блок кода */
           /* Перемещаем голову змеи в текущем направлении */    
           if (dirMap[this.curDir] !== undefined) {
               dirMap[this.curDir]();    
           }
     ...
       },
       ...
    });



  4. Добавьте в moveSnake блок кода, который предотвращает «наползание» змеи на саму себя. Этот блок кода будет проверять два условия:



    a. НЕ противоположно ли новое направление движения (nextDir) текущему направлению (curDir)?

    b. Состоит ли змея из одной только головы (длина равна 1)?



    Если любое из утверждений верно, производится замена curDir на nextDir



    var SnakeLayer = cc.Layer.extend({
       ...
       moveSnake: function() {
           
           /* Меняем направление движения, если оно не является противоположным текущему или если змея состоит лишь из головы */
           if ((this.nextDir * -1) != this.curDir || this.snakeParts.length == 1)  {            
               this.curDir = this.nextDir;
           }
           
           /* Перемещаем голову в текущем направлении */    
           if (dirMap[this.curDir] !== undefined) {
               dirMap[this.curDir]();    
           }        
     ...
       },
       ...
    });



Выводы



Подведём итоги сегодняшнего занятия. Вы узнали следующее.


  • Как объект Biscuit сам себя позиционирует на экране.

  • Как работает системе определения столкновений

  • Как исправить управление для того, чтобы предотвратить неожиданное «наползание» змеи на саму себя.



Вот, что вы смогли сделать, освоив материал.




  • Создать новый спрайт, символизирующий угощение.

  • Реализовать простую систему определения столкновений.

  • Ограничить перемещение змеи тремя направлениями.



Внесённые изменения позволили сделать наш вариант классической Snake почти готовой игрой. Змеёй можно управлять без риска неожиданно проиграть, она исправно ест печенье, растёт. Но проекту всё ещё чего-то не хватает. А именно, это главного меню, системы подсчёта очков, настройки сложности игры. Об этом – в следующий раз.





Часть 1 » Часть 2 » Часть 3 » Часть 4 » Часть 5 » Часть 6



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/281873/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Дайджест интересных материалов из мира веб-разработки и IT за последнюю неделю №207 (11 — 17 апреля 2016)

Воскресенье, 17 Апреля 2016 г. 21:55 (ссылка)

Предлагаем вашему вниманию подборку с ссылками на полезные ресурсы, интересные материалы и IT-новости





























Веб-разработка
CSS
Javascript
Браузеры
Дизайн
Новости
Занимательное

Веб-разработка



CSS





JavaScript





Браузеры





Сайты с интересным дизайном и функциональностью





Дизайн





Подборка бесплатных дизайнерских печенек





Новости





Занимательное





Просим прощения за возможные опечатки или неработающие/дублирующиеся ссылки. Если вы заметили проблему — напишите пожалуйста в личку, мы стараемся оперативно их исправлять.



Дайджест за прошлую неделю.

Материал подготовили dersmoll и alekskorovin.



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/281789/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Перевод] Разработка HTML5-игр в Intel XDK. Часть 5. Увеличиваем длину змеи и управляем ей

Пятница, 15 Апреля 2016 г. 13:06 (ссылка)



Часть 1 » Часть 2 » Часть 3 » Часть 4 » Часть 5





Сегодня займёмся тем, что увеличим длину тела змеи и создадим систему управления её перемещением.





Создаём тело змеи в виде цепочки фрагментов



Змея состоит из множества частей. Это позволяет увеличивать её длину, но делает задачу перемещения игрового объекта непростой. Ведь нам нужно перемещать сущность, состоящую из множества частей, как единое целое. Сделаем это за несколько шагов. Для начала – создадим змею, которая может перемещаться как единое целое.



1. В коде слоя SnakeLayer замените переменную snakeHead на snakeParts.



2. Код snakeHead: null измените на такой:



snakeParts: null, // содержит части тела змеи


3. Замените метод ctor на нижеприведённый:



ctor: function () {

/* Получим размер окна */
var winSize = cc.view.getDesignResolutionSize();

/* Вызовем конструктор суперкласса */
this._super();

// Новый код расположен ниже
/* Инициализируем массив snakeParts */
this.snakeParts = [];    

/* Создадим голову змеи */
var snakeHead = new SnakePart(asset.SnakeHead_png);

/* Установим координаты для головы змеи */
snakeHead.x = winSize.width / 2;
snakeHead.y = winSize.height / 2;

/* Добавим объект в качестве потомка слоя и добавим его в массив snakeParts */
this.addChild(snakeHead);

// Новая строка
this.snakeParts.push(snakeHead);

/* Запланируем обновления */
this.scheduleUpdate();
},


Здесь мы добавили в код возможность работы с телом змеи, состоящим из отдельных фрагментов. Сделано это с помощью массива, раньше мы рассматривали голову змеи как отдельный объект. Однако, это пока не решило проблему организации частей змеи в «единый организм». Для того, чтобы это сделать, будем назначать предыдущие позиции частей змеи тем частям, которые следуют за ними.



4. Переделайте код SnakeParts так, как показано ниже:



var SnakePart = cc.Sprite.extend({
   // Добавьте строки ниже
   prevX: this.x,
   prevY: this.y,    
   ctor: function(sprite) {
       /* Вызов конструктора суперкласса с передачей спрайта, символизирующего фрагмент тела змеи */
       this._super(sprite);
   },
   move: function(posX, posY) {
       // Добавьте строки ниже
       /* Установим предыдущее расположение */
       this.prevX = this.x;
       this.prevY = this.y;
       /* Обновим текущее расположения */
       this.x = posX;        
       this.y = posY;
   },
});


5. Добавьте в код SnakeLayer следующий метод:



addPart: function() {
var newPart = new SnakePart(asset.SnakeBody_png),
size = this.snakeParts.length,
tail = this.snakeParts[size - 1];

/* Изначально новая часть расположена в хвосте */
newPart.x = tail.x;
newPart.y = tail.y;

/* Добавляем объект в качестве потомка слоя */
this.addChild(newPart);
this.snakeParts.push(newPart);
},


По умолчанию позиция спрайта – (0, 0). Это означает, что объект SnakePart, до начала перемещения, появится в нижнем левом углу экрана. Мы эту проблему решаем, размещая новый спрайт в хвосте змеи.



6. Измените метод moveSnake в коде SnakeLayer для того, чтобы в нём использовался новый член класса snakeParts и с его помощью можно было перемещать все части змеи:



moveSnake: function(dir) {

/* Набор значений, задающих направление перемещения */
var up = 1, down = -1, left = -2, right = 2,
step = 20;

/* Запишем snakeHead в первый элемент массива */
var snakeHead = this.snakeParts[0];

/* Сопоставление направлений и реализующего перемещения кода */
var dirMap = {};
dirMap[up] = function() {snakeHead.move(snakeHead.x, snakeHead.y + step);};
dirMap[down] = function() {snakeHead.move(snakeHead.x, snakeHead.y - step);};
dirMap[left] = function() {snakeHead.move(snakeHead.x - step, snakeHead.y);};
dirMap[right] = function() {snakeHead.move(snakeHead.x + step, snakeHead.y);};

/* Перемещаем голову в заданном направлении */
if (dirMap[dir] !== undefined) {
dirMap[dir]();
}

// Добавьте код ниже
/* Сохраняем текущую позицию головы для следующего фрагмента змеи */
var prevX = snakeHead.prevX;
var prevY = snakeHead.prevY;

/* Перемещаем остальные части змеи */
for (var part = 1; part < this.snakeParts.length; part++) {
var curPart = this.snakeParts[part];

/* Перемещаем текущую часть, сохраняем её предыдущую позицию для следующей итерации */
curPart.move(prevX, prevY);
prevX = curPart.prevX;
prevY = curPart.prevY;
}
},


7. Добавьте следующий код в конструктор SnakeLayer. Это код временный, нужен он лишь для того, чтобы проверить, верно ли всё сделано на данном этапе разработки:



ctor: function () {
...

for (var parts = 0; parts < 10; parts++) {
this.addPart();
}
},


8. Запустите эмулятор. Если всё сделано правильно, вы увидите змею, которая медленно ползёт вверх, и, по мере движения, удлиняется, а потом уходит за пределы экрана.





Движущаяся змея на игровом экране



Теперь пришло время управлять этой змеёй.



События



Стандартная система ввода данных в Cocos2d-JS основана на событиях. Здесь имеется централизованный менеджер событий (Event Manager), который выполняет обработку всех событий в движке. Менеджер событий позволяет регистрировать функции обратного вызова, которые будут срабатывать в ответ на определённые события.



Для регистрации функции обратного вызова используется следующая конструкция:



cc.eventManager.addListener({
event: cc.EventListener.LISTENER, // прослушиватель
onEventType: callBackFunction // тип события и функция обратного вызова
}, this);


А вот – реальный пример реализации этой конструкции:



cc.eventManager.addListener({
event: cc.EventListener.KEYBOARD,
onKeyDown: callBackFunction1,
onKeyUp: callBackFunction2
}, this);


Функция обратного вызова



Функция обратного вызова, которую передали при настройке прослушивателя, вызывается в другой области видимости. Это означает, что мы в ней не можем пользоваться ключевым словом «this». К счастью, Cocos2d-JS предоставляет некоторые вспомогательные механизмы для того, чтобы это обойти. Делается это с помощью объекта события.



Создавая функцию обратного вызова, можно указать несколько аргументов для неё. Второй аргумент – это всегда объект события. Он позволяет узнать тип события, которое представляет, и то, что является целью события. Это даёт нам доступ к узлу, который связан с событием.



Первый аргумент функции обратного вызова зависит от типа события. Например, если речь идёт об обработке событий клавиатуры, то первым аргументом будет код клавиши, задействованной в событии. В событии касания сенсорного экрана это будет объект касания, который несёт в себе сведения о координатах касания. Знание всего этого поможет нам наладить систему управления змейкой.



1. Добавьте в SnakeLayer следующий код:



curDir: 0, /* направление перемещения, соответствующее заданным ранее переменным */


2. Измените параметр «up», который использовался в moveSnake на «this.curDir» в методе update. Приведите его к такому виду:



this.moveSnake(this.curDir);


Теперь переменная curDir используется для изменения направления движения змеи.



3. Добавьте код для взаимодействия с менеджером событий в метод ctor слоя SnakeLayer:



/* Регистрируем прослушиватель событий клавиатуры */
cc.eventManager.addListener({
 event: cc.EventListener.KEYBOARD,
 onKeyPressed: function(keyCode, event) {

 var targ = event.getCurrentTarget();   

 /* Набор значений, задающих направление перемещения */
 var up = 1, down = -1, left = -2, right = 2;

 /* Объект, в котором клавишам поставлены в соответствие направления */            
 var keyMap = {};
 keyMap[87] = up; // w
 keyMap[83] = down; // s
 keyMap[65] = left; // a
 keyMap[68] = right; // d

 /* Обработка нажатий на клавиши */
 if (keyMap[keyCode] !== undefined) {
 targ.curDir = keyMap[keyCode];
 }                           
 }            
}, this);


Этот код довольно прост. Когда обнаруживается, что нажата одна из интересующих нас клавиш, мы изменяем значение переменной curDir на то, которое соответствует нужному направлению. На следующей итерации игрового цикла змейка начнёт перемещаться в выбранном направлении до тех пор, пока не будет нажата одна из клавиш, задающих направление. Всё это хорошо, но на мобильном устройстве с сенсорным экраном работать не будет. Поэтому добавим в проект управление касаниями.



Добавьте в метод ctor следующий код для того, чтобы змейкой можно было управлять касаниями экрана:



/* Прослушиватель для организации сенсорного управления */
cc.eventManager.addListener({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
onTouchBegan: function() {

/* Позволяет задействовать onTouchMoved, если возвращено true */
return true;
},

onTouchMoved: function(touch, event) {
var targ = event.getCurrentTarget();
var up = 1, down = -1, left = -2, right = 2;

/* Получаем расстояние перемещения */
var delta = touch.getDelta();

/* Если было касание с протягиванием */
if (delta.x !== 0 && delta.y !== 0) {
if (Math.abs(delta.x) > Math.abs(delta.y)) {                    

/* Определяем направление, получая знак */
targ.curDir = Math.sign(delta.x) * right;                        

} else if (Math.abs(delta.x) < Math.abs(delta.y)) {

/* Определяем направление, получая знак */
targ.curDir = Math.sign(delta.y) * up;                        
}                            
}
/* Если было простое касание, без протягивания, не делаем ничего */            
}                    
}, this);


К несчастью, в Cocos2d-JS нет встроенной поддержки событий, вызываемых при жесте касания с протягиванием, поэтому нам понадобилось написать собственную реализацию подобного механизма. Мы смотрим на начальную и конечную точки жеста касания, и, если, например, расстояние перемещение вверх оказалось больше, чем в другие стороны, выполняем команду перемещения вверх. То же самое делается для перемещений вправо, влево, и вниз.



Теперь змейкой можно управлять! Однако, есть одна проблема. Игрок может неожиданно проиграть (с учётом той логики, которую мы ещё реализуем), если, например, змейка двигается вверх, а он нажмёт на клавишу «вниз». С этим мы справимся в продолжении.



Выводы



Подведём итоги сегодняшнего занятия:




  • Части тела змеи движутся синхронно, так как при перемещении каждая из них передаёт следующей свою предыдущую позицию.

  • При реализации управления игровым объектом задействована система событий.



Освоив сегодняшний материал, вы смогли следующее:


  • Создать тело змеи и настроить его длину.

  • Создать систему управления.



Змейка двигается по экрану, реагирует на нажатия клавиш на клавиатуре и на касания сенсорного экрана. Но пока в её перемещениях нет особого смысла. Поэтому в следующий раз мы добавим в игру угощение для неё и поговорим о распознавании и обработке столкновений.





Часть 1 » Часть 2 » Часть 3 » Часть 4 » Часть 5



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/281639/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<html5 - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda