专注于移动端互动页面的2Dcanvas框架--canvasWF(更新中)

canvasWF是一款专为前端开发者设计的轻量级Canvas框架,旨在保持小包体的同时,提供快速开发Canvas应用的能力。它支持资源注册、动画、按钮及碰撞检测等特性,适合互动页面开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

目的

优缺点

优势

缺点 

地址 

框架的使用

资源注册器       

Game

Spirit

Text

DOTween

Button

canvas的创建

css对canvas的设置


目的

这个框架的目的是为了,让前端的开发者能够在保证包体尽可能小的情况下,让前端的开发人员快速的开发完成canvas的相关需求。下面给玩家提供一些在互动页面常常使用到的关于围绕image与font的相关API。简介从而让大家快速上手与使用。

优缺点

优势

其实我并不感觉自己在架构上构造,性能上会有超越其他的游戏canvas框架,主要是包体相比会变的小一些。目前在未打包的情况下是文件的大小是98kb(现在是114kb)。中文注释,同时代码量很少。大家也很容易对其进行修改。成本低

缺点 

目前还在进化中,版本的api的使用可能会更换。特别是最近。趁着年假期间。

还有个就是创建canvas的设置。大小与像素比。使用的是css与标签

为了防止canvas渲染出来的会模糊于是使用的是二倍图

目前采用css来设置canvas的大小。单位使用rem。基于365x667  (font-size: 20px)

同时代码也有很多可以进行优化的地方。性能可以提升,我在之后会将需要的基础功能添加完毕之后,着手性能的提升。

当然canvasWF使用了离屏渲染技术。

同时适配也做好了,你只需要按照正常开发就可以了

API文档: https://www.yuque.com/books/share/5507fd4a-3550-41b7-ab61-0f3fd2c8d806?# 《canvasWF文档》  正在更新中

API文档:ShowDoc   正在更新中

地址 

gitLub:GitHub - soGooday/canvasWF: 带你快速的搭建一个你,美术或者测试都喜欢的UI界面,同时提供特效,按钮,碰撞检测,DOTween动画

框架的使用

这个canvas的互动框架主要是由下面及部分组成。

目前为止更新完了。锚点与父子层级系统。大部分基本生的功能就已经齐全了。 

资源注册器       

ResList.js的脚本:地址:https://github.com/soGooday/canvasWF/blob/master/src/ResList.js

主要是对图片的素材进行注册使用。ResList.js脚本具体放在什么目录下看你自己的需求。只要使用的时候,能引用的到就好


//创建加载资源列表 set格式 key value 一一对应
export const ResList = new Set([
    ['bg','./images/bg.png'], 
    ['bg1','./images/bg1.png'], 
    ['c1','./images/c1.png'], 
    ['c2','./images/c2.png'], 
]);

当前的资源仅仅支持的是image的素材。并且以key与value的形式存放起来。这样在我们之后使用图片的时候,就直接通过设置key从而确定我们想要渲染的是哪一样图片。

Game

核心脚本是Game,因为canvas核心渲染在这个脚本里面

gitlub地址:https://github.com/soGooday/canvasWF/blob/master/src/js/base/Game.js

//假如当前的脚本为index.js

import {Game} from './js/base/Game';//引入Game脚本
import {ResList} from './ResList'; //引入资源注册器

//然后使用得到Game中的单例  --说明:关于对canvas的标签的创与适配。分别放在了index.html与css中
//canvas的配置设置
let gameoConfig={ 
    canvasId:'demo',//html中设置的canvas的id
    type:'canvas',//使用的类型 目前就这一个选项 后期可能会添加webgl
    create:this.create,//资源加载完毕后加载的回调方法 -可以不是这个名字
   // updata:this.updata,//实时回调更新函数 --不是用可以不写,节省性能 可以不是这个名字
    actionScope:this,//作用域传入 当前的作用域传入
}
this.game =  Game.getInstance(gameoConfig);//取到game单利  
this.game.loadRes(ResList);//将资源列表中的资源添加进来.当如才加载完毕会执行 create中的相关指令。这样我们就可以渲染素材了
 

Spirit

主角之一的Spirit了,用于素材的展示。可使添加使用DOTween, Collision,Button三种组件

关于素材的宽高设置,代码中使用的素材本身的宽与高。

gitLub地址:https://github.com/soGooday/canvasWF/blob/master/src/js/base/Spirit.js  里面会有更多的api的使用方法

//加入当前的脚本为index.js

import {Game} from './js/base/Game';//引入Game脚本
import {ResList} from './ResList'; //引入资源注册器

//然后使用得到Game中的单例  --说明:关于对canvas的标签的创与适配。分别放在了index.html与css中
let gameoConfig={ 
    canvasId:'demo',//html中设置的canvas的id
    type:'canvas',//使用的类型 目前就这一个选项 后期可能会添加webgl
    create:this.create,//资源加载完毕后加载的方法 
   // updata:this.updata,//实时更新函数 --不是用可以不写,节省性能
    actionScope:this,//作用域传入 当前的作用域传入
}
this.game =  Game.getInstance(gameoConfig);//取到game单利  
this.game.loadRes(ResList);//将资源列表中的资源添加进来.当如才加载完毕会执行 create中的相关指令。这样我们就可以渲染素材了
create(){ 
        //创建一幢背景图的素材  前两个的参数只素材的坐标位置 最后一个就是有两个作用
        //第一是资源注册器中的key
        //这个是用来识别创素材的唯一标识使用了。
        //在渲染,机器销毁时候,会使用到
        this.Bg = this.game.createSprite(0,0,'bg');//创建一个单一游戏体的背景图        
        //这样我们就可以渲染一个图片的素材了
    
}

Text

主角之一的Font字体的展示 目前可使用DOTween组件。(目前并不支持Collision,Button)。其实添加支持很容易。只是一般不太会对字体使用这两个组件

gitLub地址:https://github.com/soGooday/canvasWF/blob/master/src/js/base/Text.js  里面会有更多的api的使用方法

//加入当前的脚本为index.js

import {Game} from './js/base/Game';//引入Game脚本
import {ResList} from './ResList'; //引入资源注册器

//然后使用得到Game中的单例  --说明:关于对canvas的标签的创与适配。分别放在了index.html与css中
let gameoConfig={ 
    canvasId:'demo',//html中设置的canvas的id
    type:'canvas',//使用的类型 目前就这一个选项 后期可能会添加webgl
    create:this.create,//资源加载完毕后加载的方法 
   // updata:this.updata,//实时更新函数 --不是用可以不写,节省性能
    actionScope:this,//作用域传入 当前的作用域传入
}
this.game =  Game.getInstance(gameoConfig);//取到game单利  
this.game.loadRes(ResList);//将资源列表中的资源添加进来.当如才加载完毕会执行 create中的相关指行 create中的相关指令。这样我们就可以渲染素材了
create(){ 
        //前两个的参数是 xy的坐标 后面是表示key。这个是用来识别创建字体的唯一标识使用了。  
        //在渲染,机器销毁时候,会使用到
        let text = Game.createFontS(376,200,'text');
        text.fontContent("测试位置");//设置字体的内容
        text.fontSize(60).fontColor('#000000');//字体的色号
        text.fontTextAlign('center'); //水平的模式
}

DOTween

 组件DOTween。主要用于字体与图片的动画效果。目前支持的有 。我的另一篇文章(可点击)。   

gitLab地址:https://github.com/soGooday/canvasWF/blob/master/src/js/base/DOTween.js里面会有更多的api的使用方法

Linear:线性匀速运动效果;
Quadratic:二次方的缓动(t^2);
Cubic:三次方的缓动(t^3);
Quartic:四次方的缓动(t^4);
Quintic:五次方的缓动(t^5);
Sinusoidal:正弦曲线的缓动(sin(t));
Exponential:指数曲线的缓动(2^t);
Circular:圆形曲线的缓动(sqrt(1-t^2));
Elastic:指数衰减的正弦曲线缓动;
Back:超过范围的三次方缓动((s+1)*t^3 – s*t^2);
Bounce:指数衰减的反弹缓动。
每个效果都分三个缓动方式,分别是:
 
easeIn:从0开始加速的缓动,也就是先慢后快;
easeOut:减速到0的缓动,也就是先快后慢;
easeInOut:前半段从0开始加速,后半段减速到0的缓动。

//加入当前的脚本为index.js

import {Game} from './js/base/Game';//引入Game脚本
import {Ease,loopType} from './js/base/DOTween'//引入Ease loopType用于设置动画组件 
import {ResList} from './ResList'; //引入资源注册器

//然后使用得到Game中的单例  --说明:关于对canvas的标签的创与适配。分别放在了index.html与css中
let gameoConfig={ 
    canvasId:'demo',//html中设置的canvas的id
    type:'canvas',//使用的类型 目前就这一个选项 后期可能会添加webgl
    create:this.create,//资源加载完毕后加载的方法 
   // updata:this.updata,//实时更新函数 --不是用可以不写,节省性能
    actionScope:this,//作用域传入 当前的作用域传入
}
this.game =  Game.getInstance(gameoConfig);//取到game单利  
this.game.loadRes(ResList);//将资源列表中的资源添加进来.当如才加载完毕会执行 create中的相关指会执行 create中的相关指令。这样我们就可以渲染素材了
create(){ 
        //前两个的参数是 xy的坐标 后面是表示key。这个是用来识别创建字体的唯一标识使用了。  
        //在渲染,机器销毁时候,会使用到
        let text = Game.createFontS(376,200,'text');
        text.fontContent("测试位置");//设置字体的内容
        text.fontSize(60).fontColor('#000000');//字体的色号
        text.fontTextAlign('center'); //水平的模式
        let textAnimaiton = text.addComponent('DOTween');//给字体使用DOTween动画
           textAnimaiton.DOScale().from({x:0.5,y:0.5}).to({x:1.5,y:1.5}).setEase(Ease.Quad.easeInOut)
            .setUseTime(1000)
            .setLoops(2,loopType.pingqang) 
            .setDelayed(0)
            .onComplete(()=>{console.log('当前的动画执行完毕了!',text.x)})//当前的动画执行完毕的回调
            .everyFrame((index)=>{console.log(index)})//期间的每帧动画的回调
            .DOAnimation();
}
//参数

Button

组件Button.目前支持的事件

gitLab地址:https://github.com/soGooday/canvasWF/blob/master/src/js/base/Button.js里面会有更多的api的使用方法

//加入当前的脚本为index.js

import {Game} from './js/base/Game';//引入Game脚本
import {ResList} from './ResList'; //引入资源注册器

//然后使用得到Game中的单例  --说明:关于对canvas的标签的创与适配。分别放在了index.html与css中
let gameoConfig={ 
    canvasId:'demo',//html中设置的canvas的id
    type:'canvas',//使用的类型 目前就这一个选项 后期可能会添加webgl
    create:this.create,//资源加载完毕后加载的方法 
   // updata:this.updata,//实时更新函数 --不是用可以不写,节省性能
    actionScope:this,//作用域传入 当前的作用域传入
}
this.game =  Game.getInstance(gameoConfig);//取到game单利  
this.game.loadRes(ResList);//将资源列表中的资源添加进来.当如才加载完毕会执行 create中的相关指令。这样我们就可以渲染素材了
create(){ 
        //创建一幢背景图的素材  前两个的参数只素材的坐标位置 最后一个就是有两个作用
        //第一是资源注册器中的key
        //这个是用来识别创素材的唯一标识使用了。
        //在渲染,机器销毁时候,会使用到
        this.Bg = this.game.createSprite(0,0,'bg');//创建一个单一游戏体的背景图        
        //这样我们就可以渲染一个图片的素材了
        let  bgButton = this.Bg.addComponent('Button'); //给背景图添加上button的按钮即可
        bgButton.addEventClick(()=>{
            console.log('点击了按钮的事件')
        })
    
}

canvas的创建

首先是再html中创建一个canvas的标签

gitLab地址:我是模板文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>我是模板文件</title>
    <script>
        //适配使用
        var docEl = document.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function () {
            var clientWidth = docEl.clientWidth || 375;
            clientWidth > 750 ? clientWidth = 750 : clientWidth = clientWidth;
            if (clientWidth){
                const fz = docEl.style.fontSize = 20 * (clientWidth / 375);
                docEl.style.fontSize = 20 * (clientWidth / 375) + 'px';
                window.remscale = clientWidth / 375;
                var realfz = ~~(+window.getComputedStyle(document.getElementsByTagName("html")[0]).fontSize.replace('px','')*10000)/10000
                if (fz !== realfz) {
                    document.getElementsByTagName("html")[0].style.cssText = 'font-size: ' + fz * (fz / realfz) +"px";
                }

            }
        };
        if (document.addEventListener){
            window.addEventListener(resizeEvt, recalc, false);
            document.addEventListener('DOMContentLoaded', recalc, false);
        } 
    </script> 
</head>
<body> 
    //创建一个canvas
    <canvas id="demo"></canvas> 
</html>

css对canvas的设置

 gitLab地址:https://github.com/soGooday/canvasWF/blob/master/src/index.css


//当前素材是二倍的素材 
#demo{
    width: 18.75rem;// = 375/20
    height: 33.375rem;  // = 667/20
} 
 
 

 

(持续更新中....)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值