찾다
웹 프론트엔드H5 튜토리얼HTML5 캔버스는 그리기 프로그램을 구현합니다(코드 포함).

이 글은 HTML5 캔버스 구현 그리기 프로그램(코드 포함)을 소개합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

프로젝트 소개

전체 프로젝트는 두 부분으로 나누어집니다

  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)
  }
}

속성:

options는 모든 도면 속성을 저장합니다#🎜🎜 ##🎜 🎜#

fillStyle: 그림을 채우는 데 사용되는 색상, 그라데이션 또는 패턴을 설정하거나 반환합니다.
  1. 스트로크 스타일: 설정 또는 획에 사용된 색상, 그라데이션 또는 패턴을 반환합니다.
  • lineWidth: 현재 선 너비를 설정하거나 반환합니다.

  • # 🎜🎜# getContext("2d") 개체의 모든 기본 속성이 사용됩니다. 여기에는 이 세 가지 속성만 나열되며 필요한 경우 확장할 수 있습니다.
    • 필요한 경우 계속 확장 가능
    • 메서드 :

    • setStyle 메서드는 현재 스프라이트의 속성을 재설정하는 데 사용됩니다.
  • #🎜🎜 ##🎜🎜 #필요하다면 계속 확장하세요

모든 엘프는 Element 클래스를 상속받습니다.
  1. Subclass

하위 클래스는 각 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) = 3
  }
}
  • arc() 메서드는 호/곡선을 만듭니다(원 또는 부분 원을 만드는 데 사용됨)

  • x 원 중심의 x 좌표 .

  • y 원 중심의 y 좌표입니다.

    r 원의 반경입니다.

    sAngle 시작 각도(라디안)입니다. (호 원의 3시 위치는 0도입니다.)

    • eAngle 라디안 단위로 측정된 끝 각도입니다.

    • 반시계방향 선택사항. 플롯을 시계 반대 방향으로 그릴지 시계 방향으로 그릴지를 지정합니다. 거짓 = 시계 방향, 참 = 시계 반대 방향.

    • 참고:

    • 생성자의 형식 매개변수 두 개만 필요하며, 이는 앵커 포인트입니다. 좌표.

    • 다른 모든 형식 매개변수에는 기본값이 있어야 합니다.

    • 모든 메소드의 호출 타이밍

    캔버스에 요소를 그릴 때 resize 메소드를 호출합니다.

    • 요소를 이동할 때 moveTo 메소드를 호출하세요.

    • choose는 현재 요소가 선택되었는지 확인하기 위해 마우스를 누를 때 호출됩니다.

    getOffset은 선택한 위치를 결정하기 위해 요소를 선택할 때 호출됩니다.

    • draw 그리기 함수는 장면에 요소를 그릴 때 호출됩니다.

    • 장면 장면 구현

    • 속성 소개
    • # 🎜🎜 #####rreee#🎜🎜 ## ## #####이벤트 로직#🎜🎜 ## #####
    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
        /* .... */
      }
    }
    #🎜🎜 ######메소드 소개# 🎜🎜#
  • class Sence {
      constructor(id, options = {
        width: 600,
        height: 400
      }) {
      /* ... */
      // 监听事件
        this.canvas.addEventListener('contextmenu', (e) => {
          console.log(e)
        })
        // 鼠标按下时的处理逻辑
        this.canvas.addEventListener('mousedown', (e) => {
        // 只有左键按下时才会处理鼠标事件
          if (e.button === 0) {
          // 鼠标的位置
            let x = e.offsetX
            let y = e.offsetY
            // 记录鼠标是否按下
            this.mouseState.down = true
            // 创建一个临时target
            // 记录目标元素
            let target = null
            if (this.state === this.stateList.drawing) {
            // 判断当前有没有精灵构造器,有的话就构造一个对应的精灵元素
              if (this.currentSpriteConstructor) {
                target = new this.currentSpriteConstructor(x, y)
              }
            } else if (this.state === this.stateList.moving) {
              let sprites = this.sprites
              // 遍历所有的精灵,调用他们的choose方法,判断有没有被选中
              for (let i = sprites.length - 1; i >= 0; i--) {
                if (sprites[i].choose(x, y)) {
                  target = sprites[i]
                  break;
                }
              }
              
              // 如果选中的话就调用target的getOffset方法,获取偏移量
              if (target) {
                let offset = target.getOffset(x, y)
                this.mouseState.offsetX = offset.x
                this.mouseState.offsetY = offset.y
              }
            }
            // 存储当前目标元素
            this.mouseState.target = target
            // 在离屏canvas保存除目标元素外的所有元素
            let ctx = this.outCtx
            // 清空离屏canvas
            ctx.clearRect(0, 0, this.width, this.height)
            // 将目标元素外的所有的元素绘制到离屏canvas中
            this.sprites.forEach(item => {
              if (item !== target) {
                item.draw(ctx)
              }
            })
            if(target){
                // 开始动画
                this.anmite()
            }
          }
        })
        this.canvas.addEventListener('mousemove', (e) => {
        //  如果鼠标按下且有目标元素,才执行下面的代码
          if (this.mouseState.down && this.mouseState.target) {
            let x = e.offsetX
            let y = e.offsetY
            if (this.state === this.stateList.drawing) {
            // 调用当前target的resize方法,改变大小
              this.mouseState.target.resize(x, y)
            } else if (this.state === this.stateList.moving) {
            // 取到存储的偏移量
              let {
                offsetX, offsetY
              } = this.mouseState
              // 调用moveTo方法将target移动到新的位置
              this.mouseState.target.moveTo(x - offsetX, y - offsetY)
            }
          }
        })
        document.body.addEventListener('mouseup', (e) => {
          if (this.mouseState.down) {
          // 将鼠标按下状态记录为false
            this.mouseState.down = false
            if (this.state === this.stateList.drawing) {
            // 调用target的validate方法。判断他要不要被加到场景去呢
              if (this.mouseState.target.validate()) {
                this.sprites.push(this.mouseState.target)
              }
            } else if (this.state === this.stateList.moving) {
              // 什么都不做
            }
          }
        })
      }
    }
    추천 관련 글:
  • canvasQR 코드 및 이미지 합성 코드 구현 방법

    #🎜 🎜 #
  • HTML5 Canvas는 대화형 지하철 노선도를 구현합니다

    위 내용은 HTML5 캔버스는 그리기 프로그램을 구현합니다(코드 포함).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    H5는 무엇을 언급합니까? 맥락 탐색H5는 무엇을 언급합니까? 맥락 탐색Apr 12, 2025 am 12:03 AM

    h5referstohtml5, apivotaltechnologyinwebdevelopment.1) html5introducesnewelements 및 dynamicwebapplications.2) itsupp ortsmultimediawithoutplugins, enovannangeserexperienceacrossdevices.3) SemanticLementsImproveContentsTructUreAndSeo.4) H5'Srespo

    H5 : 도구, 프레임 워크 및 모범 사례H5 : 도구, 프레임 워크 및 모범 사례Apr 11, 2025 am 12:11 AM

    H5 개발에서 마스터 해야하는 도구 및 프레임 워크에는 vue.js, React 및 Webpack이 포함됩니다. 1.vue.js는 사용자 인터페이스를 구축하고 구성 요소 개발을 지원하는 데 적합합니다. 2. 복잡한 응용 프로그램에 적합한 가상 DOM을 통해 페이지 렌더링을 최적화합니다. 3. Webpack은 모듈 포장에 사용되며 리소스로드를 최적화합니다.

    HTML5의 유산 : 현재 H5 이해HTML5의 유산 : 현재 H5 이해Apr 10, 2025 am 09:28 AM

    html5hassignificallytransformedwebdevelopmentbyintranticalticlementements, 향상 Multimediasupport 및 Improvingperformance.1) itmadewebsitessmoreaccessibleadseo 친환경적 인 요소, 및 .2) Html5intagnatee

    H5 코드 : 접근성 및 시맨틱 HTMLH5 코드 : 접근성 및 시맨틱 HTMLApr 09, 2025 am 12:05 AM

    H5는 시맨틱 요소 및 ARIA 속성을 통해 웹 페이지 접근성 및 SEO 효과를 향상시킵니다. 1. 컨텐츠 구조를 구성하고 SEO를 개선하기 위해 사용합니다. 2. Aria-Label과 같은 ARIA 속성은 접근성을 향상시키고 보조 기술 사용자는 웹 페이지를 원활하게 사용할 수 있습니다.

    H5는 html5와 동일합니까?H5는 html5와 동일합니까?Apr 08, 2025 am 12:16 AM

    "H5"와 "HTML5"는 대부분의 경우 동일하지만 특정 시나리오에서는 다른 의미를 가질 수 있습니다. "HTML5"는 새로운 태그와 API를 포함하는 W3C 정의 표준입니다. "H5"는 일반적으로 HTML5의 약어이지만 모바일 개발에서는 HTML5를 기반으로 한 프레임 워크를 참조 할 수 있습니다. 이러한 차이를 이해하면 프로젝트 에서이 용어를 정확하게 사용하는 데 도움이됩니다.

    H5의 기능은 무엇입니까?H5의 기능은 무엇입니까?Apr 07, 2025 am 12:10 AM

    H5 또는 HTML5는 HTML의 다섯 번째 버전입니다. 개발자에게 더 강력한 도구 세트를 제공하여 복잡한 웹 애플리케이션을보다 쉽게 ​​만들 수 있습니다. H5의 핵심 기능에는 다음이 포함됩니다. 1) 웹 페이지에 그래픽 및 애니메이션을 그리는 요소; 2) 웹 페이지 구조를 SEO 최적화에 명확하고 도움이되는 시맨틱 태그 등; 3) GeolocationApi 지원 위치 기반 서비스와 같은 새로운 API; 4) 호환성 테스트 및 폴리 필 라이브러리를 통해 크로스 브라우저 호환성을 보장해야합니다.

    H5 링크를 수행하는 방법H5 링크를 수행하는 방법Apr 06, 2025 pm 12:39 PM

    H5 링크를 만드는 방법? 링크 대상 결정 : H5 페이지 또는 응용 프로그램의 URL을 가져옵니다. HTML 앵커 작성 : & lt; a & gt; 태그 앵커를 만들고 링크 대상 URL을 지정합니다. 링크 속성 설정 (선택 사항) : 필요에 따라 대상, 제목 및 on 클릭 속성을 설정하십시오. 웹 페이지에 추가 : 링크가 나타나려는 웹 페이지에 HTML 앵커 코드를 추가하십시오.

    H5 호환성 문제를 해결하는 방법H5 호환성 문제를 해결하는 방법Apr 06, 2025 pm 12:36 PM

    H5 호환성 문제에 대한 솔루션에는 다음이 포함됩니다. 웹 페이지가 화면 크기에 따라 레이아웃을 조정할 수있는 반응 형 디자인을 사용합니다. 릴리스 전에 호환성을 테스트하기 위해 브라우저 크로스 브라우저 테스트 도구를 사용하십시오. PolyFill을 사용하여 이전 브라우저의 새로운 API를 지원합니다. 웹 표준을 따르고 효과적인 코드 및 모범 사례를 사용하십시오. CSS 프리 프로세서를 사용하여 CSS 코드를 단순화하고 가독성을 향상시킵니다. 이미지를 최적화하고 웹 페이지 크기를 줄이며로드 속도를 높이십시오. HTTPS를 통해 웹 사이트의 보안을 보장하십시오.

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    맨티스BT

    맨티스BT

    Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

    Dreamweaver Mac版

    Dreamweaver Mac版

    시각적 웹 개발 도구

    ZendStudio 13.5.1 맥

    ZendStudio 13.5.1 맥

    강력한 PHP 통합 개발 환경

    MinGW - Windows용 미니멀리스트 GNU

    MinGW - Windows용 미니멀리스트 GNU

    이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.