2d_2dpca - CSDN
精华内容
参与话题
  • C和python中%d %.2d %2d %02d的区别

    万次阅读 2017-08-21 13:42:01
    %d就是普通的输出了 % 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。 % 02d,和% 2d差不多,只不过左边补0 %.2d从执行效果来看,和% 02d一样

    %d就是普通的输出了

    % 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格
    % 02d,和% 2d差不多,只不过左边补0
    %.2d 输出整形时最少输出2位,如不够前面以0占位。如输出2时变成02。200时只输出200;输出浮点型时(%.2f)小数点后强制2位输出

    展开全文
  • C语言中%d %.2d %2d %02d的区别

    万次阅读 多人点赞 2017-10-24 19:25:36
    %d:即为普通的输出。%2d:按宽度为2输出,右对齐方式输出。若不够两位,左边补空格。%02d:同样宽度为2,右对齐方式。位数不够,左边补0。%.2d:从执行效果来看,与%02d一样。

    %d:即为普通的输出。

    图片为转载

    %2d:按宽度为2输出,右对齐方式输出。若不够两位,左边补空格。

    这里写图片描述

    %02d:同样宽度为2,右对齐方式。位数不够,左边补0。

    这里写图片描述

    %.2d:从执行效果来看,与%02d一样。

    这里写图片描述

    展开全文
  • 二次元日系游戏制作工具 - live2dSDK入门教程

    万次阅读 多人点赞 2019-04-11 21:15:58
    1.Live2d的sdk接入与素材模型的导入 导入该素材模型和Live2d的sdk Live2D模型制作到显示的基本流程: 1.初始化模型。 1.制作模型(读取moc文件)。 2.与贴图建立关联。 3.与绘图环境建立链接。...

    1.Live2d的sdk接入与素材模型的导入

    导入该素材模型和Live2d的sdk

    Live2D模型制作到显示的基本流程:

    1.初始化模型。
        
        1.制作模型(读取moc文件)。
        
        2.与贴图建立关联。
        
        3.与绘图环境建立链接。(有些平台不需要)。

        4.制定显示位置与尺寸。

    2.更新模型状态。

        1.更新顶点。

        2.绘图。

    Live2d虚拟环境的初始化与模型读取的第一种方法

    	void Start () {
    
            //初始化
            Live2D.init();
    
            //释放
            //Live2D.dispose();
    
            //读取模型
            Live2DModelUnity.loadModel(Application.dataPath + "/Resources/Epsilon/runtime/Epsilon.moc");
    	}

    以二进制形式去读取模型

    现将素材的.moc文件添加后缀为.moc.bytes,然后在输入下面的代码

            TextAsset mocFile = Resources.Load<TextAsset>("Epsilon/runtime/Epsilon.moc");
            Live2DModelUnity.loadModel(mocFile.bytes);

    模型与贴图建立关联(单张贴图)

            //与贴图建立关联
            Texture2D texture2D = Resources.Load<Texture2D>("");
            live2DModel.setTexture(0,texture2D);

    多张贴图的设置方法

            //与多张贴图建立关联
            Texture2D texture2D1 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_00");
            Texture2D texture2D2 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_01");
            Texture2D texture2D3 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_02");
            live2DModel.setTexture(0, texture2D1);
            live2DModel.setTexture(1, texture2D2);
            live2DModel.setTexture(2, texture2D2);

    创建负责渲染Live2dCanvas的4乘4矩阵与赋值

     private Live2DModelUnity live2DModel;
    
     //制定显示位置与尺寸
     float modelWidth = live2DModel.getCanvasWidth();
    
     live2DCanvansPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50, 50);

    给模型设置显示矩阵与更新和绘图的方法使用

    在Update添加更新顶点的代码以及添加OnRenderObject的方法

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using live2d;
    
    public class Live2dModel : MonoBehaviour {
    
        public TextAsset modelFile;
        public Texture2D[] textures;
    
        private Live2DModelUnity live2DModel;
    
        private Matrix4x4 live2DCanvansPos;
    	
    	void Start () {
    
            //初始化
            Live2D.init();
    
            //释放
            //Live2D.dispose();
    
            //读取模型
            //Live2DModelUnity.loadModel(Application.dataPath + "/Resources/Epsilon/runtime/Epsilon.moc");
            //TextAsset mocFile = Resources.Load<TextAsset>("Epsilon/runtime/Epsilon.moc");
    
            live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);
    
            //与贴图建立关联
            //Texture2D texture2D = Resources.Load<Texture2D>("");
            //live2DModel.setTexture(0,texture2D);
    
            //与多张贴图建立关联
            //Texture2D texture2D1 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_00");
            //Texture2D texture2D2 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_01");
            //Texture2D texture2D3 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_02");
            //live2DModel.setTexture(0, texture2D1);
            //live2DModel.setTexture(1, texture2D2);
            //live2DModel.setTexture(2, texture2D2);
            for (int i = 0; i < textures.Length; i++)
            {
                live2DModel.setTexture(i, textures[i]);
            }
    
            //制定显示位置与尺寸
            float modelWidth = live2DModel.getCanvasWidth();
    
            live2DCanvansPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50, 50);      
        }
    	
    	
    	void Update ()
        {
            live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvansPos);
            //更新顶点
            live2DModel.update();
        }
    
        private void OnRenderObject()
        {
            live2DModel.draw();
        }
    }
    

    运行程序,结果如下:

    动作文件的加载与动作对象的实例化

    两种实例化对象动作的方式,与模型的读取操作一样

            //实例化动作对象
            live2DMotionIdle = Live2DMotion.loadMotion(Application.dataPath + "");
    
            TextAsset mtnFile = Resources.Load<TextAsset>("");
            live2DMotionIdle = Live2DMotion.loadMotion(mtnFile.bytes);

    动作属性的设置与动作管理的实例化

    首先将动作属性进行导入

        public TextAsset[] motionFile;
    
        private Live2DMotion[] motions;
    
             motions = new Live2DMotion[motionFile.Length];
            for (int i = 0; i < motions.Length; i++)
            {
                motions[i] = Live2DMotion.loadMotion(motionFile[i].bytes);
            }

    对某一动作属性进行设置

            //设置某一个动画的一些属性
            //重复播放不淡入
            motions[0].setLoopFadeIn(false);
            //设置淡入淡出时间,参数单位为毫秒
            motions[0].setFadeOut(1000);
            motions[0].setFadeIn(1000);
            //动画是否循环播放
            motions[0].setLoop(true);

    创建一个MotionQueueManager对motions进行管理

    private MotionQueueManager motionQueueManager;
    
    
            motionQueueManager = new MotionQueueManager();
            motionQueueManager.startMotion(motions[0]);

    动作的播放

    按下M键可以改变人物的动作播放,将动作拖入Unity时也需要将动作的mtn文件修改为mtn.bytes。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using live2d;
    
    public class Live2dModel : MonoBehaviour {
    
        //模型
        public TextAsset modelFile;
        public Texture2D[] textures;
        private Live2DModelUnity live2DModel;
        private Matrix4x4 live2DCanvansPos;
    
        //动作
        public TextAsset[] motionFile;
        private Live2DMotion[] motions;
        private MotionQueueManager motionQueueManager;
    
        public int motionIndex;
    
        //private Live2DMotion live2DMotionIdle;
    	
    	void Start () {
    
            //初始化
            Live2D.init();
    
            //释放
            //Live2D.dispose();
    
            //读取模型
            //Live2DModelUnity.loadModel(Application.dataPath + "/Resources/Epsilon/runtime/Epsilon.moc");
            //TextAsset mocFile = Resources.Load<TextAsset>("Epsilon/runtime/Epsilon.moc");
    
            live2DModel = Live2DModelUnity.loadModel(modelFile.bytes);
    
            //与贴图建立关联
            //Texture2D texture2D = Resources.Load<Texture2D>("");
            //live2DModel.setTexture(0,texture2D);
    
            //与多张贴图建立关联
            //Texture2D texture2D1 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_00");
            //Texture2D texture2D2 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_01");
            //Texture2D texture2D3 = Resources.Load<Texture2D>("Epsilon/runtime/Epsilon.1024/texture_02");
            //live2DModel.setTexture(0, texture2D1);
            //live2DModel.setTexture(1, texture2D2);
            //live2DModel.setTexture(2, texture2D2);
            for (int i = 0; i < textures.Length; i++)
            {
                live2DModel.setTexture(i, textures[i]);
            }
    
            //制定显示位置与尺寸
            float modelWidth = live2DModel.getCanvasWidth();
            live2DCanvansPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50, 50);
    
            //播放动作
            //实例化动作对象
            //live2DMotionIdle = Live2DMotion.loadMotion(Application.dataPath + "");
    
            //TextAsset mtnFile = Resources.Load<TextAsset>("");
            //live2DMotionIdle = Live2DMotion.loadMotion(mtnFile.bytes);
            motions = new Live2DMotion[motionFile.Length];
            for (int i = 0; i < motions.Length; i++)
            {
                motions[i] = Live2DMotion.loadMotion(motionFile[i].bytes);
            }
    
            //设置某一个动画的一些属性
            //重复播放不淡入
            motions[0].setLoopFadeIn(false);
            //设置淡入淡出时间,参数单位为毫秒
            motions[0].setFadeOut(1000);
            motions[0].setFadeIn(1000);
            //动画是否循环播放
            motions[0].setLoop(true);
    
            motionQueueManager = new MotionQueueManager();
            motionQueueManager.startMotion(motions[0]);
        }
    	
    	
    	void Update ()
        {
            live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvansPos);
    
            if (Input.GetKeyDown(KeyCode.M))
            {
                motionIndex++;
                if (motionIndex >= motions.Length)
                {
                    motionIndex = 0;
                }
                motionQueueManager.startMotion(motions[motionIndex]);
            }
    
            //指定播放动作的模型
            motionQueueManager.updateParam(live2DModel);
    
            //更新顶点
            live2DModel.update();
        }
    
        private void OnRenderObject()
        {
            live2DModel.draw();
        }
    }
    

    多个动作的同时播放

    多个动作同时播放只需要多创建一个MotionQueueManger来进行管理

    private MotionQueueManager motionQueueManager;
    
    private MotionQueueManager motionQueueManagerA;
    
            motions[0].setLoop(true);
    
            motionQueueManager = new MotionQueueManager();
            motionQueueManager.startMotion(motions[0]);
    
            motions[5].setLoop(true);
    
            motionQueueManagerA = new MotionQueueManager();
            motionQueueManagerA.startMotion(motions[5]);
    
            motionQueueManager.updateParam(live2DModel);
            motionQueueManagerA.updateParam(live2DModel);

    动作的优先级概念与设置标准

    使用L2DMotionManager来对行为优先级进行管理

        private L2DMotionManager l2DMotionManager;
        //优先级的设置标准“
        //1.动作未进行的状态,优先级为0;
        //2.待机动作发生时,优先级为1;
        //3.其他动作进行时,优先级为2;
        //4.无视优先级,强制发生动作,优先级为3

    动作优先级的代码实现

    首先在Start里面进行L2DMotionManager的初始化

    l2DMotionManager = new L2DMotionManager();

    然后写一个通过优先级播放动作的方法StartMotion

        private void StartMotion(int motionIndex,int priority)
        {
            if (l2DMotionManager.getCurrentPriority() >= priority)
            {
                return;
            }
            else
            {
                l2DMotionManager.startMotion(motions[motionIndex]);
            }
        }

    在Update里面进行使用调用

            //判断待机动作
            if (l2DMotionManager.isFinished())
            {
                StartMotion(0, 1);
            }
            else if (Input.GetKeyDown(KeyCode.M))
            {
                StartMotion(14, 2);
            }
    
            l2DMotionManager.updateParam(live2DModel);

    开始时处于Idle状态,按下M后会变成摇头不高兴,播放完自己又会变成Idle

    设置参数的方法

    首先根据Epsilon.cmox文件把需要设置参数的id取出来,如图所示,取到角度X的id为PARAM_ANGLE_X

    然后在Update里面添加下面的代码进行参数设置,第一个是id,第二个是需要设置的值,第三个是权重。

            //设置参数
            live2DModel.setParamFloat("PARAM_ANGLE_X", 30, 1);

    参数的累加与扩大倍数的方法

            //设置参数
            live2DModel.setParamFloat("PARAM_ANGLE_X", 30, 1);
            //累加参数数值,一次增加10度
            live2DModel.addToParamFloat("PARAM_ANGLE_X", 10);
            //乘法设置参数
            live2DModel.multParamFloat("PARAM_ANGLE_X", 10);

    通过索引获取参数并设置与参数的保存和回复

    通过索引获取参数

            //第二种设置参数的办法,通过索引去设置
            int paramAngleX;
            paramAngleX = live2DModel.getParamIndex("PARAM_ANGLE_X");
            live2DModel.setParamFloat(paramAngleX, 30);

    参数的保存和回复

            参数的保存与回复
            live2DModel.setParamFloat("PARAM_ANGLE_X", 30);
            保存与回复的参数是整个模型的所有参数,并不只是之前同方法里设置的几个参数
            live2DModel.saveParam();
            live2DModel.loadParam();

    不透明度的设置与自动眨眼功能

    不透明度的设置,需要设置的是模型的part部分

            //设定模型某一部分的透明度
            live2DModel.setPartsOpacity("PARTS_01_FACE_001", 0);

    眨眼功能的实现,首先定义一个EyeBlinkMotion的类

    private EyeBlinkMotion eyeBlinkMotion;

    然后在Start方法里进行初始化

            //眨眼
            eyeBlinkMotion = new EyeBlinkMotion();

    在Update方法里面进行调用

            //眨眼
            eyeBlinkMotion.setParam(live2DModel);

    拖拽激发的动作

    拖拽功能的实现,首先定义一个L2DTargetPoint的类

        //鼠标拖拽引起的动作变化
        private L2DTargetPoint drag;

    然后在Start方法里进行初始化

            //鼠标拖拽
            drag = new L2DTargetPoint();

    在Update方法里面进行调用

            //模型跟随鼠标转向与看向
            Vector3 pos = Input.mousePosition;
            if (Input.GetMouseButton(0))
            {
                //把屏幕坐标转换成live2D检测的坐标
                drag.Set(pos.x / Screen.width * 2 - 1, pos.y / Screen.height * 2 - 1);
            }

    关于L2DTargetPoint获取坐标点的详细讲解

            //模型跟随鼠标转向与看向
            //得到的live2d鼠标检测点的比例值是-1到1(对应一个live2d拖拽
            //管理坐标系,或者叫做影响度)。
            //然后通过这个值去设置我们的参数,比如旋转30度*当前得到的值
            //就会按照这个值所带来的影响度去影响我们的模型动作
            //从而到达看向某一个点的位置

    公式的验证与理解

    实现模型跟随鼠标转向与看向的功能

    在Update里面添加代码

            Vector3 pos = Input.mousePosition;
            if (Input.GetMouseButton(0))
            {
                //把屏幕坐标转换成live2D检测的坐标
                drag.Set(pos.x / Screen.width * 2 - 1, pos.y / Screen.height * 2 - 1);
            }
            else if (Input.GetMouseButtonUp(0))
            {
                drag.Set(0, 0);
            }
    
            //参数及时更新,考虑加速度等自然因素,计算坐标,进行逐帧更新
            drag.update();
    
            //模型的转向
            if(drag.getX()!=0)
            {
                live2DModel.setParamFloat("PARAM_ANGLE_X", 30 * drag.getX());
                live2DModel.setParamFloat("PARAM_ANGLE_Y", 30 * drag.getY());
    
                live2DModel.setParamFloat("PARAM_BODY_ANGLE_X", 10 * drag.getX());
                //眼睛跟随鼠标移动
                //live2DModel.setParamFloat("PARAM_EYE_BALL_X", drag.getX());
                //live2DModel.setParamFloat("PARAM_EYE_BALL_Y", drag.getY());
                //眼睛只望向前方
                live2DModel.setParamFloat("PARAM_EYE_BALL_X", -drag.getX());
                live2DModel.setParamFloat("PARAM_EYE_BALL_Y", -drag.getY());
            }

    眼睛跟随鼠标移动

    眼睛只望向前方

    套用物理运算去设置头发的长度重量与收到的空气阻力

    头发摇摆功能的实现,首先定义一个PhysicsHair的类

        //物理运算的设定(本模型头发只有两侧和后侧)
        private PhysicsHair physicsHairSide;
        private PhysicsHair physicsHairBack;

    然后在Start方法里进行初始化和设置

            //头发的摇摆
            physicsHairSide = new PhysicsHair();
            physicsHairBack = new PhysicsHair();
            //套用物理运算
            //第一个参数是长度 单位是公尺 影响摇摆的快慢(周期)
            //第二个参数是空气阻力
            //第三参数是头发的重量
            physicsHairSide.setup(0.2f, 0.5f, 0.14f);

    设置影响头发的输入参数

     

            //设置输入参数
            //社会哪一个部分变动时进行哪一种物理运算
            PhysicsHair.Src srcX = PhysicsHair.Src.SRC_TO_X;//横向摇摆
            //第三个参数,"PARAM_ANGLE_X"变动时头发受到0.005倍影响度的输入参数
            physicsHairSide.addSrcParam(srcX, "PARAM_ANGLE_X", 0.005f, 1);

    设置头发的输出表现

    因为该模型头发有两边,所以我们将之前设置的Hair都分成两个,为Left和Right。

            //设置输出表现
            PhysicsHair.Target targetLeft = PhysicsHair.Target.TARGET_FROM_ANGLE;//表现形式
            PhysicsHair.Target targetRight = PhysicsHair.Target.TARGET_FROM_ANGLE;
    
            physicsHairSideLeft.addTargetParam(targetLeft, "PARAM_HAIR_SIDE_L", 0.005f, 1);
            physicsHairSideRight.addTargetParam(targetRight, "PARAM_HAIR_SIDE_R", 0.005f, 1);

    两边头发的横向摇摆效果

    在Update里面进行调用

            //头发摇摆
            long time = UtSystem.getUserTimeMSec();//获取执行时间
            physicsHairSideLeft.update(live2DModel, time);
            physicsHairSideRight.update(live2DModel, time);

    设置后边左边头发的摇摆效果

    在Start里面添加下面的代码

            //左边的头发
            physicsHairBackLeft = new PhysicsHair();
            physicsHairBackLeft.setup(0.24f, 0.5f, 0.18f);
            PhysicsHair.Src srcXBackLeft = PhysicsHair.Src.SRC_TO_X;
            PhysicsHair.Src srcZBackLeft = PhysicsHair.Src.SRC_TO_G_ANGLE;
    
            physicsHairBackLeft.addSrcParam(srcXBackLeft, "PARAM_ANGLE_X", 0.005f, 1);
            physicsHairBackLeft.addSrcParam(srcZBackLeft, "PARAM_ANGLE_Z", 0.8f, 1);
    
            PhysicsHair.Target targetBackLeft = PhysicsHair.Target.TARGET_FROM_ANGLE;
            physicsHairBackLeft.addTargetParam(targetBackLeft, "PARAM_HAIR_BACK_L", 0.005f, 1);
    
            //右边的头发
            physicsHairBackRight = new PhysicsHair();
            physicsHairBackRight.setup(0.24f, 0.5f, 0.18f);
            PhysicsHair.Src srcXBackRight = PhysicsHair.Src.SRC_TO_X;
            PhysicsHair.Src srcZBackRight = PhysicsHair.Src.SRC_TO_G_ANGLE;
    
            physicsHairBackRight.addSrcParam(srcXBackRight, "PARAM_ANGLE_X", 0.005f, 1);
            physicsHairBackRight.addSrcParam(srcZBackRight, "PARAM_ANGLE_Z", 0.8f, 1);
    
            PhysicsHair.Target targetBackRight = PhysicsHair.Target.TARGET_FROM_ANGLE;
            physicsHairBackRight.addTargetParam(targetBackRight, "PARAM_HAIR_BACK_R", 0.005f, 1);

    在Update里面添加下面的代码

            physicsHairBackLeft.update(live2DModel, time);
            physicsHairBackRight.update(live2DModel, time);

    Live2d中的表情系统

    首先定义三个变量

        //表情
        public TextAsset[] expressionFile;
        public L2DExpressionMotion[] expressions;
        private MotionQueueManager expressionMotionQueueManager;

    在Start里面进行初始化

            //表情
            expressionMotionQueueManager = new MotionQueueManager();
            expressions = new L2DExpressionMotion[expressionFile.Length];
            for (int i = 0; i < expressions.Length; i++)
            {
                expressions[i] = L2DExpressionMotion.loadJson(expressionFile[i].bytes);
            }

    表情的播放

    Update里面添加播放表情的代码,与播放动作的代码相似

            //播放表情
            if (Input.GetKeyDown(KeyCode.M))
            {
                motionIndex++;
                if (motionIndex >= expressions.Length)
                {
                    motionIndex = 0;
                }
                expressionMotionQueueManager.startMotion(expressions[motionIndex]);
            }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))问题{0:2d} {1:3d} {2:4d}是什么意思?解答format()函数字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加;这里面:{0:2d} ...

    下面代码中:

    for x in range(1, 11):

    ... print('{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x))

    问题

    {0:2d} {1:3d} {2:4d}是什么意思?

    解答

    format()函数
    字符串的参数使用{NUM}进行表示,0, 表示第一个参数,1, 表示第二个参数, 以后顺次递加;
    这里面:{0:2d} 表示第一个参数x的格式。0 代表x,:2d 表示两个宽度的10进制数显示。

    {1:3d} 表示第一个参数x*x的格式。1 代表x*x,:3d 表示三个宽度的10进制数显示。
    {2:4d} 表示第一个参数x*x*x的格式。2代表x*x*x,:4d 表示四个宽度的10进制数显示。

    展开全文
  • 我们非常高兴地宣布2D实验预览! 这是一个抢先体验版,因此您可以尝试2D团队正在开发的所有新功能。 它对所有人都可用 ! (We are extremely excited to announce the 2D Experimental Preview! This is an early ...
  • 输出printf 时 %2d,%d,%02d,%.2d

    千次阅读 2017-02-14 10:04:43
    C语言中%d %.2d %2d %02d的区别   %d就是普通的输出了 %.2d %2d %02d的区别" title="[原创]--C语言中%d %.2d %2d %02d的区别" style="margin:0px; padding:0px; border:0px; list-style:none"> ...
  • Steam平台3款2D游戏开发软件对比(转)

    千次阅读 2017-11-04 21:56:10
    无意中看到steam平台。知道这个平台上有很多游戏,第一次接触这个平台是在Dota2...想必这几个工具一定要比写C++代码的cocos2d-x好用很多。这些年,一直在从事cocos2d-x引擎的游戏开发。除了U3d和UE4之外,很少接触到
  • c语言,%d %.2d %2d %02d的区别

    万次阅读 2014-06-03 11:34:08
    %d就是普通的输出了 %2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格 %02d,和%2d差不多,只不过左边补0 %.2d没见过,但从执行效果来看,和%02d一样
  • C语言中%d %.2d %2d %02d的区别

    万次阅读 2017-09-06 09:36:21
    1、%d就是普通的输出了 2、% 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。如下: 3、% 02d,和% 2d差不多,只不过左边补0 4、%.2d从执行效果来看,和% 02d一样
  • 纯干货!live2d动画制作简述以及踩坑

    万次阅读 多人点赞 2018-10-11 17:25:13
    1. 概述live2d是由日本Cybernoids公司开发,通过扭曲像素位置营造伪3d空间感的二维动画软件。官网下载安装包直接安装可以得到两种软件,分别是Cubism Modeler和Cubism Animator,最后我们还需要安装第三个软件Viewer...
  • 15款Cocos2d-x游戏源码

    万次阅读 2017-11-30 17:52:12
    (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现、新局面、悔棋、游戏音乐、胜利后会显示游戏结果。 源码下载:http://www.okbase.net/file/item/27881 ...
  • Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk

    万次阅读 热门讨论 2013-12-03 21:19:21
    模拟真实的世界是个比较麻烦的事情,通常这种事情都是交给物理引擎来做。但它们使用的过程中有个令人讨厌的地方——参数太多了。...它将Box2D或者chipmunk做了一层封装,使我们的上层调用有更友好的接口,先上图:....
  • Live2d vue 插件 将live2d引入vue工程 在网页上添加live2d模型 前面的废话: Live2d火过一阵,因为当我搜索“live2d 添加到网页上“的时候可以看到很多宅友已经给自己的博客首页加上了live2d看板娘并且发了博客...
  • 我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用。这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵...
  • 【PyTorch学习笔记】17:2D卷积,nn.Conv2d和F.conv2d

    万次阅读 多人点赞 2020-02-16 13:05:23
    2D卷积很适合处理图像输入。以之前的MNIST为例,在使用MLP时,为方便全连接层的处理,将28乘28的输入flatten成了784维的向量,这样就要有784个权值。而使用了2D卷积以后,假设使用3乘3的卷积核,那么每次的输入都是...
  • cocos2d-x box2d 入门

    千次阅读 2014-03-04 17:33:53
    天天飞翔,物理特性用了box2d来做的。关于box2d的入门教程网上有很多,推荐官方手册,中文版,地址。我不再做重复介绍,稍微写点自己理解的东西。 cocos2d-x可以和box2d的C++版完美融合,集成起来很方便。 #...
  • 1,Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。 2,Rectangle2D 类描述通过位置 (x,y) 和尺寸 ...
  • Unity 2D独立开发手记(外篇):Anima2D动画制作

    万次阅读 多人点赞 2019-10-11 21:08:56
    角色全都是用手机的dotpict这款像素画APP一点一点画...动画制作我使用的是AssetStore里面的Anima2D插件,真心好用,不过仅仅合适于两朝向的动画,例如《饥荒》,而想要制作四朝向动画,例如GBA上《塞尔达传说》那种...
  • 在查看代码的时候,看到有代码用到卷积层是tf.nn.conv2d,也有的使用的卷积层是tf.contrib.slim.conv2d,这两个函数调用的卷积层是否一致,在查看了API的文档,以及slim.conv2d的源码后,做如下总结:首先是常见使用...
  • Unity-Live2d 概述:这是我学习Unity中Live2d的相关操作的一个笔记,欢迎各位同好和大牛的指点。(参考siki学院出的视频学的) 脚本初始化: 首先在创建的脚本里,我们需要导入live2d的命名空间即写入————using...
1 2 3 4 5 ... 20
收藏数 531,046
精华内容 212,418
关键字:

2d