• 周五. 4月 26th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

关于pixijs使用时遇到的问题

admin

11月 28, 2021

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

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

// 创建应用
// document传的是你要画这个应用的元素 比如<div ref='testPage'></div>就传this.$refs.answering
function createApplication (document) {
    const resolution = 2
    let app = new PIXI.Application({
         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使用时遇到的问题》有2个想法
  1. Wow, amazing weblog layout! How lengthy have you ever been running a blog
    for? you made blogging glance easy. The total
    look of your website is great, as neatly as the content material!

    You can see similar here najlepszy sklep

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注