2014年7月11日星期五

Unity3D脚本语言UnityScript初探 - x3d

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Unity3D脚本语言UnityScript初探 - x3d  阅读原文»

一、Unity中的"JavaScript"与你所了解的JavaScript对比

1. 使用 #pragma strict

#pragma strict

进行这样的声明,是一种很好的习惯,并且对于进行iOS开发来说也是必须的。 #pragma strict 意味着强制进行更严格的类型检测、尽早生成更多有用的错误信息、养成更好的编程习惯。

2. 使用枚举 enum

enum WeaponType { pistol, rifle, launcher}
var type : WeaponType = WeaponType.pistol;

这种方式更加简洁,并且是比使用字符串产生更少潜在错误的方法。

3. 其实是大不相同的

尽管Unity中的JavaScript尝试尽量做得至少某种程度上要像ECMAScript标准,但它与同样基于ECMAScript的JavaScript在其他实现方面有很多不同。也许它与微软的JScript更加相似,尤其是它们都是.NET平台上的语言。当然,Unity的JavaScript版本是自己独立开发实现的,并且两者之间也有很多不同之处。

4. 运行速度快

Unity JavaScript 是编译型的,所以性能很高,但浏览器中的JavaScript是动态解释型的。

在Unity中,JavaScript、C#与Boo在运行速度上显然没有差异。它们各有优缺点,但速度上是一致的。

说明:如果你关注过浏览器之争的话,你应该知道现代浏览器中JavaScript已经不是简单的解释执行,而是以JIT方式编译执行。当然,肯定是不支持严格类型定义的。如果ECMAScript标准改成允许显示声明变量类型(像Adobe公司所提倡的,译注:其实个人觉得UnityScript更像是ActionScript3),JavaScript的性能还能以数量级的提升。尽管如此,现实是真正的JavaScript就算是拿Safari浏览器的Squirrelfish Extreme引擎进行测试,比Unity中的UnityScript仍要慢上两个数量级。

5. 必须用var关键字声明变量

JavaScript中,如果你定义变量时不用var关键字,该变量将会作为全局变量处理。

function DoSomeStuff() {
x = 3;
}

DoSomeStuff();

alert(x); // returns 3 ... in JavaScript (not in Unity's UnityScript)

为了避免JS老用户在Unity碰到这种模棱两可的情况,就要求在定义变量时加上var关键字,那样就可以自动讲变量的作用域限定在当前范围。

function DoSomeStuff() {
var x = 3;
}

DoSomeStuff();

print(x); // raises an error because x is not global in any sense.

6. UnityScript是基于类式继承,而不是原型式继承

UnityScript中,没有.prototype那样混乱的写法。要定义类,你只要这样简单的定义:

// Foo.js
var foo = "hello, world";

function doEet () {
// does nothing, intended to be overridden
}

编译器最后在编译之前会自动补全一些代码,构造一个完整的类定义结构。最终形式应该类似如下:

// Foo.js
import UnityEngine;
class Foo extends MonoBehaviour {
public var foo = "hello, world";

public function doEet () {
// does nothing, intended to be overridden
}
}

请注意,文件名就是对应的类名。

子类写法:

// PrintingFoo.js
class PrintingFoo extends Foo {
function doEet() {
print( foo );
}
}


虚函数可用于重载函数

在UnityScript中,你可以创建虚函数。

class Foo
{
virtual function DoSomething ()
{
Debug.Log("from base class");
}
}

//SubFoo.js
class SubFoo extends Foo
{
virtual function DoSomething()
{
Debug.Log("from sub class");
}
}

//Elsewhere
var foo : Foo = new SubFoo();
foo.DoSomething();//prints from sub class

如果你要调用父类的方法,用关键字super。示例如下:

class SubFoo extends Foo
{
virtual function DoSomething()
{
super.DoSomething();
Debug.Log("from sub class");
}
}

//Elsewhere
var foo : Foo = new SubFoo();
foo.DoSomething();//prints "from base class" and "from sub class"

考虑用编写Mixins与Helpers的方式替代子类继承

可以很容易编写相互访问与调用的类,但还有一种方式可能比用对指定对象进行子类继承具有更好的维护性。

如:

/* Foo.js */
var bar : Bar;

function Start(){
bar = gameObject.GetComponent(Bar);
}

function doEet(){
// do my own thing
if( bar ){
ba
iTextSharp快速使用指南 - JulyLuo  阅读原文»

前言

最近公司一直使用iText开发PDF报表,使用一段时间之后发现iText这个类库虽然是庞大无比,但作为程序猿我们不需要知道所有的类和方法,我们只需要知道如何使用即可。

所以这篇文章就是告诉大家如何快速的使用iTextSharp(iText .net版本)进行开发。

iTextSharp开发步骤

快速开发之前,我们先了解以下4个类:

class 所代表的含义
Paragraph 报表中的文本
Image 报表中的图片
PdfPTable 表格
PdfPCell 单元格

知道这4个类之后就是开发的步骤了:

1. 往单元格PdfPCell类中添加内容。

2.将单元格PdfPCell添加到PdfPTable。

3.将表格PdfPTable添加到Document。

在以上的步骤中最重要的就是第一步也就是往PdfPCell中添加内容,而PdfPCell中的内容又可以分为以下三种情况:

文本 Paragraph
图片 Image
表格 PdfPTable

接下来我们就直奔主题,看是如何往PdfPCell添加内容。因为报表需要数据,所以我就从百度分辨率统计获取了一些数据,下面是这个网址的截图:

image

往PdfPCell添加文本

文本由Paragraph来表示,在添加之前还要注意一下字体的问题,因为我们用的是中文字体,如果用默认英文字体渲染则会乱码,所以我们要先定义中文字体:

BaseFont BF_Light = BaseFont.CreateFont(@"C:\Windows\Fonts\simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

字体定义完之后下面就添加文本:

//要设置字体和大小
p = new Paragraph(fields, new Font(BF_Light, 13));
cell =
new PdfPCell(p);
//设置cell属性
//cell.Border = Rectangle.NO_BORDER;
if (rowNum == 0)
{
cell.BackgroundColor =
BaseColor.GRAY;
}
if (i == mainColumn - 1)
{
cell.HorizontalAlignment =
Element.ALIGN_RIGHT;
}
//添加单元格
table.AddCell(cell);

其实添加很简单,就是最上面两行代码,而对PdfPCell属性设置的代码一般会比较多,因为我们一般要设置其背景色,水平对其,还有边框Border等。

往PdfPCell添加图片和表格

在大家了解怎么往PdfPCell添加完文本之后,添加图片和表格就简单很多了,就是将Image和PdfPTable作为PdfPCell的构造器参数传入即可:

//图片
Image image = Image.GetInstance(imagePath);
cell =
new PdfPCell(image, true);
table.AddCell(cell);

//表格
PdfPTable baseTable = GetBaseTable();
cell =
new PdfPCell(baseTable);
table.AddCell(cell);

以下就是效果图:

image

iTextSharp画图

通过以上PdfPCell的操作,大家就可以实现一些比较常见的PDF报表,现在我们更进一步实现一下的效果:

image

这里就必须用到画图,画图用的就是PdfContentByte类,这个就类似于画板,我们可以直接在上面画直线和文本:

//画线
canvas.SaveState();
canvas.SetLineWidth(2f);
canvas.MoveTo(100, 100);
canvas.LineTo(200, 200);
canvas.Stroke();
canvas.RestoreState();

//文本
ColumnText.ShowTextAligned(canvas, Element.ALIGN_RIGHT, new Phrase("JulyLuo测试", new Font(BF_Light, 10)), 100, 20, 0);

这里要注意的是,无论是画线还是文本我们都需要坐标,而且在画线的时候,要将具体的代码放在SaveState和RestoreState中间,这样就不会导致画图状态的紊乱。

如果我们希望将上图画在一个单元格中,但我们知道画图需要坐标,而在PdfPCell中是坐标没有暴露出来,所以这里我们需要iTextSharp中的接口:IPdfPCellEvent

public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)

这个接口的意思就是在单元格添加到文档之后暴露的方法。很明显,通过postion参数我们可以获取坐标,canvases参数可以获取画板。

所以要画图就创建一个实现接口IPdfPCellEvent的类,然后在CellLayout方法中画线和文本:

public void CellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
{

没有评论:

发表评论