关于pixijs使用时遇到的问题

问题1:创建的图形和图片很模糊有锯齿;

解决方案:在创建应用的时候记得设置相关的属性,比如resolution,autoDensity,具体的创建应用方式我封装了个方法,如下

// 创建应用
// document传的是你要画这个应用的元素 比如<div ref='testPage'></div>就传this.$refs.answering
function createApplication (document) {
    const resolution = 2
    let app = new PIXI.Application({
        width: screenW/resolution, // 模糊的处理
        height: screenH/resolution, // 模糊的处理
        backgroundColor: 0xffffff,
        antialias: true,     // 消除锯齿
        transparent: false,  // 背景不透明
        resolution: resolution,       // 像素设置  模糊的处理
        autoDensity: true // 这属性很关键 模糊的处理
    });
    app.renderer.resize(screenW, screenH);
    document.appendChild(app.view)
    return app
}

问题2:怎么绘制渐变色的图形;

解决方案:我就奇怪了,为啥不给个属性来设置渐变色呢;最后实现是通过创建canvas来画的,还是封装了个方法,具体看代码

// 渐变图形
// fromColor起始颜色,toColor终点颜色, width绘制图形的宽度, height绘制图形的高度
function gradient(fromColor, toColor, width, height) {
    const c = document.createElement("canvas");
    c.width = width;
    c.height = height;
    const ctx = c.getContext("2d");
    const grd = ctx.createLinearGradient(0,0,0,h); // 第三个参数有值就是横向渐变,第四个有值就是纵向渐变,其它为0,其它值的情况自己百度了解下就好了
    grd.addColorStop(0, fromColor); //
    grd.addColorStop(1, toColor);
    ctx.fillStyle = grd;
    ctx.fillRect(0,0,width,height);
    return PIXI.Texture.from(c)
}

// 使用
const gradTexture = gradient('#5D87E8', '#203D97', 100, 100)
let rankBlueBg = new PIXI.Sprite(gradTexture)
rankBlueBg.width = 100
rankBlueBg.height = 100
rankBlueBg.position.set(0, 0)

 

问题3:绘制矩形时,如果有画边框,在安卓下会有一条线跑出来(但是圆形不会),好丑 

解决方案:这个不知道为啥,由于时间问题,最后和产品商量去掉边框线,注释了lineStyle()这一行

// 圆角矩形
btn = new PIXI.Graphics()
// btn.lineStyle(lineStyle.width,lineStyle.color,1) // 边线(宽度,颜色,透明度) 这个在安卓下会有一条线 存在兼容问题 用不了
btn.beginFill(fillColor.color,fillColor.alpha) // 填充
btn.drawRoundedRect(x,y,w,h,r) //x,y,w,h,圆角度数
btn.endFill()
btn.interactive = true // 是否可点击交互

 

问题4:绘制环形的倒计时动画

解决方案:这个官方例子也有,针对我这个答案的倒计时做了个修改(3秒显示题目类型,10秒答题时间)

// 绘制环形倒计时进度条
    generateSpinnerCountDown (position,radius,spinnerColor,endAngle,containerSelf) {
        const container = new PIXI.Container();
        container.position=position
        containerSelf.addChild(container);

        const base = new PIXI.Graphics()
        base.beginFill(spinnerColor);
        base.drawCircle(0,0,radius)
        base.endFill()

        const mask = new PIXI.Graphics();
        mask.position.set(0,0);
        base.mask = mask;

        container.addChild(base);
        container.addChild(mask);

        let phase = 0;
        let time = 28.8
        return (delta) => {
            // Update phase
            if (this.currentShowQustionType) {
                time = 28.74 // 类型3秒 这里根据性能调试了个最佳的值,也就是如果是3秒要绘制完 这里就是28.74 = 3*10 -1.26(有个差值,不然会太快绘制完成)
            } else {
                time = 97 // 答题10秒 这里根据性能调试了个最佳的值
            }
            phase += delta / time;
            phase %= (Math.PI * 2);

            const angleStart = 0 - Math.PI / 2;
            const angle = phase + angleStart;
            const radius1 = radius;
            const x1 = Math.cos(angleStart) * radius1;
            const y1 = Math.sin(angleStart) * radius1;
            // Redraw mask
            if (this.totalTime>0) {
                mask.clear();
                mask.lineStyle(2, 0xff0000, 1);
                mask.beginFill(0xff0000, 1);
                mask.moveTo(0, 0);
                mask.lineTo(x1, y1);
                mask.arc(0, 0, radius1, angleStart, angle, false);
                mask.lineTo(0, 0);
                mask.endFill();
            }
        }
    }

// 使用
const onTick = [
this.generateSpinnerCountDown(new PIXI.Point(x+rectageWidth/2,rectageHeight/2),radius,spinnerColor,endAngle,this.renderTimeContainerSelf)];
this.app.ticker.add((delta) => { // ticker动画
    onTick.forEach((cb) => {
          cb(delta);
    });
});

pixijs demo地址:pixijs.io 

未完待续...... 

posted @ 2021-08-02 18:33  Cassie、  阅读(1763)  评论(0编辑  收藏  举报