精华内容
参与话题
问答
  • C语言中%d %.2d %2d %02d的区别

    万次阅读 多人点赞 2017-10-24 19:20:03
    %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]);
            }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 输出printf 时 %2d,%d,%02d,%.2d

    千次阅读 2017-02-14 10:04:07
    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"> ...

    C语言中%d %.2d %2d %02d的区别

     
    %d就是普通的输出了
    
    
    
    
    
     % 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。如下:
    
    
    
    
    
    % 02d,和% 2d差不多,只不过左边补0
    
    
    
    
    
    
    
    
    %.2d从执行效果来看,和% 02d一样
    
    
    
    
    
    
    展开全文
  • Steam平台3款2D游戏开发软件对比(转)

    千次阅读 2017-11-04 21:56:52
    无意中看到steam平台。知道这个平台上有很多游戏,第一次接触这个平台是在Dota2...想必这几个工具一定要比写C++代码的cocos2d-x好用很多。这些年,一直在从事cocos2d-x引擎的游戏开发。除了U3d和UE4之外,很少接触到
    无意中看到steam平台。知道这个平台上有很多游戏,第一次接触这个平台是在Dota2出来时,想在mac os系统上玩游戏的时候。今天看到这个平台上也有独立开发者开发的游戏发布。听说也有开发者赚了不少钱的。在网上找了一下开发工具。发现下文特地拿来分享。想必这几个工具一定要比写C++代码的cocos2d-x好用很多。
    这些年,一直在从事cocos2d-x引擎的游戏开发。除了U3d和UE4之外,很少接触到其他的游戏开发工具。今天也算收获不小。虽然工具是winodws下使用的,但好像开发出来的游戏支持很多开发平台。这样也算是弥补了自已在游戏开发界的眼界。
    文章中提到的三个2D游戏开发工具:
    文章的评论中还提到几个3D游戏开发工具:
    其实还有很多游戏引擎,参考下边的链接。
    本人凭着对游戏开发的热爱,尝试学习了Steam平台的3款2D游戏开发软件的基础教程,这三款软件分别是:GameMaker: StudioClickteam Fusion 2.5Construct 2。因为没有系统学习过编程,也不是专业游戏开发人员,下面对这三款软件的对比,仅限于通过学习三款软件的基础教程后对他们的了解进行讲述,内容不一定正确和全面,仅给大家作为参考。

    一、总评
    1. 这三款软件都是买断制的,而不像一些大型游戏引擎,需要按时间支付版权费用。
    2. 三款软件都是以2D游戏开发为主,支持非编程试开发,以及多平台导出。即是说,不要求专业的编程知识即可进行游戏开发,制作的项目可以导出为多种平台文件,降低跨平台开发成本。
    3. 区别于RPG Maker这类专项游戏开发软件,软件提供的都是最基本的游戏功能设置,虽然理论上说是可以开发任何类型的游戏,但个人感觉开发动作类游戏要相对简单一些,但开发策略或RPG类型的游戏,需要构建一些基础功能,开发难度会更大一些。简单来说就是自由度有了,但一切都需要从头来过。

    二、软件的版本和价格对比

    GameMaker:Studio 官方网站:http://yoyogames.com/
    官方提供以下4个版本:
    免费版本(下载地址)在使用资源上有一些限制,详细内容参考这里
    Standard版本售价$49.99,和免费版本相比只是去掉了资源使用限制,因为不支持其它扩展,主要用于教学和培训,因此不建议购买。
    Professional版本售价$99.99,包括所有功能,但要做其它平台输出就需要单独购买相应的扩展,例如你如果想开发苹果手机上的游戏,那么就需要购买iOS Export。
    Master Collection版本售价$799.99,一次性买断所有的扩展和以后推出的新扩展,一次性投入,终身受益。
    各个版本功能对比见 http://yoyogames.com/studio

    需要注意的是官方没有直接提供各个版本的升级方案,即是说如果你有Standard版若想升级为Professional版的话,只能重新购买。但如果想升级也并非完全不可能,例如官方在新年的促销活动中允许玩家以补差额的方式进行升级。
    关于Master Collection的价格还有一个小故事,讲述的是在2013年8月,YoyoGame为了庆祝推出GMS1.2版本和Yoyo编译器,特别将Master Collection版本的售价从$499.99提升到$799.99,另外还在官网搞活动可以支付差额获得Master Collection的非Steam版本。(详情点这里
    最近在官方的技术博客中发布了一些关于1.3开发中的新特性文章,有兴趣的可以去看看。

    Clickteam Fusion 2.5 官方网站:http://www.clickteam.com/
    官方提供以下3个版本:
    免费版本(暂无下载)缺少一些功能。
    标准版本售价$99.99,有一些商业用途上的限制,Steam平台上的也是这个版本。
    Developer版本售价$399.99,免去一切限制。
    各个版本功能对比见 http://www.clickteam.com/compare-versions

    多平台输出作为额外的模组需要单独购买,以后官方还会推出内购商店用来购买官方或是第三方开发的一些功能模块。
    Fusion 2 的版本原来是叫Multimedia Fusion 2(现已被Clickteam Fusion 2.5取代),另外官方还有一个软件叫The Games Factory 2,官方在玩文字游戏么?
    Fusion 2 曾经出现在Humble商店每周特惠活动的第32周内,可以在官网支付40刀升级为Fusion 2.5,并可激活Steam版本。
    关于Fusion 2.5对于Fusion 2进行的提升以及优惠信息,请参考这里http://www.clickteam.com/clickteam-fusion-2-5-released.html

    Construct 2 官方网站:https://www.scirra.com/
    官方提供以下3个版本:
    免费版本(下载地址)在使用资源上有一些限制。
    Personal版本售价79英镑(Steam售价$118.99,无功能限制,限定个人使用。
    Business版本售价259英镑(Steam售价$398.99),无限制,如果你的作品给你带来的收入超过5000美金,就要买它了。

    在Steam的商店页面下面的差评中,有人评论Steam上的版本不够稳定,建议使用官方版本。
    可能因为是基于Html5技术开发,所以Construct 2直接支持多平台输出,而不需要额外购买导出插件。
    展开全文
  • C语言 printf("%2d:%2d:%2d\r", t->hour, t->minute, t->second); 这个内容怎么在ege界面显示
  • c语言,%d %.2d %2d %02d的区别

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

    万次阅读 多人点赞 2004-10-30 16:10:00
    看看下面的说明就知道啦:修饰符 格式说明 意义 int a=1;int b=1234;double c=1.2345678;printf("%2d ",a);printf("%+2d ",a);printf("%4d ",a);printf("%2d ",b);printf("%+2d ",b);printf("%4d ",b);printf("%
  • C语言中%d %.2d %2d %02d的区别

    万次阅读 2017-09-06 09:36:21
    1、%d就是普通的输出了 2、% 2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。如下: 3、% 02d,和% 2d差不多,只不过左边补0 4、%.2d从执行效果来看,和% 02d一样
  • %2d是什么意思

    千次阅读 2015-01-02 01:53:32
    int a=12;  printf("%6d,%d\n",a,1);  结果为6个字符的空间
  • C和python中%d %.2d %2d %02d的区别

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

    千次阅读 2015-02-08 14:47:25
    在scanf语句中%*s,在c语言中的说明是该处的*表示忽略该处的变量输入。 还是看一下下面的程序说明吧... scanf("%2d%*2s%d",&a,&b); printf("\na=%d,b=%d\n",a,b); return 0; } 运行结果: 输入:12345678 输出:a=
  • printf ("%2d\n",a);2是什么意思? 2006-09-19 19:41卡路里亏空 | 分类:其他编程语言 | 浏览9660次 分享到: 2006-09-19 20:21提问者采纳 答题闯关,过关即送礼!快来参加~ 表示提供2个...
  • 对于C语言的输出格式("/n%2d,%2.1f,%2.11f)是什么意思

    万次阅读 多人点赞 2010-12-14 11:04:00
    对于C语言的输出格式("/n%2d,%2.1f,%2.11f)是什么意思#include "stdio.h" int main() { int a=1234; float b=123.456; double c=12345.54321; printf("/n%2d,%2.1f,%2.11f",a,b,c); } 输出结果为1234...
  • c语言问题,%d %.2d %2d %02d的区别。。。 %d就是普通的输出了,%d 是输出十进制整数 d是decimal的缩写。 % 2d是将数字按宽度为2,采用右对齐方式输出,如果数据位数不到2位,则左边补空格。 %02d:默认情况下,数据...
  • 关于%02d %.10d %2d %.01f的值的区别

    千次阅读 2015-01-27 16:25:09
    1、printf("%.2d\n",2);和printf("%02d\n",2);以及printf("%.02d\n",2);的结果是一样的都是02,百分号后面的小数点或者0代表了数字前面要以0来占位;格式化字符串中的d前面的非零数字代表的是 需要保留 的 有效...
  • %d:为普通的输出。 %2d:按宽度为2输出,右对齐方式输出。若不够两位,左边补空格。 %02d:同样宽度为2,右对齐方式。位数不够,左边补0。 %.2d:从执行效果来看,与%02d一样。 ...
  • 偶尔被别人问到一个问题。瞎猜之后发现了一个奇巧淫技。题目大致题目很简单。记忆模糊,简单阐述。 输入904512 输出 a=90 b=4 c=5 d=12 ...scanf("%2d%1d%1d%2d",a,b,c,d);就可以按照格式输入数据。
  • C语言里面 2d 意思

    2018-11-05 00:28:29
    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本...分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;... 看看下面的说明就知道啦
  • python中的%2d是什么意思* 在这里为我们需要知道%2d在c语言中的意思 %是强制转换字符,d是十进制。2是场宽的意思 场宽就是整数的宽度是2位,若不足两位,左边补0; %100d,即场宽是100,当print是100的时候,100的...
  • java 处理2D图形 及代码

    千次阅读 2017-09-02 08:37:18
    Graphics类包含绘制直线,矩形或者椭圆的方法。...要想使用Java 2D库绘制图形,需要获得一个Graphics2D类对象。这个类是Graphics的子类。自从JavaSE 2版本以来,paintComponent方法就会自动的获得一个Graphics2D类对
  • 2D和3D转换

    2020-07-04 19:26:28
    要想学好2D和3D转换要先对 坐标 有一定了解 2D 2维坐标系 2D转换中的 属性 在使用转换是我们要先给元素添加转换属性 transform(x,y),X代表X轴,Y代表Y轴 1.移动 translate 当我们要移动盒子时,可以给盒子添加 ...
  • Cocos2d-x中的字符串

    万次阅读 2014-05-09 11:48:58
    Cocos2d-x中的字符串 在Cocos2d-x中能够使用的字符串constchar*、std::string和cocos2d::__String等,其中const char*是C风格的字符串,std::string是C++风格的字符串,它封装了const char*。cocos2d::__String才...
  • Java中2D图形常用方法

    2016-07-05 00:09:37
    2)void repaint():“尽可能快的”重新绘制组件(绘制2D图像时,即使缩小窗口后在恢复,图形仍在) 3)void paintComponent(Graphics g):覆盖这个方法来绘制自己的组件(这是继承JComponent时,如果集成式...
  • 【PyTorch学习笔记】17:2D卷积,nn.Conv2d和F.conv2d

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

    万次阅读 多人点赞 2019-03-09 14:52:42
    一、nn.Conv2d nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)) 参数: in_channel:输入数据的通道数,例RGB图片通道数为3; out_channel: 输.....
  • PyTorch学习笔记(9)——nn.Conv2d和其中的padding策略

    万次阅读 多人点赞 2018-09-12 18:06:48
    一. Caffe、Tensorflow的padding策略 在之前的转载过的一篇文章——《tensorflow ckpt文件转caffemodel时遇到的坑》提到过,caffe的padding方式和tensorflow的padding方式有很大的区别,输出无法对齐。...
  • Unity 2D 入门

    万次阅读 多人点赞 2017-07-14 13:34:43
    原文:Introduction to Unity 2D 作者:Sean Duffy 译者:kmyhy 3/15/17 更新说明: 升级至 Unity 5.5。Unity 是一个非常流行和强大的游戏引擎,它支持众多的平台和设备。尽管 3D 游戏最近火热,大部分手机游戏、...
  • 纯干货!live2d动画制作简述以及踩坑

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

    万次阅读 多人点赞 2017-12-28 22:51:33
    角色全都是用手机的dotpict这款像素画APP一点一点画...动画制作我使用的是AssetStore里面的Anima2D插件,真心好用,不过仅仅合适于两朝向的动画,例如《饥荒》,而想要制作四朝向动画,例如GBA上《塞尔达传说》那种...
  • Unity性能优化——Rigidbody2D详解

    万次阅读 多人点赞 2017-12-20 15:25:51
    在移动或旋转一个物体时,往往会直接使用Transform来执行这些操作。比如使用如下代码来移动一个GameObject: void Update(){ ... this.transform.Translate (Vector3.left * speed * Time.deltaTime);...

空空如也

1 2 3 4 5 ... 20
收藏数 603,103
精华内容 241,241
关键字:

2d