Практика разработки мини-игр WeChat и Egret Engine

внешний интерфейс WeChat контейнер игра

предисловие

Согласно последовательности исследований и разработок автора, в статье первоначально были представлены и поняты мини-игры WeChat и движок Egret, а также создана программа инициализации приложения на основе движка Egret.egret-wechat-start. Далее текст -

WeChat игра

официальная документация

разработчики.микро-канал .QQ.com/мини-игра/а...,可以快速浏览一下官方文档再继续看下面的内容。 Here to be a simple understanding of the micro-channel document summary, games and applets many places similar, are provided with a micro-channel Api, such as access to user information, toast and so on, but there are different parts of the api при условии.小游戏对canvas做了封装,通过wx.createCanvas() После создания холста и getContext для получения объекта все остальное — это работа собственного интерфейса холста. Разобравшись с этим, мы обнаружим, что мини-игра лишь инкапсулирует интерфейс для создания холста, а остальное заключается в том, что пользователю нужно использовать нативный холст для рисования на холсте, и не предоставляет других удобных функций разработки. На этом этапе давайте взглянем на демо-версию игры с самолетом, которая инициализируется, когда инструмент разработчика WeChat создает небольшой игровой проект.
Это очень простая игра, как показано на рисунке выше. Давайте поговорим о общей реализации логики этой игры:
1. Нарисуйте игровую зону, фоновое изображение
2. Создайте объекты вражеского самолета, объекты пользовательского самолета, объекты пули
3. Управляйте 3 типами объектов, чтобы загрузить холст и изменить положение, управлять движением фонового изображения и добавлять звуковые эффекты.
4. Анализ столкновения пули, тела столкновения и генерация соответствующего результата (враг исчезает, конец игры)
В игре есть интерактивные операции с пользователями, в том числе перетаскивание самолета и кнопок во всплывающем окне.В целом это очень простая маленькая игра, и процесс реализации не сложный. Основное содержимое анимации в официальной демонстрации находится в методе цикла, который использует анимацию кадра ( requestAnimationFrame ) для достижения анимации интерфейса. Существует два основных способа достижения анимационных эффектов для игр: один — это кадровая анимация requestAnimationFrame, а другой — с помощью таймера. Кадровая анимация связана со скоростью обработки устройства, по умолчанию она составляет 60 кадров в секунду, однако даже для простых анимаций на мобильных устройствах частота кадров на устройствах с низкой производительностью может составлять всего около 20-30. Поскольку покадровая анимация вызывается n раз в секунду, она может не нуждаться в такой высокой частоте вызовов функций, а таймер обычно более точно контролирует время и количество вызовов функций. Например, если в этой игре про самолет есть концепция полосок крови, добавление и вычитание полосок крови фактически можно контролировать с помощью отдельного таймера. Вы можете использовать оба метода в игре, и выбрать более разумный способ в соответствии со сценарием приложения.
Теперь сделать игру в соответствии с новыми требованиями, а затем понять развитие небольших игр. Теперь нам нужно реализовать пошаговую игру. Эта игра также имеет много страниц. Домашняя страница содержит много кнопок и всплывающие окна, которые могут появиться, а также различные список страниц и наиболее критическая страницы битвы. Прежде чем выполнять требования, вам необходимо предоставить некоторые общие основные модули: ресурс предзагрузку, интерфейс перехватчики, простая маршрутизацию и т.д. Пропустить эти этапы. Если мы получим дизайн пользовательского интерфейса и начать делать домашнюю страницу, есть много кнопок на главной странице. Нам нужно добавить обязывающее событие на кнопку A, то нам нужно привязать событие щелчка на холсте. После щелчка срабатывает, мы получаем текущий пользователь нажимает позицию, и вынимает ширину положения и высоту кнопки A и вычисляет диапазон, судьи , является ли позиция мыши в пределах диапазона, и , наконец , вызывает связывающий метод. Это кажется немного хлопотно, но это может быть достигнуто, и продолжают это делать. Позже, вам нужно сделать всплывающее окно на главной странице. В это время, связать событие нажмите на кнопку B в всплывающем окне, и вы должны использовать тот же метод, чтобы определить, является ли кнопка B является щелкнул. В это время, кнопка B из всплывающего окна просто перекрывается с помощью кнопки A в диапазоне щелчка, и обратные вызовы кнопок А и В будут выполнены. код показать, как показано ниже:
canvas.addEventListener('click', (event)=>{
    获取event对象x,y

    获取 buttonA:x,y,width,height
    判断是否点击

    获取 buttonB:x,y,width,height
    判断是否点击
})

Нажата кнопка в верхней части всплывающего окна, но также нажата кнопка под всплывающим окном, что не соответствует ожиданиям.Чтобы решить эту проблему, нам также нужен менеджер иерархии, чтобы определить, кто должен срабатывать, а кто не должен срабатывать в зависимости от уровня. В настоящее время для обработки событий нам необходимо реализовать две основные функции: пул прослушивания событий и диспетчер иерархии объектов элементов, поскольку события могут быть привязаны только к холсту.После запуска события холста требуется пул прослушивания событий для просматривать объекты-элементы в пуле прослушивания и определять, кто срабатывает (пул мониторинга также будет увеличивать или уменьшать количество объектов мониторинга в любое время), пул мониторинга по-прежнему получает набор объектов, а иерархический менеджер определяет самый верхний элемент в объект настроен на запуск. Подумайте о функции, кажется, все более и более сложным. В настоящее время не считается совершенным не только проблема обработки событий, но и другие большие и малые проблемы. При использовании собственной разработки Canvas рабочая нагрузка может быть очень большой. Таким образом, кажется, что реализовывать их самостоятельно ненаучно, и вам нужно использовать сторонний движок для разработки. Поскольку я использовал движок Egret два года назад, я знаю, что движок Egret был реализован с точки зрения мониторинга событий и иерархического управления.Помимо событий, рисования графики, анимации и т. д., я помню, что Egret предоставляет это.Если вы использовать движок для разработки небольших игр для достижения значительного снижения затрат.

цапля двигатель

Двигатель цапли мощный и богатый. Здесь я сначала представлю инструменты, которые я в основном использую.
  • Egret Engine2D
  • Texture Merger
  • Библиотека расширений цапли
  • Egret Wing

Egret Engine2D

Основное развитие ядра API

Texture Merger

Texture Merger может объединять разбросанные текстуры в целые изображения, а также может анализировать анимацию SWF и GIF, создавать растровый текст Egret и экспортировать файлы конфигурации, которые могут использоваться Egret. Я в основном использую в нем функцию спрайта для сбора картинок в одну картинку, а также экспортирую конфигурационную информацию, такую ​​как расположение спрайта json на картинке.

Библиотека расширений цапли

  1. EUI: EUI — это библиотека расширений пользовательского интерфейса, основанная на основном списке отображения Egret.Он инкапсулирует большое количество общих компонентов пользовательского интерфейса и может удовлетворить большинство требований к интерактивному интерфейсу.Даже для более сложных требований к компонентам вы также можете использовать существующие компоненты EUI , Комбинируйте или расширяйте, чтобы быстро реализовать требования.
  2. Игра: Кажется, эта библиотека не имеет какого-либо специального определения, я в основном использую: вид прокрутки ScrollView. для обработки страниц, которые необходимо прокручивать
  3. Tween: библиотека анимации Easing, аналогичная библиотеке GreenSock.

Egret Wing

Редактор кода, разработанный Egret, как и другие редакторы, рекомендуется.

egret launcher

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


начать разработку цапли

Вы можете быстро просмотреть официальное руководство, чтобы лучше понять следующее:developer.egret.com/talent/GitHub/ о…. Статья не является учебным пособием, поэтому учебные пособия на официальном сайте Egret будут опущены. Теперь мы используем пусковую установку egret для создания проекта инициализации.Инициализированная файловая структура показана ниже.Я расширил папки ресурсов и src, потому что нам в основном нужно работать с этими двумя папками.Папка ресурсов в основном хранит статические ресурсы.Мы код все в src, а Egret использует машинопись.

В инструменте крыла мы можем сразу начать отладку и предварительно просмотреть эффект в браузере или собственном контейнере. main.ts — это файл запуска. Основное использование await для предварительной загрузки ресурсов изображения, определенных в ресурсе, поэтому эффект загрузки появится после начала предварительного просмотра. Рисунок загрузки записывается в LoadingUI.ts в src. После того, как изображение загружена, страница, показанная на рисунке 2 ниже, создается непосредственно в главной, и добавляется кнопка, после нажатия которой появится всплывающее окно. Эффект показан ниже.

До сих пор демонстрируют демонстрационную демонстрацию, как нарисовать изображения и связывать события. Как показано на рисунке ниже, я только перехватил код кнопки кликов. Для рисования изображений нам сначала нужно создать соответствующую эмптую или EUI объект, Такие как eui.button, egret.textfield, egret.bitmap и т. Д., А затем установить соответствующие свойства на объект, такой как метка, координаты XY, ширина, высота и т. Д. Затем используйте Addchild Main, чтобы загрузить его в холст (следующее это главный объект, а главные наследования от EUI.UILAYER). Код в демонстрации использует это .stage.addchild при загрузке и может быть загружен в холст непосредственно на AddChild или с помощью Stage.addchild. Метод addeventListener, инкапсулированный Eget, такой же, как метод прослушивания родных js.

Демонстрационный код здесь для подведения итогов, мы можем использовать AddChild для загрузки объекта представления на холст в объекте MAIN, например текст, кнопки и т. д. Мы также можем добавить вью-контейнер А в Main, вью-контейнер A, также можем добавить текстовую кнопку, тогда мы добавляем addChild вью-контейнер B в view-контейнер A, тогда таким образом формируем иерархический вложенный main->A->B Если вы представляете, что элемент DOM — это div.main-> div.a-> div, мы используем код для сравнения:

class Main extends eui.UILayer {


    protected createChildren(): void {

        let A = new egret.DisplayObjectContainer();
        this.addChild(A);

        let textA = new egret.TextField();
        textA.text = 'text A Description';
        A.addChild(textA);

        let B = new egret.DisplayObjectContainer();
        A.addChild(B);
        
        let buttonB = new eui.Button();
        buttonB.label = 'button B';
        B.addChild(buttonB);
    }

}

вести переписку

<div class="main">
    <div class="A">
        <span>text A Description</span>
        <div class="B">
            <button value="button B"></button>
        </div>
    </div>
</div>

В соответствии с пониманием приведенного выше кода и потребностей, которые нам нужно сделать (для реализации пошаговой игры, эта игра также имеет много страниц, домашняя страница содержит много кнопок и всплывающих окон, которые могут появиться, также есть различные страницы списков и наиболее важные боевые страницы). Я написал в main метод initElement для создания контейнера базового уровня. Код показан на рисунке ниже. По умолчанию addChild определяет взаимосвязь между верхним и нижним слоями в соответствии с порядком, и первый загруженный находится в нижний слой. Сначала в нижнем слое создается фоновый слой, затем ScrollView и baseContent, в них будет загружен контейнер страницы, если страницу нужно прокрутить, то в SV будет загружен объект просмотра страницы, и он будет загружен в baseContent без прокрутки, слой и загрузка на верхнем уровне.

После того, как базовый контейнер готов, мы можем создать домашнюю страницу. Я бы создал 3 файла: base.ts, Index_ui.ts, Index.ts. Index наследует Index_ui, а Index_ui наследует базу. Все _ui наследует базу, которая определяет общие методы и свойства. Поскольку страница может закончиться большим количеством кода или даже беспорядком, поэтому мы разделяем страницу на страницу и page_ui, пишем код, связанный с представлением, в _ui, вызываем методы _ui в странице, обрабатываем запросы и пишем логику для достижения эффекта. разделения взглядов и логики. После того, как домашняя страница написана, вам нужно создать простой маршрут и использовать метод, предоставленный маршрутом, для добавления индекса в контейнер SV. Маршрут прописал прямо в главную, changePage — метод переключения страниц, код примерно такой:

Эффект переключения страниц достигается за счет удаления и добавления контейнеров представления. Давайте поговорим о правилах написания страниц _ui.Следующее является частью кода Index_ui.el_layout заранее определяет и управляет информацией о макете элементов страницы. Элементы, с которыми необходимо работать на логической странице Index, относятся к объекту $el для простоты вызова и работы. Единая информация о данных в $data. Перед созданием элемента просмотра страницы необходимо передать координату y первого элемента в $firstEleY. Это необходимо для того, чтобы метод pageContentCenter мог получить точную высоту содержимого страницы. pageContentCenter необходимо выполнить после создания всех элементов страницы, pageContentCenter будет основан на текущей странице, тогда высота будет соответствовать высоте текущего устройства для вертикального центрирования.

class Index_ui extends Base {
    public el_layout = {
        indexbg: {x:0, y:0, w:750, h:1665},
        gold: {x:300, y:100, w:300, h:39}
    };
    public constructor() {
        super();
        this.RES_index = RES.getRes('index');
        this.RES_common = RES.getRes('common');
    }
    public RES_index;
    public RES_common;
    public $el = {
        gold: Object(egret.TextField)
    }
    public $data = {
        gold: '0'
    }

    public async createView() {

//задний план
пусть RES_bg = новый egret.Bitmap (RES.getRes ('indexbg'));
$util.setLayout(RES_bg, this.el_layout['indexbg']);
RES_bg.fillMode = egret.BitmapFillMode.REPEAT;
this.$main.PageBg.addChild(RES_bg);//Загружаем его в PageBg main, чтобы убедиться, что фон не прокручивается

        //顶部元素必传值
        this.$firstEleY = this.el_layout.gold.y;

        this.pageContentCenter(true);//根据内容计算处理居中
    }
}

Основной код простого пакета разработки создан, а затем нам нужно упаковать некоторые другие классы инструментов, как показано ниже: файл конфигурации ($config), перехватчик пакета ($api), фильтр ($filter), функция инструмента ( $util), пакет API WeChat (Wx). Platform.ts — это файл, автоматически сгенерированный Egret, согласно его правилам, он написал файл Wx.ts, поскольку формы интерфейса разных платформ различаются, Egret рекомендует разработчикам инкапсулировать логику платформы таким образом, чтобы обеспечить общую структуру. Стабильный, Egret рекомендует разработчикам инкапсулировать все интерфейсы в асинхронной форме на основе промисов.

Существует также папка текстуры на том же уровне, что и SRC, которая содержит связанные файлы TEXTUREMEGE с использованием SPRITES, которые помещаются на склад для облегчения более позднего управления.

Простая демонстрация Demo, я обновил до Github. egret-resource是源码,egret-resource_wxgame是白鹭打包后的文件夹,它在开发者工具里运行。 egret-resource_wxgame应该在ignore里忽略,这里没有忽略是方便下载源码的朋友直接在开发者工具里运行demo。当前程序使用白鹭引擎版本5.2.5。


яма

  • На фоне официального аккаунта установите в настройках класс сервиса на класс игры.После ввода appId автоматически откроется интерфейс разработки игры инструмента разработчика
  • Небольшой пользовательский шрифт для игр Поддержка WeChat плохая
  • Некоторые функции и API требуют использования зарегистрированных мини-программ, таких как функция переадресации.В настоящее время персональная мини-игра зарегистрирована для предварительной разработки.
  • Используйте инструменты для редактирования кода, Compile Debug Compabled Compabled будет храниться в папке Bin-Debug, я использую MAC, меню Project имеет три варианта для компиляции, отладки и очистки. Я добавил файл XX, но при отладке произошла ошибка, проверьте свой источник браузера там, где нет новых документов, Bin-Debug не сделали, долимся, подумал, что его код неверно, и, наконец, реализован компилятор Может быть проблемой, на этот раз я нажимаю на кнопку, чтобы убрать, новые документы появились в годы Bin-Debug. Должно быть ошибка, должна уделять больше внимания проверять, будь то Bin-Debug в обновлениях файла
  • RES.getResByUrl это асинхронная загрузка сети.Заранее нужно addChild чтобы уровень был в норме.После выполнения запроса можно модифицировать свойство текстуры объекта.Также можно указать уровень через метод addChildAt.
  • Размер шрифта TextField меньше 10 повлияет на макет, зависит ли перенос текста от установленной высоты элемента
  • Режим webgl не может загружать изображения сетевых URL-адресов
  • ScrollView имеет метод addChild, но код в методе напрямую выдает ошибку, указывающую на то, что этот интерфейс нельзя использовать. Его дочерние элементы будут признаны недействительными путем привязки touchStart move и других событий, поэтому в настоящее время добавляется baseContent для переключения родительского контейнера в соответствии с требованиями.
  • Интерфейс измерения MeasurementHeight будет измерять только фактическую высоту самого верхнего и самого нижнего элементов, поэтому, если значение y первого элемента больше 0, обратите внимание на настройку $firstEleY.
  • Все изображения сжаты инструментами, что уменьшит размер кода загрузки и улучшит скорость загрузки ресурса.

Узел

Когда все это готово, остальные - это физическая работа, и, конечно, самая важная основная реализация GamePlay, анимация и взаимодействие в последствиях игры, которая может быть самой сложной частью игры для реализации. Адрес склада:GitHub.com/letter-v/egret-….


Обратите внимание на публичный аккаунт великого поэта и получайте свежие статьи в первый раз.


Категории