精华内容
下载资源
问答
  • qt creator各个部件显示图片总结

    千次阅读 2017-10-26 09:42:00
    在工作中,UI设计经常需要显示各式各样的图片,下面就总结了qt如何在一些部件中显示图片的方式 一、QFrame或者QWidget显示图片 在属性stylesheet中填写: #loginBoxFrame{border-image: url(../../icon/login/login_...

    在工作中,UI设计经常需要显示各式各样的图片,下面就总结了qt如何在一些部件中显示图片的方式

    一、QFrame或者QWidget显示图片

    在属性stylesheet中填写:

    #loginBoxFrame{border-image: url(../../icon/login/login_box.png)}


    二、label显示图片

    在属性pixmap中选中需要显示的图片


    三、pushbutton显示图片并显示字体颜色

    QPushButton{border-image: url(../../icon/login/login_button.png);color: white}

    字体大小在属性font->点大小  中设置。


    按照如上方式,制作的示例界面如下


    展开全文
  • 之前在u3d里写过,现在用CocosCreator又需要用到,就再写了一个。 实现了垂直和水平方向的无限循环功能。 用typescript写的,两百行不到的代码,请大家看看。 demo在可看链接demo /* * @Author: HuangLang *...

     之前在u3d里写过,现在用CocosCreator又需要用到,就再写了一个。

    实现了垂直和水平方向的无限循环功能。

    用typescript写的,两百行不到的代码,请大家看看。

    demo在可看链接demo

    /*
     * @Author: HuangLang 
     * @Date: 2018-07-13 15:17:37  
     * @Description :无限循环列表
     * @Last Modified by: HuangLang
     * @Last Modified time: 2018-07-17 14:41:19
     */
    /**
     * 滑动方向枚举
     */
    export enum ScrollDirEnum {
        Vertical,
        Horizon
    }
    const { ccclass, property } = cc._decorator;
    
    @ccclass
    export default class ScrollHelper extends cc.Component {
    
        //赋值用的obj
        @property(cc.Node)
        item: cc.Node = null;
        @property(cc.ScrollView)
        Scroll: cc.ScrollView = null;
        //显示用的content
        @property(cc.Node)
        content: cc.Node = null;
        //附加mask组件的对象
        @property(cc.Node)
        maskNode: cc.Node = null;
        //方向,0是垂直方向,1是水平方向
        @property(Number)
        dir: Number = 0;
    
        //滑动的方向
        public scrollDir: ScrollDirEnum = ScrollDirEnum.Vertical;
        public get ScrollDir() { return this.scrollDir; }
        public set ScrollDir(val) { this.scrollDir = val; }
        private num: number;//需要显示的item数量
        public get Num() { return this.num; }
        public set Num(val) { this.num = val; }
        private itemNum: number;//实际生成item数量
        public get ItemNum() { return this.itemNum; }
        public set ItemNum(val) { this.itemNum = val; }
        public distance = 100;//item之间的间距
        public needSize = 0;//需求要求的高度/宽度
        public visibleHeight = 0;//显示范围高度
        public itemsHeight = 0;//物品高度
        public OnScrollFun = null;//滑动回调
        //可见范围
        private minY: number = 0;
        private maxY: number = 0;
        //可以显示的范围,可见范围 超过 可以显示的范围,就刷新列表(把缓存的item放到下面或上面)
        private minVisibleY: number = 0;
        private maxVisibleY: number = 0;
        public initX = this.distance / 2;
        public initY = -this.distance / 2;
    
        start() {
            this.num = 7;
            this.itemNum = 6;
            this.scrollDir = this.dir as ScrollDirEnum;
            this.Init(this.itemNum);
        }
    
        Init(num: number) {
            var eventHandler = new cc.Component.EventHandler();
            eventHandler.target = this.node;
            eventHandler.component = "ScrollHelper";
            eventHandler.handler = "OnScroll";
            this.Scroll.scrollEvents.push(eventHandler);
            this.needSize = this.num * this.distance;
            if (this.scrollDir == ScrollDirEnum.Horizon) {
                this.initX = this.distance / 2;
                this.initY = 0;
                this.content.setContentSize(new cc.Size(this.needSize, this.content.getContentSize().height));
    
            } else {
                this.initX = 0;
                this.initY = -this.distance / 2;
                this.content.setContentSize(new cc.Size(this.content.getContentSize().width, this.needSize));
            }
            this.visibleHeight = this.maskNode.getContentSize().height;
            this.InitObjs();
        }
    
        //初始化可见的item
        private itemsList = new Array();
        InitObjs() {
            let curX = 0;
            let curY = 0;
            for (let i = 0; i < this.itemNum; i++) {
                let obj = cc.instantiate(this.item);
                obj.parent = this.content;
                obj.active = true;
                if (this.scrollDir == ScrollDirEnum.Horizon) {
                    curX = this.initX + this.distance * i;
                    // console.error("curX:" + curX);
                }
                else {
                    curY = this.initY - this.distance * i;
                    // console.error("curY:" + curY);
                }
    
                obj.setPositionX(curX);
                obj.setPositionY(curY);
                this.onRefresh(obj, i.toString(), i);
                this.itemsList.push(obj);
            }
        }
    
        //计算边界,超过边界则刷新列表
        //offest是左上角原点滑动的偏移量
        private countBorder(offest) {
            let height = this.visibleHeight;//可见高度
            this.minY = offest;//获得相对于左上角原点的最小y值
            this.maxY = offest + height;//获得相对于左上角原点的最大y值
        }
    
        private miniIdx = 0;
        private maxIdx = 0;
        private curOffset = 0;
        OnScroll() {
            //获取滚动视图相对于左上角原点的当前滚动偏移
            let scrollOffset: cc.Vec2 = this.Scroll.getScrollOffset();
            let offest = 0;
            if (this.scrollDir == ScrollDirEnum.Horizon)
                //水平的offset是负数,为什么会有这么sb的设计,将它取反和垂直方向的统一一下
                offest = -scrollOffset.x;
            else
                offest = scrollOffset.y;
            this.curOffset = offest;
            this.refresh();
        }
    
        //强行刷新
        public refresh() {
            let offest = this.curOffset;
    
            //最大高度,超过该高度,不刷新
            let maxY = this.needSize;
            if (offest < 0 || offest + this.visibleHeight >= maxY)
                return;
            
            let idx: number = 0;//从0开始
            this.countBorder(offest);
            this.miniIdx = Math.floor(offest / this.distance);
            // console.error("this.miniIdx:" + this.miniIdx);
    
            this.minVisibleY = this.miniIdx * this.distance;
            this.maxVisibleY = this.maxIdx * this.distance;
            //miniIdx到maxIdx都会刷新
            for (let i = 0; i < this.itemNum; i++) {
                let obj = this.itemsList[i];
                idx = this.miniIdx + i;
                this.refreshItem(idx, i, obj);
            }
            this.maxIdx = this.miniIdx + this.itemNum;
        }
    
        //idx是UI该刷新的第几个元素
        private refreshItem(idx, objIdx, obj) {
            if (idx < 0 || idx >= this.num)
                return;
    
            if (obj == null) {
                console.error("obj为空!");
                return;
            }
            let curX = 0;
            let curY = 0;
            if (this.scrollDir == ScrollDirEnum.Horizon)
                curX = this.initX + this.distance * idx;
            else
                curY = this.initY - this.distance * idx;
            // console.error("idx:" + idx + ",curX:" + curX + ",curY:" + curY);
            obj.setPositionX(curX);
            obj.setPositionY(curY);
            this.onRefresh(obj, idx, objIdx);
        }
    
        /**
         * 刷新回调
         * @param obj 
         * @param idx 需求显示的索引
         * @param objIdx 实际的item索引
         */
        private onRefresh(obj, idx: string, objIdx) {
            //测试用
            let label = cc.find("text", obj).getComponent(cc.Label);
            label.string = idx;
            if (this.OnScrollFun)
                this.OnScrollFun(obj, idx, objIdx);
        }
    }
    

     

    展开全文
  • 两个左右按钮,左边按钮显示上一张,右边按钮显示下一张,利用文件目录和list实现加载路径。代码是VS2015+Qt5.7实现的.也可以看代码转换成Qt Creator来运行。
  • if (this.froInd >= this._data_.length) {//froind = 50 ,此时0已经显示了,下一次显示arr[1],故更新索引为0 this.froInd = 0; } if (((this.froInd + this._needBuildItemNum - 1) % this._data_.length) ==...
    当前仅适用于自低向上滚动,自上向下也简单,判断items[items.length-1]的位置即可eachToY=-1 ,同时,自左向右等也一样,将相对应的Y改成x就可以了。暂时没这需求,不写这么多了
    关键性代码,如下,在组件onload时记录下scrollView绑定的content的y值放在this.lastContentPosY中
    update: function (dt) {
            this.updateTimer += dt;
            this.scrollView.content.y = this.lastContentPosY;
            if (this.updateTimer < this.updateInterval) {
                return; // we don't need to do the math every frame
            }
            this.updateTimer = 0;
            if (this._data_.length <= this._showCount) {//当数据内容小于展示区的内容时,就不滚动了吗?????
                return;
            }
            let eachToY = 1;//y移动速度
            let items = this.scrollView.content.children;
            let deltY = items[0].y;
            if (Math.floor(items[0].y) >= (this._itemHeight + this.spacing)) {//已经向上走了一个元素位置,需要更新这个元素的位置了
                let ele = items.shift();
                ele.y = -(this._needBuildItemNum - 1) * (this._itemHeight + this.spacing);
                items.push(ele);//放到最下面了
                
                this.froInd++;
    
                let comp = ele.getComponent(this.itemComponentName);
                comp && comp.updateItem && comp.updateItem(this._data_[((this.froInd + this._needBuildItemNum - 1) % this._data_.length)], ele.ind);
                //更新索引坐标
                if (this.froInd >= this._data_.length) {//froind = 50 ,此时0已经显示了,下一次显示arr[1],故更新索引为0
                    this.froInd = 0;
                }
    
                if (((this.froInd + this._needBuildItemNum - 1) % this._data_.length) == (this._data_.length - 1) || this._forceUpdate) {//49+1=50  此时需要判断缓存数组中是否需要更新数据到展示数组中
                    cc.log("ddzd:我到结束区了" + (this.froInd + this._needBuildItemNum - 1));
                    if (!this._isaddDataToBuff)
                        this._dataDel();//重新排列位置
                }
            }
    
            if (!this._dataDel_now) {//没有正在装填数据的时候,则进行滚动,否则停下来,我们装完数据再继续
                for (let i = 0; i < items.length; ++i) {//更新每个元素的位置
                    items[i].y += eachToY;
                }
            }
    
    
        },
    原理就是在间隔时间后对每一个items的元素位置x/y+1,并在首/尾items越过一个items身位将其移动到尾/首.
    if (!this._data_ || !this._items || !this._itemPools) {
                this._delayTaskInfo = null;
                return;
            }
            //从_data_中选取一个需要显示的个数的数据用来显示
            let itemsdatas = this.getShowCountCYC();
    
            this.scrollView.stopAutoScroll();
    
            // recyle
            let children = this.scrollView.content.children.slice();
            this.scrollView.content.removeAllChildren(false);
            children.forEach(this._recyleItem.bind(this));
    
            let i = 0;
            itemsdatas.forEach(data => {
                let item = this._getItem();
                item.x = 0;
                item.y = -i * (this._itemHeight + this.spacing);
                item.ind = i;
                if (item) {
                    if (this.itemComponentName) {
                        let comp = item.getComponent(this.itemComponentName);
                        comp && comp.updateItem && comp.updateItem(data, i);
                        // this._recyleItem(item);
                    };
    
                    this.scrollView.content.addChild(item);//这就将数据放入进去了额已经挂载完成
    
                }
                i++;
                this._items.push(item);
            });

    上面这段代码是放置items到content中去的,同时可以

    this.getShowCountCYC();

     

     

     

    展开全文
  • 1. 应该在配置文件中编写所有道具的属性,包括名称、介绍、图片路径等等,方便后期添加或删除道具。 2. 将各个道具预制添加到挂有GridLayout组件的节点上。 3. 考虑GridLayout相关属性的屏幕适配...

    背包栏中的物品显示逻辑

    创建节点

    编写配置文件

    编写道具预制脚本

    生成并添加道具


    在这一教程中,我们来看下怎么样合理地在背包栏中显示各种物品或道具。我们主要考虑以下几点:

    1. 应该在配置文件中编写所有道具的属性,包括名称、介绍、图片路径等等,方便后期添加或删除道具。

    2. 将各个道具预制添加到挂有GridLayout组件的节点上。

    3. 考虑GridLayout相关属性的屏幕适配。

    运行效果如下:

    Cocos Creator版本:2.2.0

    后台回复"背包栏",获取该项目完整文件:

    创建节点

    层级管理器中创建以下节点:

    • bg为白色背景,sprite类型。
    • bagBtn为按钮节点,用来打开和关闭背包栏
    • bagBg为背包栏的背景,而gridLayout就是用来添加各个道具的节点,上面挂有GridLayout组件。
    • tool为道具预制,sprite类型。

    编写配置文件

    首先我们新建一个Conf.js脚本,在里面写上各个道具的属性:

    // Conf.js
    const TOOLS = [
        {
            name: '卷轴',                        // 道具名称,对应resources/tools中的图片名字
            intro: '这是一个卷轴',                // 道具介绍,当玩家在背包中点击道具后,显示介绍
            picUrl: 'tools/卷轴'                 // 动态加载路径
        },
        {
            name: '心经',
            intro: '欲练此功,必先自宫',
            picUrl: 'tools/心经'               
        },
        {
            name: '火腿',
            intro: '来自金华',
            picUrl: 'tools/火腿' 
        },
        {
            name: '煎饺',
            intro: '挺好吃的',
            picUrl: 'tools/煎饺' 
        },
        {
            name: '烈酒',
            intro: '武松当年喝这个的话,可能过不了岗',
            picUrl: 'tools/烈酒' 
        },
        {
            name: '金钥匙',
            intro: '金色的要钥匙',
            picUrl: 'tools/金钥匙'
        },
        {
            name: '银钥匙',
            intro: '银色的钥匙',
            picUrl: 'tools/银钥匙' 
        },
        {
            name: '黄石',
            intro: '来自黄石公园的石头叫做黄石',
            picUrl: 'tools/黄石' 
        }
    ];
    
    export {TOOLS};

    笔者这里只是放上了name,intro和picUrl属性,大家当然可以按照自己想法添加。但是最好确保各个道具的属性名都相同(也就是Json的键名都相同)。最后导出TOOLS常量,因为我们要在其他脚本中使用。

    注:如果后期需要添加道具,那我们只需要修改Conf.js即可,项目其他地方不需要改动。

    编写道具预制脚本

    新建Tool.js脚本,将其挂到tool节点上。脚本内容如下:

    // Tool.js
    cc.Class({
        extends: cc.Component,
    
        properties: {
        },
    
        // LIFE-CYCLE CALLBACKS:
    
        initInfo (info) {
            // 初始化该道具相关信息
    
            // 图片
            var self = this;
            cc.loader.loadRes(info['picUrl'], cc.SpriteFrame, function (err, spriteFrame) {
                self.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
            });
    
            // 介绍
            this.node.intro = info['intro'];
        },
    });

    在生成预制时,我们会调用Tool.js中的initInfo方法,来初始化该预制相关信息。

    这里我们采用动态加载资源的方式来显示图片,所以应该将图片全部放在resources文件夹下:

    关于动态加载的介绍,请大家去看下官方文档

    注:其实在这个脚本中我们还可以做很多文章,比如添加触摸监听,让玩家点击该道具时,可以显示道具介绍等等。这个大家随意发挥。

    生成并添加道具

    首先我们重点来看下gridLayout节点:

    gridLayout的大小不是等于bagBg,而是等于bagBg中放置道具的区域大小。此时属性检查器中gridLayout的大小如下图所示:

    而我们看到放置区域横向一共有8个空位,7个间隔(spacingX);纵向一共有4个空位,3个间隔(spacingY)。已知放置区域总宽度为450,总高度为220,那么我们设空位边长为x,间隔宽度为y,可得出以下方程:

    8x + 7y = 450
    4x + 3y = 220

    得出x=47.5,y=10。此时还没结束,我们不能在代码里用绝对数值来设置gridLayout中cellSize的宽高和间隔,而是要用百分比(屏幕适配)。于是我们将x和y分别除以450和220求出百分比:

    47.5 / 450 = 0.105            // 这里保留3位小数,但记住不要四舍五入
    10 / 450 = 0.022
    47.5 / 220 = 0.215
    10 / 220 = 0.045

    接下来新建Game.js脚本,挂到Canvas节点上。脚本内容如下:

    // Game.js
    import {TOOLS} from './Conf';
    
    cc.Class({
        extends: cc.Component,
    
        properties: {
            gridLayout: cc.Node,
            toolPrefab: cc.Prefab,
        },
    
        // LIFE-CYCLE CALLBACKS:
    
        spawnTools () {
            // 首先确定gridLayout的各个属性
            let cellWidth = this.gridLayout.width * 0.105;
            let cellHeight = this.gridLayout.height * 0.215;
            let spacingX = this.gridLayout.width * 0.022;
            let spacingY = this.gridLayout.height * 0.045;
    
            this.gridLayout.getComponent(cc.Layout).cellSize.width = cellWidth;
            this.gridLayout.getComponent(cc.Layout).cellSize.height = cellHeight;
            this.gridLayout.getComponent(cc.Layout).spacingX = spacingX;
            this.gridLayout.getComponent(cc.Layout).spacingY = spacingY;
    
            // 根据TOOLS生成相应的道具
            this.toolsArray = [];
            for (let i=0; i<TOOLS.length; i++) {
                let tool = cc.instantiate(this.toolPrefab);
                tool.getComponent('Tool').initInfo(TOOLS[i]);
                this.toolsArray.push(tool);
                this.gridLayout.addChild(tool);
            }
        },
    
        bagBtn () {
            // 背包按钮
            if (this.gridLayout.parent.active) {
                // 隐藏节点
                this.gridLayout.parent.active = false;
    
                // 删除所有道具(或者不删,只是隐藏,自己决定)
                this.toolsArray.forEach(element => {
                    element.removeFromParent();
                });
            }
            else {
                // 显示节点
                this.gridLayout.parent.active = true;
    
                // 生成所有道具
                this.spawnTools();
            }
        },
    });

    1. spawnTools方法用来生成道具预制。其中我们首先确定好GridLayout组件的各个属性,然后循环TOOLS常量,生成相应道具预制,最后添加到gridLayout节点上。

    2. bagBtn是按钮节点的事件函数。当背包栏不可见时,点击按钮显示背包栏,并调用spawnTools方法生成道具;当背包栏可见时,点击按钮隐藏背包栏,然后删除所有道具预制。

    运行截图如下:

    好,那本节教程就到这,希望大家有所收获~

    展开全文
  • CocosCreator

    千次阅读 2017-11-16 22:09:03
    由于cocos舍弃了cocostudio,需要关注官方推荐的creator了。 1 creator实现了:脚本化(jS开发), 组件化, 数据驱动器。 2 CocosCreator + 从零开始(15楼) - CocoaChi… ... 新编辑器Cocos Creator发布:对不起我来...
  • Cocos引擎源码位于CocosCreator.app/Contents/Resources/engine/cocos2d/(Mac版本), 以下使用CocosEngine代替路径 效果展示 1, 自定义渲染组件—TexturePlus 2, 实现自定义多边形渲染范围 =========== 3, 图片...
  • 我们先改一下命名:把我改成str(这样看着不会跟j混),然后加个循环,注意是+ =符号: 这里面的str.length指的是字符串长度;我们先看看结果: 由于是+ =运算符,我们把标签也弄了进去,不过,这个小...
  • // - https://docs.cocos.com/creator/manual/en/scripting/typescript.html // Learn Attribute: // - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html // Learn life-cycle ...
  • creator笔记

    2018-06-19 17:42:00
    我要做一个列表,图片都不一样,所以想用循环去动态加载不同的的图片,看文档提供的加载plist文件方法,然后总是报错,最后找了个折中的办法,就是做一个SpriteFrame的列表,然后放一张图片,根据Id改变图片的Frame...
  • qtcreator.exe

    2020-04-18 23:24:45
    网上一直循环不能关闭的小程序提升版,可以显示图片,简单的整蛊小程序,下载下载下载下载。
  • 021 - creator笔记

    2020-05-26 15:21:30
    021 - creator笔记 001 初识creator internal 引擎自带内部资源 项目按钮 – 渠道项目所在文件夹位置 编辑器 – 编辑器安装目录 packages: 项目插件的目录,如果你把编辑器插件,放到这个目录下,这个项目就会有这...
  • Cocos Creator使用记录

    2020-04-22 18:33:29
    Cocos Creator使用记录使用json文件动态设置label的显示文字动态设置精灵(sprite)的图片地址使用cc.loader.load设置网络图片使用cc.loader.loadRes设置`assets/resources` 目录下的图片使用cc.url.raw加载本地图片...
  • CocosCreator基础

    千次阅读 2018-12-14 14:22:20
    8.Cocos Creator 可以使用的图片格式,目前包括 JPG 和 PNG 两种。 9.节点的激活与关闭 this . node . active = true ; this . node . active = false ; 10.Cocos Creator目前提供给用户的生命周期...
  • cocos creator 基础

    2019-12-12 17:40:39
    COCOS 脚本 1. 安装API 适配插件 开发者 -> VS Code 工作流 -> 安装 VS Code 扩展插件 该操作会将 Cocos Creator API 适配插件安装到 VS ...安装成功后在 控制台 会显示绿色的提示:VS Code extension ins...
  • cocos creator入门

    2018-07-25 20:32:00
     Cocos Creator是一个完整的游戏开发解决方案,包括了 cocos2d-x 引擎的 JavaScript 实现,以及快速开发游戏所需要的各种图形界面工具。Cocos Creator 的编辑器完全为引擎定制打造,包含从设计、开发、预览、调试到...
  • 1:背景循环移动:2张相同的背景图并行排列,相接触的边界内容相吻合,2张图片一起移动,当第一张图片移出屏幕,则放到第二张图片的后面 在每帧运行的函数update()中 添加x移动 即x-= 2钢管循环移动:和背景循环类似...
  • CocosCreator上手

    2016-07-25 08:38:30
    Cocos Creator 编辑器由多个面板组成,面板可以自由移动、组合,以适应不同项目和开发者的需要。 2.资源管理器:资源管理器里显示了资源文件夹(assets)中的所有资源。可以将文件从项目外面直接拖拽进来,或使用...
  • 写在前面 开个头 面试的时候,面试官问,大量的滚动列表如何优化?答可以使用类似android中的滚动列表,当item超出可视范围...另,项目中的图片素材是网上下的免费资源。 运行环境 Cocos Creator 2.3 Chrome 89 演示
  • 为了让你的作品在每一个平台上都表现出色,Cocos Creator 每天都在全力奔跑。 在之前的 v2.2.0 版本中,我们着力优化了原生平台的渲染性能,有大量的开发者积极升级和体验,这给我们带来了极大的鼓励和信心,...
  • CocosCreator使用说明

    2020-06-30 20:03:59
    图片、声音等资源拖拽到编辑器的【资源管理器】面板中,即可完成资源导入。另外,也可以在编辑器中直接创建场景、预制、动画、脚本、粒子等各种资源。 搭建场景 场景是游戏内容最基本的组织方式,...
  • cocos creator 滚动列表 ListView

    千次阅读 2019-01-12 00:45:52
    而cocos creator 中的ScrollView + Layout 只有你想不到,没有它满足不了, 各种分骚布局. 都能实现. 但是,但是, 它还有一些场景不是很适合.例如 : 千百人的排行榜(虽然,大家只会记得第一名,谁还在乎第二名,除非第二...
  • creator DrawCall详解

    2020-09-03 16:36:04
    无论是 Cocos Creator、Unity、Unreal 还是其他游戏引擎,只要说到游戏性能优化,DrawCall 都是绝对少不了的一项。 本文将会介绍什么是 DrawCall,为什么要减少 DrawCall 以及在 Cocos Creator 项目中如何减少 Draw...
  • Cocos Creator笔记

    2019-04-04 20:16:47
    //如果onload 第一帧不想显示图片的话, 在节点树中隐藏,再动画开始时候相应打开 //多个动画衔接位置要同步 //动画播放完毕 this.scheduleOnce(function(){ //处理事件或者播放其它动画 }.bind(this),this.anim....
  • QT Creator 对话框QDialog

    2020-06-05 15:57:55
    QT Creator 对话框QDialog mainWindow.cpp 文件下: #include “mainwindow.h” #include “ui_mainwindow.h” #include //所有对话窗口类的基类 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...
  • 【QT】QT中label显示图片

    千次阅读 2017-04-29 22:01:53
    QPixmap picture;// .h 文件中// .c文件 picture.load("images/dengdai.png"); ui->fengren_picture->setPixmap(picture); ...images文件夹放到编译之后的debug文件或是release文件中
  • Cocos Creator 性能优化:DrawCall

    千次阅读 2020-07-02 21:58:10
    无论是 Cocos Creator、Unity、Unreal 还是其他游戏引擎,只要说到游戏性能优化,DrawCall 都是绝对少不了的一项。 本文将会介绍什么是 DrawCall,为什么要减少 DrawCall 以及在 Cocos Creator 项目中如何减少 Draw...
  • ​感谢所有开发者对 Cocos Creator 3D v1.0.0 的支持,我们兴奋地发现发布不到三周,就有几款 3D 小游戏上线了,多少也算验证了我们在工作流效率上所付出的努力。相信目前的 Cocos Creator 3D 对于制作纯 3D 小游戏...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,995
精华内容 1,198
关键字:

creator图片循环显示