unity3d铁水特效_unity3d 特效 - CSDN
  • 铁水罐扒渣实验 图片

    2020-05-27 23:31:45
    武汉科技大学在进行的铁水罐侧吹扒渣的水力模型实验中现场拍摄的部分图片。为测试时的图片
  • 降低高炉铁水硅含量不但可以降低高炉燃料比,提高高炉利用系数,实现节能减排;而且可以使炼钢工序实现少渣冶炼,缩短炼钢时间,降低能耗和材料费用,为冶炼品种钢创造良好条件。通过采用6σ方法对数据进行分析并采取了...
  • 论文题目:基于 LSTM-RNN 模型的铁水硅含量预测 作者:李泽龙,杨春节,刘文辉,周恒,李宇轩 (浙江大学控制科学与工程学院,浙江 杭州 310027) 论文要点 1 研究背景及方法比较 2 研究方法论述 3 性能比较及结果...

    论文题目:基于 LSTM-RNN 模型的铁水硅含量预测

    作者:李泽龙,杨春节,刘文辉,周恒,李宇轩
    (浙江大学控制科学与工程学院,浙江 杭州 310027)

    论文要点

    1 研究背景及方法比较
    2 研究方法论述
    3 性能比较及结果分析
    4 心得体会

    1 研究背景及方法比较

    1.1 研究背景

    硅含量是炼铁过程重要的参考指标。在稳定工况下,当硅含量低于 0.4%时,炉温一般低于1500℃,无法正常炼铁;硅含量高于 0.6%时,温度过高,焦炭的消耗过高。为了炼铁过程的稳定进行,一般需要将硅含量控制在 0.4%~0.6%之间。如果可以提前预知硅含量,操作工将可以提前进行必要的操作来控制高炉平稳运行[1]。现有的硅含量检测方法是将出炉铁水送至化验室化验获得。这样得到的结果有严重的滞后,对生产的参考性大大降低。只有及时准确地预测出高炉硅含量,才能真正发挥这一指标的真正价值。

    1.2 方法比较

    目前对于硅含量预测的模型主要有两大类:机理模型和数据驱动模型。

    • 机理模型主要是利用物理学中的热平衡特性和化学中的物料守恒原则进行分析,该类模型根据高炉冶炼中产生的化学反应,对炉身不同层级的物料反应进行建模,然而由于高炉内部的反应极其复杂,而且模型中需要用到的许多参数无法测量到,所以预测效果较差。
    • 数据驱动模型主要使用了统计学方法及机器学习方法。所用的方法主要有:回归分析、偏最小二乘法(partial least squares regression, PLS)、主成分分析、自回归分析、神经网络方法、支持向量机。其中,回归分析、偏最小二乘法、主成分分析、自回归分析是采用统计学的方法,他们各自采取不同的统计学指标作为优化目标,效果也各不相同。神经网络模型与支持向量机则属于机器学习方法,他们以预测精度作为更加直观的优化目标,经过大量的训练学习,可以取得更好的效果。

    2 研究方法论述

    由于高炉炼铁是一个动态的时间序列,所以使用递归神经网络(recurrent neural network, RNN)更加合适。除此之外,高炉反应的过程是渐变的,也就是说当前的炉况与历史炉况相互关联。这就要求递归神经网络能够动态记忆历史信息,在学习新信息的同时保持历史信息留存持久化,所以本文引入了将 RNN 的隐含层添加长短时记忆网络结构(long short-term memory,LSTM)的方法进行研究。

    2.1 RNN神经网络模型

    RNN 的精髓在于对隐藏层之间进行了连接,跨越了时间点。换句话说,隐含层的信息不仅传递到了输出层,还传递到了下一时刻的隐含层。

    在这里插入图片描述
    RNN详细介绍参考:https://zhuanlan.zhihu.com/p/30844905

    展开的网络可以采用反向传播的方式进行训练,其本质就是 BP误差反向传播,不同的是这种传播是跨时间步的,即参数是共享的。也就是每一步误差的反向传递不仅依赖当前网络状态,还依赖前步网络状态。

    2.2 LSTM 对 RNN 的改进

    传统的 RNN 存在一个梯度消失的问题,即如果当前的输出与非常久远的时间序列有关,RNN 将无法学习到,所以就需要引入 LSTMs。相似的算法还有GRU(门控循环单元)。

    在常规的 RNN 中,隐含层一般是一个非常简单的节点,比如 Tanh,LSTM 则是将隐含层的简单节点改进为存储单元。 存储单元由输入门 i、输出门 o、遗忘门 f 和记忆细胞 c 组成。前向传播时,输入门确定什么时候让激活传入存储单元,而输出门确定什么时候让激活传出存储单元;反向传播时,输出门确定什么时候让错误流入存储单元,而输入门确定什么时候让它流出存储单元。输入门、输出门、遗忘门是控制信息流的关键。
    在这里插入图片描述
    存储单元的运作原理可以用式(1)~式(5)表示
    在这里插入图片描述
    其中,ct表示 t 时刻记忆细胞的计算方法;ht 为t 时间点 LSTM 单元的所有输出;W, U, V, b 分别是系数组成的矩阵和偏置的向量,δ是激活函数sigmoid; 是点乘运算;it, ft, ot 分别是 t 时间点输入门、遗忘门和输出门的计算方法。

    个人感觉吴恩达课程讲述较为容易理解
    在这里插入图片描述
    这里输入𝑥<1>,然后𝑥<2>,𝑥<3>,然后你可以把这些单元依次连起来,这里输出了上一个时间的𝑎,𝑎会作为下一个时间步的输入,𝑐同理。然后需要注意上面那条红线,这里用了单独的更新门𝛤𝑢和遗忘门𝛤 𝑓,这给了记忆细胞选择权去维持旧的值𝑐<𝑡−1>或者就加上新的值𝑐 ̃<𝑡>,这条红线显示了只要你正确地设置了遗忘门和更新门,LSTM 是相当容易把𝑐<0>的值一直往下传递到右边,比如𝑐<3> = 𝑐<0>。

    吴恩达GRU讲解
    在这里插入图片描述
    LSTM和GRU本质上就像RNN一样,但它们能够使用称为“门”的机制来学习长期依赖。这些门是不同的张量操作,可以学习添加或删除隐藏状态的信息。为了更好的和LSTM联系在一起学习,这里GRU 实际上输出的激活值𝑎<𝑡>与记忆细胞值𝑐<𝑡>相同,即𝑐<𝑡> = 𝑎<𝑡>。

    GRU 具体用的式子𝑐<𝑡> = 𝛤𝑢 ∗ 𝑐 ̃<𝑡> + (1 − 𝛤𝑢) ∗ 𝑐<𝑡−1>。如果这个更新值𝛤𝑢 = 1,也就是说把这个新值,即𝑐<𝑡>设为候选值(𝛤𝑢 = 1时简化上式,𝑐<𝑡> = 𝑐 ̃<𝑡>)。如果将更新门值设为 1,即往前更新这个值。对于所有在这中间的值,你应该把门的值设为 0,即𝛤𝑢 = 0,意思就是说不更新它,就用旧的值。因为如果𝛤𝑢 = 0,则𝑐<𝑡> = 𝑐<𝑡−1>,𝑐<𝑡>等于旧的值。当你从左到右扫描这个句子,门值为 0 的时候(中间𝛤𝑢 = 0一直为 0,表示一直不更新),就用旧的值,也不会忘记这个值是什么,这样即使你一直处理句子到后面的位置,𝑐<𝑡>应该会一直等𝑐<𝑡−1>,于是它仍然记得前面的信息。
    在这里插入图片描述
    对于完整的 GRU 单元,做的一个改变就是在计算的第一个式子中给记忆细胞的新候选值加上一个新的项,添加一个门𝛤 𝑟,可以认为𝑟代表相关性(relevance)。这个𝛤 𝑟门告诉你计算出的下一个𝑐<𝑡>的候选值𝑐 ̃<𝑡>跟𝑐<𝑡−1>有多大的相关性。

    2.3 数据的选择

    由于实际生产中可能会出现硅含量的剧烈变动,为了表征实际的工况,本文选取了具有代表性的一段数据,数据中每隔一段时间都会出现非常剧烈的变动。

    影响硅含量的因素有很多,鼓风的特性、入炉原料的性质、炉内物理状况都会影响硅含量。常用的用于硅含量预测的变量有炉顶压力、透气性、喷煤、富氧率、炉顶温度、压差、料批、热封压力、热风温度、热风流量、鼓风湿度、前一炉硅含量。本文结合走势曲线以及与因变量的相关系数选取了 7 个与硅含量预测的相关度最高的变量作为 LSTM-RNN 的输入变量。
    在这里插入图片描述
    为防止不同自变量数量级的巨大差别造成奇异解,对数据进行归一化处理,映射到[−1,1]之间。

    2.4 模型评价指标的选择

    本文采用的评价指标是命中率和均方误差。

    • 命中率是预测误差的绝对值小于或等于 0.1 的样本数占总样本数的比率,它体现预测模型的准确程度,其定义公式为(其中,ratio 为命中率;n 为样本数目;hit 为命中;e 为预测误差)
      在这里插入图片描述
    • 均方误差指的是误差平方的平均值,它体现预测效果的稳定程度,其定义公式为
      在这里插入图片描述

    2.5 模型参数设定

    本文采用程序寻优的方法来确定最优参数。需要调节的主要参数有存储单元数目、结构和训练集时间窗口大小。对每种情况训练 10 次,监测其命中率。

    监测结果说明模型效果波动非常小,每种参数设定下命中率的偏差小于15%。当训练集时间窗为21,存储单元数目为 20 时效果较好。当节点数过小时,数据特征提取不足;当节点数过大时,数据则会出现过拟合。

    将逐个时间点的数据输入网络,预测下一时间点的硅含量。然后将下一时间点的真实硅含量值当做已知输入网络,继续预测,在线滚动。

    3 性能比较及结果分析

    为了说明 LSTM-RNN 模型的性能,本文将 PLS、典型 RNN 与 LSTM-RNN 进行性能比较,由于机器学习算法存在一定的波动,为了进一步说明其稳定性,本文采用 10 次训练的结果,取平均值以展示算法的平均水平。

    LSTM-RNN 比 PLS 命中率提升22%,比典型 RNN 提升了 12%。在均方误差方面,LSTM-RNN 模型比另外两种方法均有显著提升。
    在这里插入图片描述
    在这里插入图片描述
    注:偏最小二乘法(partial least-square method,PLS)是一种数学优化技术,通过最小化误差的平方和找到一组数据的最佳函数匹配

    在这里插入图片描述
    在这里插入图片描述
    由于测试数据来源于波动比较大的炉况,因而85%的命中率不是十分理想。但是对于运行非常平稳的炉况,预测效果将会提升更多。总体而言,相较于前人的工作取得了较好的模型预测精度,而且预测结果稳定性好。

    4 心得体会

    通过本文的阅读,让自己对RNN和LSTM有了更为深入的了解,具体的应用和结果的预测也给了自己很大的启发。接下来将用代码实现LSTM-RNN模型,使用数据预测出结果来做进一步的分析学习。

    展开全文
  • 铁水调度的路径规划—最短路径的两种算法背景介绍Dijkstra算法Floyd算法 背景介绍 小编接到一个铁水运输的调度任务,该任务暂定分为三部分,第一期定为较简单的路径规划(指定机车头的起始、终点位置),确定最优...

    铁水调度的路径规划—最短路径的两种算法

    背景介绍

    小编接到一个铁水运输的调度任务,该任务暂定分为三部分,第一期定为较简单的路径规划(指定机车头的起始、终点位置),确定最优路径。
    实际任务的路径规划,了解业务逻辑后发觉,其实往往现实生活中与算法有一定区别:比如客户有时候最关心的问题不是最短、最优,而是你在一个合理的范围内,安全、稳定是系统的首要前提,但是也不逼逼了,直接上今天我学到的这两个算法。

    Dijkstra算法

    一、最短路径
    显而易见,在非网图中,最短路径是指两顶点经历的边数最少的路径;而在网图中,最短路径是指两顶点间经历的权值之后最短的路径。
    在这里插入图片描述
    AE:1 ADE:2 ADCE:3 ABCE:3
    在这里插入图片描述
    AE:100 ADE:90 ADCE:60 ABCE:70

    然后该算法的思想很简单,属于贪心算法,具体如下:
    1、指定一个节点,例如我们要计算 ‘A’ 到其他节点的最短路径
    引入两个集合(S、U),S集合包含已求出的最短路径的点(以及相应的最短长度),U集合包含未求出最短路径的点(以及A到该点的路径,注意 如上图所示,A->C由于没有直接相连 初始时为∞)

    2、初始化两个集合,S集合初始时 只有当前要计算的节点,A->A = 0,
    U集合初始时为 A->B = 4, A->C = ∞, A->D = 2, A->E = ∞,敲黑板!!!接下来要进行核心两步骤了

    3、从U集合中找出路径最短的点,加入S集合,例如 A->D = 2
    4、更新U集合路径,if ( ‘D 到 B,C,E 的距离’ + ‘AD 距离’ < ‘A 到 B,C,E 的距离’ ) 则更新U
    循环执行 4、5 两步骤,直至遍历结束,得到A 到其他节点的最短路径

    其实吧(参考https://www.jianshu.com/p/ff6db00ad866)
    就是如果确定了A-D的的距离最短为2,则下一步的更新条件为:“D到B、C、E的距离”+“AD最短距离”<A到B、C、E的距离 则更新

    Floyd算法

    今天我们讨论的是floyd算法,它用于解决多源最短路径问题,算法时间复杂度是O(n3).floyd算法为什么经典,因为它只有5行(或者4行)!!!
    是的,没有特意的写成一行的代码.
    在这里插入图片描述
    这个算法短的离谱,以致于我们通常直接将它背了下来当模板使用,而不像学dijkstra那时候一步步理解它是如何贪心的。至于为什么这四步就能找到任意两点的最短路径呢?精妙之处,就是在K放在最外层。
    我们可以利用归纳法,证明得到一个很致命的结论:
    假设i和j之间的最短路径上的结点集里(不包含i,j),编号最大的一个是x.那么在外循环k=x时,d[i][j]肯定得到了最小值。
    证明过程参考博客https://blog.csdn.net/xianpingping/article/details/79947091

    展开全文
  • 【app内容简介】  《钢铁是怎样炼成的》是前苏联作家尼古拉·奥斯特洛夫斯基所著的一部长篇小说,于1933年写成。讲述保尔·柯察金从一个不懂事的少年到成为一个忠于革命的布尔什维克战士,再到双目失明却坚强...

    【app内容简介】

         《钢铁是怎样炼成的》是前苏联作家尼古拉·奥斯特洛夫斯基所著的一部长篇小说,于1933年写成。讲述保尔·柯察金从一个不懂事的少年到成为一个忠于革命的布尔什维克战士,再到双目失明却坚强不屈创作小说,成为一块坚强钢铁(是指他的精神)的故事。

    【support  information】

    • 如果您购买的app有任何问题,或者好的建议请mail to:82272109@qq.com.

    【下载地址】

    【播放器具有如下功能】

    • 无广告,无内购,无任何求好评
    • 离线播放,不消耗,不盗刷流量
    • 可以收藏自己喜欢的曲目
    • 可以自动记忆上次播放结束的时间
    • 可以后台锁屏续听,屏幕上直接操作音频,无需解锁
    • 可以设置播放时间,比如想播放30分钟,设置后,30分后自动停止,并记忆停播的时间点
    • 支持耳机线控(播放,暂停,下一曲,上一曲,音量)
    • 播放器实现了单曲目循环,专辑循环,快进,快退,跳曲等功能
    展开全文
  • 一种电炉热装铁水的设计与应用2doc,一种电炉热装铁水的设计与应用2
  • S7-400和WINCC在铁水脱硫系统中的应用pdf,S7-400和WINCC在铁水脱硫系统中的应用
  • 基于包钢6号高炉的在线生产数据,首先建立铁水硅含量序列的自回归AR(p)模型,分析其滞后阶数;然后对硅含量的自回归项及影响因素进行主成分分析,找到多元变量相互独立的有效信息作为输入变量;最后建立铁水硅含量的支持...
  • 压水堆核电站铁水反应机理研究,吕雪峰,,从微观上研究压水堆核电站严重事故下减少或控制氢气生成的措施需研究氢气生成的微观机理。本文采用量子化学理论,应用量子化学软
  • 举一个例子,假设我们这些程序员有一天穿越到了古代,成为了比程序员还苦的炼钢工人(我可没有诅咒大家啊)……为了方便炼铁,工厂给我们准备了几个模子,我们只用将不同的铁水倒进这个模子,然后等它冷却,就能打造...

    lufy前辈写过《[代码艺术]17行代码的贪吃蛇小游戏》一文,忽悠了不少求知的兄弟进去阅读,阅读量当然是相当的大。今天我不仿也搞一个这样的教程,目地不在于忽悠人,而在于帮助他人。

    先看demo效果图:


    测试URL:

    http://www.cnblogs.com/yorhom/articles/3157553.html


    关注我的blog的人不仿会看到我最近发布了新引擎lufylegendRPG 1.0.0,今天就算来推广一下这个引擎吧。也好让大家见证一下封装的力量。

    引擎下载地址:http://www.cnblogs.com/yorhom/archive/2013/06/08/3126534.html

    lufylegendRPG 1.0.0发布帖:http://blog.csdn.net/yorhomwang/article/details/9103451


    首先为了不让大家质疑,我先声明,我这里说的145代码没有经过压缩和格式优化,只不过这里是没有包含脚本的……毕竟脚本太大了嘛……

    (lufy前辈一定心中在想:“你还不是忽悠人,还冤枉我”)

    话不多讲,把145行代码上给大家看看:

    LSystem.screen(LStage.FULL_SCREEN);
    init(50,"mylegend",480,288,main);
    LGlobal.setDebug(true);
    LRPG.setShortcuts(true);
    
    var backLayer,loadingLayer;
    var loadData = [
    	{path:"./js/script.js",type:"js"},
    	{name:"map",path:"./images/map01.jpg"},
    	{name:"player",path:"./images/p0.png"},
    	{name:"npc",path:"./images/p1.png"},
    	{name:"m",path:"./images/m.jpg"},
    	{name:"n",path:"./images/n.jpg"},
    	{name:"talk",path:"./images/back.png"},
    	{name:"e1",path:"./images/e1.png"},
    	{name:"e2",path:"./images/e2.png"}
    ];
    var datalist = [];
    
    var map,mapData;
    var charaList;
    var talkContent;
    var jumpTo;
    var stage;
    
    var isJumpMap = false;
    var stageObj;
    
    var dir = "";
    
    function main(){
    	loadingLayer = new LoadingSample3(); 
    	addChild(loadingLayer); 
    
    	LLoadManage.load(
    		loadData,
    		function(progress){
    			loadingLayer.setProgress(progress);
    		},
    		gameInit
    	);
    }
    function gameInit(result){
    	removeChild(loadingLayer);
    	datalist = result;
    	
    	initLayer();
    	
    	initScriptData();
    	stage = script.stage01;
    	initScript();
    	addCtrl();
    }
    function initLayer(){
    	backLayer = new LSprite();
    	addChild(backLayer);
    	ctrlLayer = new LSprite();
    	addChild(ctrlLayer);
    }
    function addScene(){
    	var mapObj = new LTileMap(map,datalist["map"],32,32,mapData);
    	var stageData = new LSceneData(mapObj,charaList,talkContent);
    	stageObj = new LScene(stageData);
    	backLayer.addChild(stageObj);
    	
    	var talkBoardData = new LBitmapData(datalist["talk"]);
    	var talkBoard = new LBitmap(talkBoardData);
    	talkBoard.scaleX = 28;
    	talkBoard.scaleY = 6.2;
    	talkBoard.x = 100;
    	talkBoard.y = 70;
    	talkBoard.alpha = 0.7;
    	
    	stageObj.talk.x = 120;
    	stageObj.talk.y = 30;
    	stageObj.setTalkStyle({x:-80,y:20},{x:20,y:55,size:12,color:"lightgray"},{x:20,y:85,size:10,color:"lightgray"},talkBoard,200);
    	stageObj.addMoveEventListener(LEvent.COMPLETE,function(){
    		for(var i=0;i<jumpTo.length;i++){
    			if(isJumpMap == false && stageObj.playerX == jumpTo[i].at.x && stageObj.playerY == jumpTo[i].at.y){
    				stage = script[jumpTo[i].to];
    				initScript();
    				isJumpMap = true;
    			}
    			if(isJumpMap == true)isJumpMap = false;
    		}
    	});
    }
    function addCtrl(){
    	var bitmapdata = new LBitmapData(datalist["e1"]);
    	var bitmap = new LBitmap(bitmapdata);
    	bitmap.x = 0;
    	bitmap.y = 0;
    	ctrlLayer.addChild(bitmap);
    	var bitmapdata = new LBitmapData(datalist["e2"]);
    	var bitmap = new LBitmap(bitmapdata);
    	bitmap.x = 280;
    	bitmap.y = 30;
    	ctrlLayer.addChild(bitmap);
    	ctrlLayer.x = 40;
    	ctrlLayer.y = 160;
    	
    	addEvent();
    }
    function addEvent(){
    	backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,ondown);
    	backLayer.addEventListener(LMouseEvent.MOUSE_UP,onup);
    	backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
    }
    function ondown(event){
    	if(event.offsetX >= ctrlLayer.x + 40 && event.offsetX <= ctrlLayer.x+80){
    		if(event.offsetY >= ctrlLayer.y && event.offsetY <= ctrlLayer.y+40){
    			dir = "UP";
    		}else if(event.offsetY >= ctrlLayer.y+80 && event.offsetY <= ctrlLayer.y+120){
    			dir = "DOWN";
    		}
    	}else if(event.offsetX >= ctrlLayer.x && event.offsetX <= ctrlLayer.x+40){
    		dir = "LEFT";
    	}else if(event.offsetX >= ctrlLayer.x+80 && event.offsetX <= ctrlLayer.x+120){
    		dir = "RIGHT";
    	}
    }
    function onup(event){
    	dir = "";
    	if(event.offsetX >= ctrlLayer.x + 280 && event.offsetX <= ctrlLayer.x+330){
    		if(event.offsetY >= ctrlLayer.y+40 && event.offsetY <= ctrlLayer.y+100){
    			stageObj.startTalk();
    		}
    	}
    }
    function onframe(){
    	switch(dir){
    		case "UP":
    			stageObj.movePlayer(LPlayerMove.UP);
    			break;
    		case "DOWN":
    			stageObj.movePlayer(LPlayerMove.DOWN);
    			break;
    		case "LEFT":
    			stageObj.movePlayer(LPlayerMove.LEFT);
    			break;
    		case "RIGHT":
    			stageObj.movePlayer(LPlayerMove.RIGHT);
    			break;
    	}
    }

    可以看到,代码是还是老样子,没有一点压缩。其实这里面大家没有看到一点数据是因为我把数据放在了脚本里,脚本可以是一种特定格式的语言,可以用自定义的,比如像lufy前辈的L#。当然在js里也可以用xml和json,json比较方便,所以这次就选择了它,里面的代码如下:

    var script;
    
    function initScriptData(){
    	script = {
    		stage01:{
    			map:[
    				[18,18,18,18,18,18,18,18,18,18,18,18,55,55,18,18,18],
    				[18,18,18,17,17,17,17,17,17,17,17,17,55,55,17,17,18],
    				[18,18,17,17,17,17,18,18,17,17,17,17,55,55,17,17,18],
    				[18,17,17,17,18,18,18,18,18,17,17,55,55,17,17,17,18],
    				[18,17,17,18,22,23,23,23,24,18,17,55,55,17,17,17,18],
    				[18,17,17,18,25,28,26,79,27,18,55,55,17,17,17,17,18],
    				[18,17,17,17,17,10,11,12,18,18,55,55,17,17,17,17,17],
    				[18,18,17,17,10,16,16,16,11,55,55,17,17,17,17,17,18],
    				[18,18,17,17,77,16,16,16,16,21,21,17,17,17,17,17,18],
    				[18,18,17,17,77,16,16,16,16,55,55,17,17,17,17,17,18],
    				[18,18,18,18,18,18,18,18,18,55,55,18,18,18,18,18,18]
    			],
    			mapdata:[
    				[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
    				[1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1],
    				[1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1],
    				[1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,0,1],
    				[1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1],
    				[1,0,0,1,1,1,0,1,1,1,1,1,0,0,0,0,1],
    				[1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0],
    				[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
    				[1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
    				[1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1],
    				[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    			],
    			add:[
    				{chara:"player",data:datalist["player"],row:4,col:4,speed:3,x:5,y:6},
    				{chara:"npc",talkIndex:1,data:datalist["npc"],row:4,col:4,speed:3,x:7,y:7},
    				{chara:"npc",talkIndex:2,data:datalist["npc"],row:4,col:4,speed:3,x:3,y:3}
    			],
    			talk:{
    				1:[
    					{face:datalist["m"],name:"[鸣人]",msg:"我是木叶村的鸣人,你是谁?"},
    					{face:datalist["n"],name:"[黑衣忍者甲]",msg:"你就是鸣人?九尾还在你身体里吗?"}
    				],
    				2:[
    					{face:datalist["n"],name:"[黑衣忍者乙]",msg:"鸣人,听说忍者大战就要开始了。"},
    					{face:datalist["m"],name:"[鸣人]",msg:"真的吗?一定要想想办法啊。"}
    				]
    			},
    			jump:[
    				{at:{x:6,y:5},to:"stage02"},
    				{at:{x:16,y:6},to:"stage03"}
    			]
    		},
    		stage02:{
    			map:[
    				[0,0,1,2,2,2,2,2,2,2,2,1,0,0,0],
    				[0,0,1,3,5,5,1,5,5,5,5,1,0,0,0],
    				[0,0,1,80,4,4,1,80,4,4,4,1,0,0,0],
    				[0,0,1,80,4,4,1,80,8,7,8,1,0,0,0],
    				[0,0,1,80,4,4,5,81,4,4,4,1,0,0,0],
    				[0,0,1,2,2,2,6,4,4,4,4,1,0,0,0],
    				[0,0,1,3,5,5,81,4,4,4,4,1,0,0,0],
    				[0,0,1,80,4,4,4,4,4,4,9,1,0,0,0],
    				[0,0,1,2,2,2,2,6,2,2,2,1,0,0,0]
    			],
    			mapdata:[
    				[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
    				[1,1,1,0,0,0,1,0,0,0,0,1,1,1,1],
    				[1,1,1,0,0,0,1,0,0,0,0,1,1,1,1],
    				[1,1,1,0,0,0,1,0,0,1,0,1,1,1,1],
    				[1,1,1,0,0,0,0,0,0,0,0,1,1,1,1],
    				[1,1,1,1,1,1,0,0,0,0,0,1,1,1,1],
    				[1,1,1,0,0,0,0,0,0,0,0,1,1,1,1],
    				[1,1,1,0,0,0,0,0,0,0,1,1,1,1,1],
    				[1,1,1,1,1,1,1,0,1,1,1,1,1,1,1]
    			],
    			add:[
    				{chara:"player",data:datalist["player"],row:4,col:4,speed:3,x:7,y:8},
    				{chara:"npc",talkIndex:1,data:datalist["npc"],row:4,col:4,speed:3,x:8,y:3},
    				{chara:"npc",talkIndex:2,data:datalist["npc"],row:4,col:4,speed:3,x:10,y:3}
    			],
    			talk:{
    				1:[
    					{face:datalist["m"],name:"[鸣人]",msg:"你们在干什么啊?"},
    					{face:datalist["n"],name:"[黑衣忍者甲]",msg:"我们在喝茶。"}
    				],
    				2:[
    					{face:datalist["n"],name:"[黑衣忍者乙]",msg:"我们在喝茶,你不要打扰我们。"},
    					{face:datalist["m"],name:"[鸣人]",msg:"....."}
    				]
    			},
    			jump:[
    				{at:{x:7,y:8},to:"stage01"}
    			]
    		},
    		stage03:{
    			map:[
    				[55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55],
    				[55,55,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19],
    				[55,55,19,19,19,18,19,19,18,18,18,18,17,17,17,17,19],
    				[55,55,55,19,19,19,19,19,19,18,18,17,17,17,19,19,19],
    				[55,19,55,19,19,18,19,19,18,19,17,17,17,17,19,18,19],
    				[55,19,19,19,19,19,18,19,18,19,17,17,17,17,19,19,19],
    				[10,11,11,11,11,11,11,12,17,17,17,17,17,17,19,18,19],
    				[55,19,19,19,19,19,19,16,11,56,57,17,17,17,19,19,19],
    				[55,18,17,17,77,16,16,16,16,55,55,17,17,17,19,19,19],
    				[55,19,17,17,77,16,16,16,16,55,55,18,18,19,19,19,18],
    				[55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55,55]
    			],
    			mapdata:[
    				[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
    				[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
    				[1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1],
    				[1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1],
    				[1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1],
    				[1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1],
    				[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1],
    				[1,1,1,1,1,1,1,0,0,1,1,0,0,0,1,1,1],
    				[1,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1],
    				[1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1],
    				[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    			],
    			add:[
    				{chara:"player",data:datalist["player"],row:4,col:4,speed:3,x:1,y:6},
    				{chara:"npc",talkIndex:1,data:datalist["npc"],row:4,col:4,speed:3,x:8,y:7}
    			],
    			talk:{
    				1:[
    					{face:datalist["m"],name:"[鸣人]",msg:"这是哪里?好美啊。"},
    					{face:datalist["n"],name:"[黑衣忍者甲]",msg:"这里是红树林"}
    				]
    			},
    			jump:[
    				{at:{x:0,y:6},to:"stage01"}
    			]
    		}
    	};
    }
    
    function initScript(){
    	map = stage.map;
    	mapData = stage.mapdata;
    	talkContent = stage.talk;
    	charaList = stage.add;
    	jumpTo = stage.jump;
    	
    	backLayer.removeAllChild();
    	addScene();
    }

    这里一共有三个脚本,所以看上去代码比较多。前面136行都是数据的记录,只有后面的initScript是用来初始化场景的。

    由于我写这个示例只是为了娱乐一下,所以没有写一句注释(在下实在是太懒了……),为了方便大家理解,我说一下整个游戏的制作过程和设计方式。

    首先,我们的游戏主体应该是一像模板样的东西,数据和这些模板分开,要用到数据时,将数据引入然后通过固定的模板实现相同的作用但不同的效果。举一个例子,假设我们这些程序员有一天穿越到了古代,成为了比程序员还苦的炼钢工人(我可没有诅咒大家啊)……为了方便炼铁,工厂给我们准备了几个模子,我们只用将不同的铁水倒进这个模子,然后等它冷却,就能打造出材料不同但造型相同的武器(也不知道古代有没有这种高科技东西)。这样做的好处是快捷和方便修改。假如我们遇到战乱的年代,皇帝老儿要咱们在一个月内做1GB这么多的长枪去抵抗外敌,我们怎么办呢??这时如果用到这种方法,那我们就只用不断得将铁水倒进模子就可以了。话又说回来,如果模子做得差,那制造出来的东西还是个什么玩意?

    现在我们穿越回来,回到高新的IT时代。现在我们要做的差不多和做兵器是一个原理,因此我们在Main.js里写模子,铁水就交给脚本处理吧。

    如果说看了半天被搅昏了的同学,那就看一下《html5游戏开发-零基础开发RPG游戏-开源讲座(四)-游戏脚本化&地图跳转》一文吧

    说了一堆原理性的话,我们不仿聊一下我们的引擎。其实模子做的好不好最关键就是看材料,如果我们花比皇宫还贵的钱来修这个模子,那我真心觉得没这个必要,因此我们应该把模子作得相对简单。使Main.js中的代码少的一个重要因素就是用到了lufylegendRPG中的LScene类,这个类非常得帅,用法就不多说了,API看了就知道。

    API文档:http://www.cnblogs.com/yorhom/archive/2013/06/15/3137789.html


    差不多就讲到这里吧,各位可以尽可能地发挥特长,利用该引擎制作一款像样的RPG游戏。

    至于源代码嘛,可以下载lufylegendRPG-1.0.0,就在解开压缩包后的rpg_sample文件夹中。

    另外做了一个留言板,欢迎热爱技术的朋友前来讨论:http://www.cnblogs.com/yorhom/archive/2013/04/20/3033235.html


    谢谢大家阅读本文,支持就是最大的鼓励。

    ----------------------------------------------------------------

    欢迎大家转载我的文章。

    转载请注明:转自Yorhom's Game Box

    http://blog.csdn.net/yorhomwang

    欢迎继续关注我的博客

    展开全文
  • 两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下。写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠谱的。 ...由浅入深,主要介绍maven的用途、核心概念(Pom、Repositories、Artifact、...

    http://www.trinea.cn/android/maven/

    两年半前写的关于Maven的介绍,现在看来都还是不错的,自己转下。写博客的一大好处就是方便自己以后查阅,自己总结的总是最靠谱的。

     

    由浅入深,主要介绍maven的用途、核心概念(Pom、Repositories、Artifact、Build Lifecycle、Goal)、用法(Archetype意义及创建各种项目)、maven常用参数和命令以及简单故障排除、maven扩展(eclipse、cobertura、findbugs、插件开发)、maven配置
    较长,可根据个人需要有选择性的查看,比如先看用法再回过头来看核心概念

    1、maven的用途
    maven是一个项目构建和管理的工具,提供了帮助管理 构建、文档、报告、依赖、scms、发布、分发的方法。可以方便的编译代码、进行依赖管理、管理二进制库等等。
    maven的好处在于可以将项目过程规范化、自动化、高效化以及强大的可扩展性
    利用maven自身及其插件还可以获得代码检查报告、单元测试覆盖率、实现持续集成等等。

     

    2、maven的核心概念介绍
    2.1 Pom

    pom是指project object Model。pom是一个xml,在maven2里为pom.xml。是maven工作的基础,在执行task或者goal时,maven会去项目根目录下读取pom.xml获得需要的配置信息
    pom文件中包含了项目的信息和maven build项目所需的配置信息,通常有项目信息(如版本、成员)、项目的依赖、插件和goal、build选项等等
    pom是可以继承的,通常对于一个大型的项目或是多个module的情况,子模块的pom需要指定父模块的pom

    pom文件中节点含义如下:

    其中groupId:artifactId:version唯一确定了一个artifact

     

    2.2 Artifact
    这个有点不好解释,大致说就是一个项目将要产生的文件,可以是jar文件,源文件,二进制文件,war文件,甚至是pom文件。每个artifact都由groupId:artifactId:version组成的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中

     

    2.3 Repositories
    Repositories是用来存储Artifact的。如果说我们的项目产生的Artifact是一个个小工具,那么Repositories就是一个仓库,里面有我们自己创建的工具,也可以储存别人造的工具,我们在项目中需要使用某种工具时,在pom中声明dependency,编译代码时就会根据dependency去下载工具(Artifact),供自己使用。
    对于自己的项目完成后可以通过mvn install命令将项目放到仓库(Repositories)中
    仓库分为本地仓库和远程仓库,远程仓库是指远程服务器上用于存储Artifact的仓库,本地仓库是指本机存储Artifact的仓库,对于windows机器本地仓库地址为系统用户的.m2/repository下面。
    对于需要的依赖,在pom中添加dependency即可,可以在maven的仓库中搜索:http://mvnrepository.com/

     

    2.4 Build Lifecycle
    是指一个项目build的过程。maven的Build Lifecycle分为三种,分别为default(处理项目的部署)、clean(处理项目的清理)、site(处理项目的文档生成)。他们都包含不同的lifecycle。
    Build Lifecycle是由phases构成的,下面重点介绍default Build Lifecycle几个重要的phase

    以上的phase是有序的(注意实际两个相邻phase之间还有其他phase被省略,完整phase见lifecycle),下面一个phase的执行必须在上一个phase完成后

    若直接以某一个phase为goal,将先执行完它之前的phase,如mvn install
    将会先validate、compile、test、package、integration-test、verify最后再执行install phase

     

    2.5 Goal
    goal代表一个特定任务

    mvn package表示打包的任务,通过上面的介绍我们知道,这个任务的执行会先执行package phase之前的phase
    mvn deploy表示部署的任务
    mven clean install则表示先执行clean的phase(包含其他子phase),再执行install的phase。

     

    3、maven用法
    主要讲下Archetype以及几种常用项目的创建
    maven创建项目是根据Archetype(原型)创建的。下面先介绍下Archetype
    3.1 Archetype
    原型对于项目的作用就相当于模具对于工具的作用,我们想做一个锤子,将铁水倒入模具成型后,稍加修改就可以了。
    类似我们可以根据项目类型的需要使用不同的Archetype创建项目。通过Archetype我们可以快速标准的创建项目。利用Archetype创建完项目后都有标准的文件夹目录结构
    既然Archetype相当于模具,那么当然可以自己再造模具了啊,创建Archetype
    下面介绍利用maven自带的集中Archetype创建项目。创建项目的goal为mvn archetype:generate,并且指定archetypeArtifactId,其中archetypeArtifactId见maven自带的archetypeArtifactId

     

    3.2 quick start工程
    创建一个简单的quick start项目,指定 -DarchetypeArtifactId为maven-archetype-quickstart,如下命令
    Xml代码 收藏代码
    mvn archetype:generate -DgroupId=com.trinea.maven.test -DartifactId=maven-quickstart -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    其中DgroupId指定groupId,DartifactId指定artifactId,DarchetypeArtifactId指定ArchetypeId,
    DinteractiveMode表示是否使用交互模式,交互模式会让用户填写版本信息之类的,非交互模式采用默认值
    这样我们便建好了一个简单的maven项目,目录结构如下:

    maven quick start

    现在我们可以利用2.4的build Lifecycle进行一些操作,先命令行到工程根目录下
    编译 mvn compile
    打包 mvn package,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件
    打包并安装到本地仓库mvn install,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。

     

    3.3 web工程
    创建一个简单的web项目,只需要修 -DarchetypeArtifactId为maven-archetype-webapp即可,如下命令

    maven web start

    其他:

    src\main\resources文件夹是用来存放资源文件的,maven工程默认没有resources文件夹,如果我们需要用到类似log4j.properties这样的配置文件,就需要在src\main文件夹下新建resources文件夹,并将log4j.properties放入其中。
    test需要用到资源文件,类似放到src\test下
    对于apache的log4j没有log4j.properties文件或是目录错误,会报如下异常

     

    4、maven常用参数和命令
    主要介绍maven常用参数和命令以及简单故障排除

    4.1 mvn常用参数
    mvn -e 显示详细错误
    mvn -U 强制更新snapshot类型的插件或依赖库(否则maven一天只会更新一次snapshot依赖)
    mvn -o 运行offline模式,不联网更新依赖
    mvn -N仅在当前项目模块执行命令,关闭reactor
    mvn -pl module_name在指定模块上执行命令
    mvn -ff 在递归执行命令过程中,一旦发生错误就直接退出
    mvn -Dxxx=yyy指定java全局属性
    mvn -Pxxx引用profile xxx

     

    4.2 首先是2.4 Build Lifecycle中介绍的命令
    mvn test-compile 编译测试代码
    mvn test 运行程序中的单元测试

    mvn compile 编译项目
    mvn package 打包,此时target目录下会出现maven-quickstart-1.0-SNAPSHOT.jar文件,即为打包后文件
    mvn install 打包并安装到本地仓库,此时本机仓库会新增maven-quickstart-1.0-SNAPSHOT.jar文件。
    每个phase都可以作为goal,也可以联合,如之前介绍的mvn clean install

     

    4.3 maven 日用三板斧
    mvn archetype:generate 创建maven项目
    mvn package 打包,上面已经介绍过了
    mvn package -Prelease打包,并生成部署用的包,比如deploy/*.tgz
    mvn install 打包并安装到本地库
    mvn eclipse:eclipse 生成eclipse项目文件
    mvn eclipse:clean 清除eclipse项目文件
    mvn site 生成项目相关信息的网站

     

    4.4 maven插件常用参数
    mvn -Dwtpversion=2.0 指定maven版本
    mvn -Dmaven.test.skip=true 如果命令包含了test phase,则忽略单元测试
    mvn -DuserProp=filePath 指定用户自定义配置文件位置
    mvn -DdownloadSources=true -Declipse.addVersionToProjectName=true eclipse:eclipse 生成eclipse项目文件,尝试从仓库下载源代码,并且生成的项目包含模块版本(注意如果使用公用POM,上述的开关缺省已打开)

     

    4.5 maven简单故障排除

    mvn -Dsurefire.useFile=false如果执行单元测试出错,用该命令可以在console输出失败的单元测试及相关信息
    set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m 调大jvm内存和持久代,maven/jvm out of memory error
    mvn -X maven log level设定为debug在运行
    mvndebug 运行jpda允许remote debug
    mvn –help 这个就不说了。。

     

    5、maven扩展
    maven常用插件配置和使用

     

    6、maven配置
    为了修改maven创建项目默认以来的jdk版本,看了下maven配置
    maven2.0默认使用jdk1.5导致反省、@override 等annotation不可用。可用两种方法修改jdk版本
    第一种:修改项目的pom.xml,影响单个项目,治标不治本

    pom中增加build配置,指定java版本为1.6
    第二种:修改maven配置,影响maven建立的所有项目
    到maven安装目录的conf文件夹下,修改settings.xml文件,如下:

    这样便能对所有默认的maven项目指定jdk为1.6

     

    到此为止,休息会儿

     

    参考资料:
    Maven官方文档:http://maven.apache.org/guides/index.html
    maven安装:http://maven.apache.org/download.html




    展开全文
  • 宝钢股份:钢铁工业整合的旗舰宝钢股份是我国最大的钢铁企业,公司产品定位于汽车、家电、能源、造船等行业,以其资金、技术、管理和供应链优势,在国内钢铁工业整合中具有十分重要的地位。随着公司宽厚板、不锈钢和...
  • 项目团队

    2007-10-26 16:19:00
    背景:为了完成西天取经任务,组成取经团队,成员有唐 僧、孙 悟空、猪八戒、沙和尚。其中唐僧是项目经理、孙悟空是技术核心、猪八戒和沙和尚是 普通团员。这个团队的高层领导是观音。...
  • 1、交叉熵 损失函数用交叉熵和均方误差的区别是什么?为什么网络选择损失函数,有时候用交叉熵,有时候用均方误差? 信息量: 一条信息的信息量大小和它的不确定性有很大的关系。一句话如果需要很多外部信息才能确定...
  • 美丽的花蕾灯

    2013-02-02 19:06:57
    美丽的花蕾灯 发表于:2012-10-28  浏览:26 评论:0  标签: 散文  会员名: ccifly  昵称: ccifly  性别: 未指定  生日: 2012-10-28
  • 氧化钾对磷在CaO-SiO2-FetO-P2O5脱磷渣系与碳饱和铁间分配比的影响,黄雄源,李光强,为了测定铁水预处理脱磷渣系与碳饱和高磷铁水之间磷的平衡分配比,获得适用于碳饱和高磷铁水脱磷预处理的熔剂组成,本文进行了添
  • 氧化钠对磷在CaO-SiO2-FetO-P2O5脱磷渣系与碳饱和铁间分配比的影响,黄雄源,李光强,为了测定铁水预处理脱磷渣系与碳饱和高磷铁水之间磷的平衡分配比,获得适用于碳饱和高磷铁水脱磷预处理的熔剂组成,本文进行了添
  • 电弧炉(简称电炉)主要是通过用废钢、铁合金和部分渣料进行配料冶炼,根据不同的钢种要求,可以接受高炭铬铁水和脱磷铁水,然后
  • 转炉炼钢工序热力学模型及能耗分析,陈嵩,姜泽毅,针对高炉-转炉-连铸工序界面,将工艺流程按照盛装设备划分为铁水包、转炉、钢包三个阶段,建立了包含铁水预处理、转炉炼钢、二
  • 铸造低铬钢球

    2020-02-20 14:05:29
     铸造低铬球采用铸造方式生产,铁水浇筑并添加少量铬元素,适用于小直径的球磨机。根据材质和硬度的不同,性能有所差异,关键在成型和热处理工艺的成熟、稳定和熟练性,缺点是冲击韧性低,用于大直径磨机破碎率会...
1 2 3 4 5 ... 18
收藏数 359
精华内容 143
关键字:

unity3d铁水特效