[Открытый исходный код] Мини-программы WeChat, мини-игры и веб-универсальный механизм рендеринга холста — Cax

внешний интерфейс Апплет WeChat Открытый исходный код Canvas
[Открытый исходный код] Мини-программы WeChat, мини-игры и веб-универсальный механизм рендеринга холста — Cax

Cax

Небольшая программа, небольшая игра и универсальный веб-движок рендеринга Canvas.

характеристика

  • Учитесь один раз, пишите где угодно (мини-программы, мини-игры, Интернет для ПК, мобильный Интернет)
  • Поддерживает рендеринг апплетов, мини-игр и веб-браузера.
  • Мини-программы, мини-игры и Интернет имеют один и тот же простой и легкий API.
  • Высокопроизводительная архитектура рендеринга
  • Сверхлегкий размер кода
  • Слабосвязанная архитектура рендеринга
  • Поддержка управления элементами Canvas
  • Поддержка системы событий элемента Canvas
  • Полная по Тьюрингу система группового вложения
  • Встроенный подростковый атлетизм
  • Встроенный текст, растровые изображения, кадры последовательности, объекты рисования и различные объекты векторного рисования.

Одноминутное использование стартового апплета cax

на GitHubСкачать пользовательские компоненты cax, а затем апплет вводит пользовательский компонент cax:

└── cax
    ├── cax.js
    ├── cax.json  
    ├── cax.wxml  
    ├── cax.wxss
    └── index.js

Объявите зависимости на странице или компоненте:

{
  "usingComponents": {
    "cax":"../cax/cax"
  }
}

Введите тег cax в wxml:

<cax id="myCanvas"></cax>

Логика рендеринга в js:

import cax from '../cax/index'

Page({
  onLoad: function () {
    //比 web 里使用 cax 多传递 this,this 代表 Page 或 Component 的实例
    const stage = new cax.Stage(200, 200, 'myCanvas', this)
    const rect = new cax.Rect(100, 100, {
      fillStyle: 'black'
    })
    
    rect.originX = 50
    rect.originY = 50
    rect.x = 100
    rect.y = 100
    rect.rotation = 30

    rect.on('tap', () => {
      console.log('tap')
    })

    stage.add(rect)
    stage.update()
  }
})

Эффект следующий:

В дополнение к событию касания вы также можете привязать к прямоугольнику другие события касания:

rect.on('touchstart', () => {
  console.log('touchstart')
})

rect.on('touchmove', () => {
  console.log('touchmove')
})

rect.on('touchend', () => {
  console.log('touchend')
})

Использование одной минуты вступительной игры

на GitHubСкачать пример мини-игры cax, структура каталогов выглядит следующим образом:

const stage = new cax.Stage()

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

Начало работы с Webcax за одну минуту

Получите его через npm или CDN:

npm i cax
import cax from 'cax'

const stage = new cax.Stage(200, 200, '#renderTo')
const rect = new cax.Rect(100, 100, {
  fillStyle: 'black'
})

stage.add(rect)
stage.update()

За исключением того, что конструктор Stage является четвертым параметром апплета.this, и другие обычаи одинаковы.

встроенные объекты

Group

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

  • X группы равен 100, x растрового изображения в группе равно 200, а x окончательного растрового изображения, отображаемого на сцене, равно 300.
  • Альфа группы равна 0,7, альфа растрового изображения в группе — 0,6, а альфа финального растрового изображения, отображаемого на рабочей области, — 0,42.
const group = new cax.Group()
const rect = new cax.Rect(100, 100 {
  fillStyle: 'black'
})
group.add(rect)
stage.add(group)
stage.update()

group имеет обычные методы добавления и удаления для добавления и удаления элементов. Те, которые добавлены первыми, будут отрисованы первыми, а все те, которые добавлены позже, будут наложены на те, которые были добавлены первыми.

Bitmap

const bitmap = new cax.Bitmap(img)
stage.add(bitmap)
stage.update()

Если вы передаете только URL-адрес вместо экземпляра объекта изображения, вам нужно это:

const bitmap = new cax.Bitmap('./wepay.png', ()=>{
  stage.update()
})
stage.add(bitmap)

Здесь следует отметить, что апплет должен быть настроен с файлом загрузки и допустимым доменным именем для нормальной загрузки в образ.

Вы можете установить область отображения обрезки изображения и другие свойства преобразования:

bitmap.rect = [0, 0, 170, 140]
bitmap.x = 200

Sprite

Компонент анимации последовательности кадров может объединять любую область любого изображения в серию анимаций.

const sprite = new cax.Sprite({
    framerate: 7,
    imgs: ['./mario-sheet.png'],
    frames: [
        // x, y, width, height, originX, originY ,imageIndex
        [0, 0, 32, 32],
        [32 * 1, 0, 32, 32],
        [32 * 2, 0, 32, 32],
        [32 * 3, 0, 32, 32],
        [32 * 4, 0, 32, 32],
        [32 * 5, 0, 32, 32],
        [32 * 6, 0, 32, 32],
        [32 * 7, 0, 32, 32],
        [32 * 8, 0, 32, 32],
        [32 * 9, 0, 32, 32],
        [32 * 10, 0, 32, 32],
        [32 * 11, 0, 32, 32],
        [32 * 12, 0, 32, 32],
        [32 * 13, 0, 32, 32],
        [32 * 14, 0, 32, 32]
    ],
    animations: {
        walk: {
            frames: [0, 1]
        },
        happy: {
            frames: [5, 6, 7, 8, 9]
        },
        win: {
            frames: [12]
        }
    },
    playOnce: false,
    currentAnimation: "walk",
    animationEnd: function () {

    }
});

Text

текстовый объект

const text = new cax.Text('Hello World', {
  font: '20px Arial',
  color: '#ff7700',
  baseline: 'top'
})

Graphics

Объект рисования, используемый для рисования графики с использованием основных связанных команд Canvas.

const graphics = new cax.Graphics()
graphics
    .beginPath()
    .arc(0, 0, 10, 0, Math.PI * 2)
    .closePath()
    .fillStyle('#f4862c')
    .fill()
    .strokeStyle('black')
    .stroke()

graphics.x = 100
graphics.y = 200

stage.add(graphics)

Shape

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

Rect

const rect = new cax.Rect(200, 100, {
  fillStyle: 'black'
})

Circel

const circel = new cax.Circel(10)

Ellipse

const ellipse = new cax.Ellipse(10)

Примечание. Технически мини-игры и Интернет могут использовать закадровый холст, но мини-программы не могут, поскольку мини-программы не поддерживают динамическое создание закадрового холста.

Element

Элемент представляет собой комбинацию различных элементов, таких как Bitmap, Group, Text, Shape и т. д. смешанных изображений.

Button

const button = new cax.Button({
  width: 100,
  height: 40,
  text: "Click Me!"
})

Атрибуты

Transform

Имя свойства описывать
x Горизонтальное смещение
y вертикальное смещение
scaleX Горизонтальный зум
scaleY вертикальное масштабирование
rotation вращать
skewX Наклон X
skewY перекошенный Y
originX Базовая точка вращения X
originY Базовая точка вращения Y

Alpha

Имя свойства описывать
alpha Прозрачность элементов

Обратите внимание, что и у родителя, и у потомка есть набор альфа-каналов, которые будут умножаться и перекрываться.

compositeOperation

Имя свойства описывать
compositeOperation Режим наложения, в котором исходное изображение наносится на целевое изображение.

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

Cursor

Имя свойства описывать
cursor наведите курсор мыши на фигуру

мероприятие

событие апплета

название события описывать
tap Уходите, как только ваш палец коснется
touchstart Начинается действие касания пальцем
touchmove Двигаться после касания пальцем
touchend Действие касания пальца заканчивается
drag тянуть

веб-мероприятие

название события описывать
click Запускается, когда происходит щелчок по элементу
mousedown Запускается при нажатии кнопки мыши на элементе
mousemove Срабатывает при наведении указателя мыши на элемент
mouseup Уволен, когда кнопка мыши выпущена на элементе
mouseover Запускается, когда указатель мыши перемещается по элементу
mouseout Запускается, когда указатель мыши выходит за пределы элемента
tap Уходите, как только ваш палец коснется
touchstart Начинается действие касания пальцем
touchmove Двигаться после касания пальцем
touchend Действие касания пальца заканчивается
drag тянуть

спортивный

cax имеет встроенную возможность записи эффектов движения конкатенированным образом:

cax.To.get(bitmap)
    .to()
    .y(240, 2000, cax.easing.elasticInOut)
    .rotation(240, 2000, cax.easing.elasticInOut)
    .end(function () {
        console.log(" task one has completed!")
    })
    .wait(500)
    .to()
    .rotation(0, 1400, cax.easing.elasticInOut)
    .end(function () {
        console.log(" task two has completed!")
    })
    .wait(500)
    .to()
    .scaleX(1, 1400, cax.easing.elasticInOut)
    .scaleY(1, 1400, cax.easing.elasticInOut)
    .end(function () {
        console.log(" task three has completed!")
    })
    .start()

Конечно, вы также можете поддерживать перемещение любого атрибута через метод set, например:

.set('y', 240, 2000, cax.easing.elasticInOut)

Эквивалентно

.y(240, 2000, cax.easing.elasticInOut)

демонстрационный адрес

пользовательский объект

Пользовательская форма

Пользовательская форма, унаследованная от cax.Shape:

class Sector extends cax.Shape {
  constructor (r, from, to, option) {
    super()

    this.option = option || {}
    this.r = r
    this.from = from
    this.to = to
  }

  draw () {
    this.beginPath()
      .moveTo(0, 0)
      .arc(0, 0, this.r, this.from, this.to)
      .closePath()
      .fillStyle(this.option.fillStyle)
      .fill()
      .strokeStyle(this.option.strokeStyle)
      .lineWidth(this.option.lineWidth)
      .stroke()
  }
}

Использование фигур:

const sector = new Sector(10, 0, Math.PI/6, {
  fillStyle: 'red'
  lineWidth: 2
})
stage.add(sector)
stage.update()

пользовательский элемент

Пользовательский элемент наследуется от cax.Group:

class Button extends cax.Group {
  constructor (option) {
    super()
    this.width = option.width
    this.roundedRect = new  cax.RoundedRect(option.width, option.height, option.r)
    this.text = new cax.Text(option.text, {
      font: option.font,
      color: option.color
    })

    this.text.x = option.width / 2 - this.text.getWidth() / 2 * this.text.scaleX
    this.text.y = option.height / 2 - 10 + 5 * this.text.scaleY
    this.add(this.roundedRect, this.text)
  }
}

export default Button

использовать:

const button = new cax.Button({
  width: 100,
  height: 40,
  text: "Click Me!"
})

В целом рекомендуется использовать наследование от Group для немного сложной сборки, удобной для расширения и управления собственными внутренними компонентами. Посмотреть демо можно в мини-игреИгрок, Пуля, Враг, ФонВсе они унаследованы от Group.

License

MIT