Laya Sprite

游戏中Sprite精灵是在屏幕中能够被控制的显示对象,如果屏幕中的显示对象不能被控制那就只是一个节点。准确来说,Sprite精灵是一个能够通过改变自身属性,比如角度、位置、伸缩、颜色等,变为可控动画的2D图像。

结构描述
Packagelaya.display.Sprite
ClassLaya.Sprite
InheritanceSprite / Node / EventDispatcher / Object

Sprite是基础的显示图形的显示列表节点,LayaAir引擎核心显示类只有一个Sprite类,Sprite会针对不同情况自动渲染优化。Laya.Sprite类位于Core核心类库中,是laya.display.Sprite类封装后形成的。

创建精灵对象实例

let sprite = new Laya.Sprite();
属性描述
autoSize:boolean=false指定是否自动计算宽高尺寸,默认为false
hitTestPrior:boolean = false指定鼠标事件检测是否优先检测自身
mouseThrough:boolean = false鼠标事件与当前对象的碰撞检测是否可以穿透
autoSize:boolean = true;

精灵的宽高默认为0,不会随着绘制内容的变化而变化,如果想要根据绘制内容获取宽高,可以设置autoSize属性为true,或通过getBounds()方法获取,不过开启autoSize后会影响性能。

getBounds():Rectangle

Sprite默认没有宽高,可通过getBounds()获取本对象在父容器坐标系中的矩形显示区域,也可手工设置autoSize = true,指定自动计算宽高尺寸,然后再获取精灵的宽高。

Sprite的宽高一般用于碰撞检测和排版,并不影响显示图片大小,如需更改显示图像大小,可使用缩放属性scaleXscaleYscale

  • Sprite默认不接收鼠标事件

Sprite默认不接收鼠标事件,即mouseEnabled = false。只要对其监听任意鼠标事件,都会自动打开自己以及所有父对象的mouseEnabled = true,因此无需手工设置mouseEnabled属性。

容器

Sprite是容器类,能够作为其它显示对象的容器,用来添加多个子节点。

class Test {
    constructor() {
        Laya.init(Laya.Browser.width, Laya.Browser.height, Laya.WebGL);
        this.onInit();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    onInit(){
        this.ATLAS_PATH = "./res/atlas/avatar.atlas";
        Laya.loader.load(this.ATLAS_PATH, Laya.Handler.create(this, function(){
            // Sprite容器类作为其它显示对象的容器,用来添加多个子节点。
            let container = new Laya.Sprite();
            // 容器添加子节点
            let sprite;
            for(let i=1; i<5; i++){
                sprite = new Laya.Sprite().loadImage(`avatar/avatar${i}.png`);
                sprite.pivot(55, 72).pos(Math.cos(Math.PI/2*i)*150, Math.sin(Math.PI/2*i)*150);
                container.addChild(sprite);
            }
            // 通过控制容器改变自身以及子级外观
            container.pos(Laya.stage.width/2, Laya.stage.height/2);
            Laya.stage.addChild(container);
        }));
    }
}
//启动
new Test();

加载图片 loadImage

方法描述
loadImage(url:string, complete?:Handler):Sprite加载并显示单张图片,相当于加载图片后设置纹理texture属性。

图片的显示是游戏开发的基础,LayaAir中提供两种方式用于显示图片分别是Sprite.loadImageGraphics.drawTexture方法。

/**
* 加载并显示一个图片。
* 相当于加载图片后,设置texture属性。
* 注意:2.0改动:多次调用,只会显示一个图片(1.0会显示多个图片),x,y,width,height参数取消。
* @param url       图片地址。
* @param complete  (可选)加载完成回调。
* @return  返回精灵对象本身。
*/
loadImage(url: string, complete?: Handler): Sprite;

直接加载外部图片并获取精灵纹理图片的信息

class Test {
    constructor() {
        Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
        this.initStage();
        this.run();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    run(){
        this.createSprite("res/image/bomb.png");
    }
    createSprite(url){
        this.sprite = new Laya.Sprite();
        // 加载并显示一个图片
        this.sprite.loadImage(url, Laya.Handler.create(this, this.onLoadedImage, [url]));
        this.sprite.pos(Laya.stage.width >> 1, Laya.stage.height >> 1);
        // 添加到舞台
        Laya.stage.addChild(this.sprite);
    }
    //加载图片完毕后触发
    onLoadedImage(url){
        //获取加载的纹理图片
        this.texture = Laya.loader.getRes(url);
        console.log(this.texture, this.texture.width, this.texture.height);//61 55
        //设置
    }
}
//启动
new Test();

从缓冲区读取图片

class Test {
    constructor() {
        Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
        this.initStage();
        this.loadAssets();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    loadAssets(){
        this.AVATAR_PATH = "./res/atlas/avatar.png";
        this.CARD_PATH = "./res/atlas/card.png";

        let assets = [];
        assets.push(this.AVATAR_PATH);
        assets.push(this.CARD_PATH);

        Laya.loader.load(assets, Laya.Handler.create(this, this.onAssetsLoaded));
    }
    onAssetsLoaded(isLoaded){
        if(isLoaded){
            this.sprite = new Laya.Sprite();
            //清空绘制
            this.sprite.graphics.clear();
            //获得新的图片资源重新绘制
            this.sprite.loadImage(this.AVATAR_PATH);
            //设置精灵的轴心点会影响对象位置,缩放,旋转
            this.sprite.pivot(0, 0);
            //设置精灵的坐标值
            this.sprite.pos((Laya.stage.width - this.sprite.width)/2, (Laya.stage.height - this.sprite.height)/2);
            //let texture = Laya.loader.getRes(this.AVATAR_PATH);
            console.log(this.sprite.pivotX, this.sprite.pivotY);//0 0
            //向舞台中添加精灵
            Laya.stage.addChild(this.sprite);
        }
    }
}
//启动
new Test();

显示图集中的一张图片则图集必须先被加载

绘图对象 Graphics

Sprite精灵的graphics存取器是Graphics类的一个绘图对象

存取器描述
graphics绘图对象,封装了绘制位图和矢量图的接口,Sprite所有的绘图操作都是通过Graphics来实现的。

Graphics对象是比Sprite更为轻量级的对象,合理使用能提高性能,比如将大量的节点绘图调整为一个节点的Graphics命令集合,能减少大量节点创建的消耗。

结构描述
Packagelaya.display.Graphics
InheritanceGraphics

LayaAir通过Graphics类提供了绘制矢量图形的各种接口方法

方法描述
alpha(value:number):AlphaCmd用于设置绘图对象的透明度
clear(recoverCmds?:boolean):void清除绘制命令
destroy():void销毁绘图对象
绘图方法描述
draw9Grid()绘制九宫格
drawCircle()绘制圆形
drawCurves()绘制曲线
drawImage()绘制图片
drawLine()绘制单线条
drawLines()绘制多线条
drawPath()绘制路径
drawPie()绘制扇形
drawPoly()绘制多边形
drawRect()绘制矩形
drawTexture()绘制纹理,相比drawImage功能更为强大,性能更差。
drawTextures()批量绘制纹理
drawTriangles()绘制三角形

绘制纹理 drawTexture

使用Laya加载器加载图片完成后绘制纹理

//初始化引擎
const canvas = Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
//舞台设置
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;//设置舞台水平居中
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;//设置舞台垂直居中
Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;//设置舞台缩放模式为显示所有
Laya.stage.bgColor = "#000000";//设置舞台背景颜色为黑色

//图片路径
const imgPath = "./res/atlas/avatar.png";
//使用加载器加载图片
Laya.loader.load(imgPath, Laya.Handler.create(this, ()=>{
    //舞台添加精灵节点
    let sprite = new Laya.Sprite();
    Laya.stage.addChild(sprite);
    //精灵设置纹理并居中显示
    const res = Laya.loader.getRes(imgPath);
    const x = (Laya.stage.width-res.width)>>1;
    const y = (Laya.stage.height-res.height)>>1; 
    sprite.graphics.drawTexture(res, x, y);
}));

Graphics.drawTexture用于绘制纹理

graphics
get graphics():Graphics
set graphics(value: Graphics):void

绘图对象,封装了绘制位图和矢量图的接口,Sprite所有的绘图操作都是通过Graphics来实现的。

/**
 * 绘制纹理
 * 相比drawImage功能更为强大,性能会差一些。
 * @param texture:Texture 纹理
 * @param x:Number (default=0) 可选,X轴偏移量
 * @param y:Number (default=0) 可选,Y轴偏移量
 * @param width:Number (default=0) 可选,宽度
 * @param height:Number (default=0) 可选,高度
 * @param matrix:Matrix (default=null) 可选,矩阵信息
 * @param alpha:Number (default=1) 可选,透明度
 * @param color:String (default=null) 可选,颜色滤镜
 * @param blendMode:String (default=null) 可选,混合模式
*/
drawTexture(
  texture:Texture, 
  x:Number=0, 
  y:Number=0, 
  width:Number=0, 
  height:Number=0, 
  matrix:Matrix=null, 
  alpha:Number=1, 
  color:String=null, 
  blendMode:String=null
):DrawTextureCmd
class Test {
    constructor() {
        Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
        this.onInit();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    onInit(){
        this.AVATAR_PATH = "./res/atlas/avatar.png";

        Laya.loader.load(this.AVATAR_PATH, Laya.Handler.create(this, function(){
            let texture = Laya.loader.getRes(this.AVATAR_PATH);

            let sprite = new Laya.Sprite();
            //使用Graphics.drawTexture绘制纹理
            sprite.graphics.drawTexture(texture);

            Laya.stage.addChild(sprite);
        }));
    }
}
//启动
new Test();
4933701-9506e858c10d8a6f.png
图片显示

例如:切换图片,点击扑克牌,随机改变牌面值与花色。

4933701-1bc64a636b11d7ba.png
poker
class Test {
    constructor() {
        Laya.init(Laya.Browser.width, Laya.Browser.height, Laya.WebGL);
        this.onInit();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    onInit(){
        let assets = [];
        assets.push({type:Laya.Loader.ATLAS, url:"res/atlas/poker.atlas"});
        Laya.loader.load(assets, Laya.Handler.create(this, this.onAssetsLoaded));
    }
    onAssetsLoaded(){
        this.sprite = new Laya.Sprite();
        Laya.stage.addChild(this.sprite);

        this.sprite.pivot(55, 72);
        this.sprite.pos(Laya.stage.width/2, Laya.stage.height/2);

        this.onSpriteClick();
        this.sprite.on(Laya.Event.CLICK, this, this.onSpriteClick);
    }
    onSpriteClick(){
        this.sprite.graphics.clear();

        let suit = Math.floor(Math.random()*4);//花色
        let rank = (Math.floor(Math.random()*12) + 1).toString(16);//牌值

        let url = `poker/0x${suit}${rank}.png`;
        console.log(url);
        let texture = Laya.loader.getRes(url);

        this.sprite.graphics.drawTexture(texture, 0, 0);
        this.sprite.size(texture.width, texture.height);
    }
}
//启动
new Test();

如果加载的图片是多个图片所合成的图集文件,此时需要先引入图片后将容器状态修改为Clip切换类型,即可使用图片上的小图。

轴心点 pivot

项目类型描述
pivotX:Number存取器轴心点X轴坐标像素位置,默认为0。
pivotY:Number存取器轴心点Y轴坐标像素位置,默认为0。
pivot(x:Number, y:Number):Sprite方法设置轴心点,相当于分别设置pivotXpivotY属性。

什么是pivot轴心点呢?一个Sprite精灵对象默认的轴心点位于自身的左上角,使用pos(x, y)设置Sprite精灵的位置时默认是以左上角为基准进行定位的。

轴心点pivot和锚点anchor是同一个改变,都是基准点,决定着图片在舞台的位置。轴心点以像素为单位,默认XY坐标为(0,0)表示图片左上角作为基准点。锚点则是以图片的宽和高的倍数为单位,取值范围是0~1。当修改了Sprite对象设置默认轴心点,对Sprite对象设置位置pos、缩放scale、旋转rotation时,都是以轴心点为基准,而并非默认的Sprite对象左上角的坐标值。

  • 改变轴心点pivot可以控制旋转和缩放的中心
  • 轴心点pivot会影响对象位置、缩放中心、旋转中心
  • 精灵的pivot()用于设置轴心点,相当于分别设置精灵的pivotXpivotY属性。
// 设置轴心点,相当于分别设置pivotX和pivotY属性。
pivot(pivotX:Number, pivotY:Number):Sprite

// 轴心点X轴位置,单位像素默认为0。
pivotX:Number

//轴心点Y轴位置,单位像素默认为0.
pivotY:Number

例如:以精灵对象默认左上角为轴心点进行旋转

旋转图片前首先必须明确图片的轴心点pivot,精灵的默认轴心点是自己的左上角,比如使用pos(x,y)设置定位时默认是以精灵的左上角作为参考点的。

//初始化引擎
const canvas = Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
//舞台设置
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;//设置舞台水平居中
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;//设置舞台垂直居中
Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;//设置舞台缩放模式为显示所有
Laya.stage.bgColor = "#000000";//设置舞台背景颜色为黑色

//创建精灵
let sprite = new Laya.Sprite();
//图片路径
const imgPath = "./res/atlas/avatar.png";
//精灵加载图片
sprite.loadImage(imgPath);
//设置图片旋转
//设置帧动画,每隔1帧的时间执行回调函数
Laya.timer.frameLoop(1, this, ()=>{
    //设置精灵的旋转角度
    sprite.rotation += 0.5;
});

//舞台添加节点
Laya.stage.addChild(sprite);

例如:以精灵对象自身的中心点为轴心点进行旋转

class Test {
    constructor() {
        Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
        this.onInit();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    onInit(){
        this.sprite = new Laya.Sprite();
        //清空绘制
        this.sprite.graphics.clear();
        //绘制有边框的填充矩形
        this.sprite.graphics.drawRect(0, 0, 100, 100, "#CCFF00", "#FF0000", 5);
        //设置精灵对象相对于父容器的水平坐标值
        this.sprite.x = 200;
        //设置精灵对象相对于父容器的垂直坐标值
        this.sprite.y = 200;
        //设置精灵对象的宽高
        this.sprite.width = 100;
        this.sprite.height = 100;
        //设置精灵对象水平轴心点坐标
        this.sprite.pivotX = 50;
        //设置精灵对象垂直轴心点坐标
        this.sprite.pivotY = 50;
        //向舞台中添加精灵
        Laya.stage.addChild(this.sprite);

        this.sprite.on(Laya.Event.CLICK, this, this.onSpriteClick);
    }
    onSpriteClick(){
        this.sprite.rotation += 5;
    }
}
//启动
new Test();

例如:从外部加载图片后,将图片放置到舞台中央位置,并以图片中心为圆心进行旋转。

class Test {
    constructor() {
        Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
        this.initStage();
        this.initComponent();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    initComponent(){
        this.createSprite();
        Laya.timer.frameLoop(1, this, this.onFrameLoop);
    }
    onFrameLoop(){
        this.sprite.rotation += 2;
    }
    createSprite(){
        this.sprite = new Laya.Sprite();
        Laya.stage.addChild(this.sprite);

        const url = "res/image/npc.png";
        this.sprite.loadImage(url, Laya.Handler.create(this, function(){
            let res = Laya.loader.getRes(url);
            this.sprite.pivot(res.width/2, res.height/2);
            this.sprite.pos(Laya.stage.width>>1, Laya.stage.height>>1);
        }));
    }
}
//启动
new Test();
4933701-d8e544a3f9c91efd.png
轴心点旋转

旋转缩放 rotation

项目类型描述
rotation:number存取器旋转角度,默认为0,以角度为单位。
scaleX:number存取器X轴缩放值,默认为1,设置为负数可实现水平反转。
scaleY:number存取器Y轴缩放值,默认为1,设置为负数可实现垂直反转。
class Test {
    constructor() {
        Laya.init(Laya.Browser.width, Laya.Browser.height, Laya.WebGL);
        this.onInit();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    onInit(){
        this.sprite = new Laya.Sprite();
        Laya.stage.addChild(this.sprite);

        this.sprite.loadImage("res/image/npc.png");
        this.sprite.pivot(55, 72);
        this.sprite.x = Laya.stage.width / 2;
        this.sprite.y = Laya.stage.height / 2;

        this.scale = 0;
        Laya.timer.frameLoop(1, this, this.onFrameLoop);
    }
    onFrameLoop(){
        this.sprite.rotation += 2;
        this.scale += 0.02;
        this.sprite.scale(Math.sin(this.scale), Math.sin(this.scale));
    }
}
//启动
new Test();

设置遮罩 mask

存取器描述
mask根据对象(支持位图和矢量图)的形状进行遮罩显示,遮罩对象坐标系是相对于遮罩对象本身的。
public function get mask():Sprite
public function set mask(value:Sprite):void

LayaAir的遮罩可以设置一个对象,支持位图和矢量图,然后根据对象状态进行遮罩显示。遮罩对象坐标系时相对遮罩对象本身的,和Flash机制不同。

4933701-9b82023051a03b38.png
设置遮罩
class Test {
    constructor() {
        Laya.init(Laya.Browser.width, Laya.Browser.height, Laya.WebGL);
        this.initStage();
        this.init();
    }
    initStage(){
        Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;
        Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;
        Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;
        Laya.stage.bgColor = "#000000";
    }
    init(){
        this.ASSETS_NPC = {type:Laya.Loader.IMAGE, url:"res/image/npc.png"};
        this.ASSETS_HALL = {type:Laya.Loader.IMAGE, url:"res/image/hall.png"};

        let assets = [];
        assets.push(this.ASSETS_NPC);
        assets.push(this.ASSETS_HALL);
        Laya.loader.load(assets, Laya.Handler.create(this, this.onAssetsLoaded));
    }
    onAssetsLoaded(){
        //创建精灵
        this.bg = new Laya.Sprite();
        //获取图片资源
        let texture = Laya.loader.getRes(this.ASSETS_HALL.url);
        //绘制纹理
        this.bg.graphics.drawTexture(texture);
        this.bg.pos(0, 0);
        //添加到舞台
        Laya.stage.addChild(this.bg);

        //创建遮罩
        this.mask = new Laya.Sprite();
        this.radius = 100;        
        this.mask.graphics.drawCircle(0, 0, this.radius, "#FFFFFF");
        this.mask.pos(Laya.stage.width/2, Laya.stage.height/2);

        //图片添加遮罩
        this.bg.mask = this.mask;

        //添加移动事件
        Laya.stage.on(Laya.Event.MOUSE_MOVE, this, function(){
            this.mask.x = Laya.stage.mouseX;
            this.mask.y = Laya.stage.mouseY;
        });
    }
}
//启动
new Test();

缓存

存取器描述
cacheAs用于指定显示对象是否缓存为静态图像
/*
* 指定显示对象是否缓存为静态图像,cacheAs时,子对象发生变化,会自动重新缓存,同时也可以手动调用reCache方法更新缓存。
* 建议把不经常变化的“复杂内容”缓存为静态图像,能极大提高渲染性能。cacheAs有"none","normal"和"bitmap"三个值可选。
* 默认为"none",不做任何缓存。
* 当值为"normal"时,canvas模式下进行画布缓存,webgl模式下进行命令缓存。
* 当值为"bitmap"时,canvas模式下进行依然是画布缓存,webgl模式下使用renderTarget缓存。
* webgl下renderTarget缓存模式缺点:会额外创建renderTarget对象,增加内存开销,缓存面积有最大2048限制,不断重绘时会增加CPU开销。优点:大幅减少drawcall,渲染性能最高。
* webgl下命令缓存模式缺点:只会减少节点遍历及命令组织,不会减少drawcall数,性能中等。优点:没有额外内存开销,无需renderTarget支持。
*/
cacheAs:string;

缓存为静态图片,将多个显示对象缓存成静态图像可大幅提升渲染效率。

//初始化引擎
const canvas = Laya.init(Laya.Browser.clientWidth, Laya.Browser.clientHeight, Laya.WebGL);
//舞台设置
Laya.stage.alignH = Laya.Stage.ALIGN_CENTER;//设置舞台水平居中
Laya.stage.alignV = Laya.Stage.ALIGN_MIDDLE;//设置舞台垂直居中
Laya.stage.scaleMode = Laya.Stage.SCALE_SHOWALL;//设置舞台缩放模式为显示所有
Laya.stage.bgColor = "#000000";//设置舞台背景颜色为黑色

let sprite = new Laya.Sprite();
Laya.stage.addChild(sprite);

let text;
for(let i=0; i<100; i++){
    text = new Laya.Text();
    sprite.addChild(text);

    text.fontSize = 20;
    text.text = (Math.random() * 1000).toFixed(0);
    text.color = "#ccc";
    text.rotation = Math.random() * 360;
    text.x = Math.random() * Laya.stage.width;
    text.y = Math.random() * Laya.stage.height;
}
sprite.cacheAs = "bitmap";
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值