ホームページ > ウェブフロントエンド > H5 チュートリアル > HTML5キャンバスに描画プログラムを実装(コード付き)

HTML5キャンバスに描画プログラムを実装(コード付き)

不言
リリース: 2018-08-01 13:49:11
オリジナル
4260 人が閲覧しました

この記事では、HTML5 キャンバスの描画プログラム (コード付き) を紹介します。必要な方は参考にしていただければ幸いです。

プロジェクトの紹介

プロジェクト全体は2つの部分に分かれています

  1. シーン
    シーンはキャンバス制御、イベント監視、アニメーション処理を担当します

  2. Elf
    Elfは、キャンバスのすべての要素を指します。描画

デモデモアドレス

プロジェクトの特徴

強力なスケーラビリティ

スプライトエルフの実装

親クラス

class Element {
  constructor(options = {
    fillStyle: 'rgba(0,0,0,0)',
    lineWidth: 1,
    strokeStyle: 'rgba(0,0,0,255)'
  }) {
    this.options = options
  }
  setStyle(options){
    this.options =  Object.assign(this.options. options)
  }
}
ログイン後にコピー
  1. 属性:

  • オプション すべてを保存します描画プロパティ

    • fillStyle: ペイントの塗りつぶしに使用される色、グラデーション、またはパターンを設定または返します

    • ストロークスタイル: ストロークに使用される色、グラデーション、またはパターンを設定または返します

    • lineWidth: 設定または返し現在の線幅

    • は、getContext("2d") オブジェクトのネイティブ プロパティを使用します。ここにはこれら 3 つのプロパティのみがリストされており、必要に応じて拡張できます。

  • 必要に応じて展開を続けることができます

  1. メソッド:

  • setStyleメソッドは現在のスプライトの属性をリセットするために使用されます

  • 必要に応じて展開を続けることができます

すべてのエルフはすべて Element クラスから継承します。

サブクラス

サブクラスは、各elf要素の特定の実装です。 ここでは、円弧/曲線を作成するためのCircle要素

class Circle extends Element {
  // 定位点的坐标(这块就是圆心),半径,配置对象
  constructor(x, y, r = 0, options) {
    // 调用父类的构造函数
    super(options)
    this.x = x
    this.y = y
    this.r = r
  }
  // 改变元素大小
  resize(x, y) {
    this.r = Math.sqrt((this.x - x) ** 2 + (this.y - y) ** 2)
  }
  // 移动元素到新位置,接收两个参数,新的元素位置
  moveTo(x, y) {
    this.x = x
    this.y = y
  }
  // 判断点是否在元素中,接收两个参数,点的坐标
  choose(x, y) {
    return ((x - this.x) ** 2 + (y - this.y) ** 2) < (this.r ** 2)
  }
  // 偏移,计算点和元素定位点的相对偏移量(ofsetX, offsetY)
  getOffset(x, y) {
    return {
      x: x - this.x,
      y: y - this.y
    }
  }
  // 绘制元素实现,接收一个ctx对象,将当前元素绘制到指定画布上
  draw(ctx) {
    // 取到绘制所需属性
    let {
      fillStyle,
      strokeStyle,
      lineWidth
    } = this.options
    // 开始绘制beginPath() 方法开始一条路径,或重置当前的路径
    ctx.beginPath()
    // 设置属性
    ctx.fillStyle = fillStyle
    ctx.strokeStyle = strokeStyle
    ctx.lineWidth = lineWidth
    // 画圆
    ctx.arc(this.x, this.y, this.r, 0, 2 * Math.PI)
    // 填充颜色
    ctx.stroke()
    ctx.fill()
    // 绘制完成
  }
  // 验证函数,判断当前元素是否满足指定条件,此处用来检验是否将元素添加到场景中。
  validate() {
    return this.r >= 3
  }
}
ログイン後にコピー

arc()メソッドの実装を紹介します(円または部分円を作成するために使用されます)

  • x 円の中心の x 座標。

  • y 円の中心の y 座標。

  • r 円の半径。

  • sAngle 開始角度 (ラジアン単位)。 (円弧の円の 3 時の位置は 0 度です)。

  • eAngle 終了角度 (ラジアン単位)。

  • 反時計回り オプション。プロットを反時計回りに描画するか時計回りに描画するかを指定します。 False = 時計回り、True = 反時計回り。

注:

  • コンストラクターの仮パラメータは 2 つだけ必要で、それはアンカーポイントの座標です。

  • 他の仮パラメータにはデフォルト値が必要です。

全メソッドの呼び出しタイミング

  • キャンバス上に要素を描画する際にresizeメソッドを呼び出します。

  • 要素を移動するときに moveTo メソッドを呼び出します。

  • choose は、マウスが押されたときに呼び出され、現在の要素が選択されているかどうかを判断します。

  • getOffset は、要素が選択されると、選択された位置を決定するために呼び出されます。

  • draw 描画関数。シーンに要素を描画するときに呼び出されます。

シーンシーンの実装

  1. プロパティの紹介

イベントロジック
  1. メソッドの紹介

class Sence {
  constructor(id, options = {
    width: 600,
    height: 400
  }) {
    // 画布属性
    this.canvas = document.querySelector('#' + id)
    this.canvas.width = options.width
    this.canvas.height = options.height
    this.width = options.width
    this.height = options.height
    // 绘图的对象
    this.ctx = this.canvas.getContext('2d')
    // 离屏canvas
    this.outCanvas = document.createElement('canvas')
    this.outCanvas.width = this.width
    this.outCanvas.height = this.height
    this.outCtx = this.outCanvas.getContext('2d')
    // 画布状态
    this.stateList = {
      drawing: 'drawing',
      moving: 'moving'
    }
    this.state = this.stateList.drawing
    // 鼠标状态
    this.mouseState = {
    // 记录鼠标按下时的偏移量
      offsetX: 0,
      offsetY: 0,
      down: false, //记录鼠标当前状态是否按下
      target: null //当前操作的目标元素
    }
    // 当前选中的精灵构造器
    this.currentSpriteConstructor = null
    // 存储精灵
    let sprites = []
    this.sprites = sprites
    /* .... */
  }
}
ログイン後にコピー
    おすすめ関連記事:
  1. Canvas 2 の実装方法QRコードと画像合成用のコード

インタラクティブな地下鉄路線図を実装するためのHTML5 Canvas

以上がHTML5キャンバスに描画プログラムを実装(コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート