PS Suite SDK官方开发帮助文档完整中文翻译
http://psv.tgbus.com/psvjc/201205/20120529163344.shtml 2012年5月29日16:33
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
开发向导
关于此文档
PS Suite SDK(PlayStation®Suite Software Development Kit)是索尼电脑娱乐(SCE)提供的一款多平台应用开发及执行环境。该文档将向使用PS Suite SDK来开发PS Suite应用的人们提供开发信息。初次使用PS Suite SDK的开发者请参考“关于PS Suite SDK”的内容以及“设置开发环境”的内容。已有使用经验的开发者可以在发行说明中确认版本变动。
关于PS Suite SDK
PS Suite SDK是什么?
PS Suite SDK(PlayStation®Suite Software Development Kit)是一款支持多平台应用的开发环境。PS Suite SDK创建的应用程序(以下简称为PS Suite应用)由一个可以在不同设备上运行的二进制文件构成,例如PlayStation®Vita和Android设备等。由此,开发者不必为每种设备单独再写一份代码,可大幅度提高应用开发的效率。此外,PS Suite SDK支持Windows作为原型开发环境,在各平台上运行之前,可在Windwos PC上模拟运行,提高开发效率。
PS Suite应用可在哪些平台上运行?
PS Suite应用可在以下平台中运行:
?PlayStation®Vita
?Android设备 (必须支持PlayStation™认证)
?Windows PC(需要支持OpenGL 2.0或以上的显卡)
※支持PlayStation™认证的设备请参考以下网站。
http://www.playstation.com/pss/
PS Suite SDK开发概要
?PS Suite SDK是在PS Suite Studio集成开发环境基础之上,采用C#语言进行开发的。
?C#编译器将C#源代码编译成托管代码。
?可以通过点击PS Suite Studio的按钮,将生成的PS Suite应用传输到各个设备中。
?已经传输好的PS Suite应用,在Mono运行时(兼容.NET Framework的虚拟机)执行JIT(运行时编译执行)编译,由此来执行程序。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144013396.jpg
开发使用工具
PS Suite Studio
使用PS Suite Studio作为集成开发环境(IDE)。
UI工具箱,PS Suite UI Composer
UI工具箱是PS Suite中,为了创建UI而包含设计图和组件(GUI部分)的一种库。PS Suite UI Composer(在本SDK文档中简称为UI Composer)作为UI设计的支持工具,可实现按钮和标签等组件的布局,也可以进行各种组件的属性设置。详细说明请见UI Toolkit。
API
PS Suite SDK提供了一个基于C#的类库,其中包括开发游戏最基本的功能,例如纹理、声音、图像、字体、游戏控制器等类。关于API的详细说明参考API参考。
设置开发环境
设置PS Suite Studio集成开发环境
该部分设置PS Suite Studio作为集成开发环境。
启动PS Suite Studio
首先双击桌面上的PS Suite Studio图标来启动该程序。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144013852.jpg
PS Suite Studio启动后,会显示以下画面。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144014830.jpg
生成?运行例子
该部分通过一个例子描述了如何生成并运行PS Suite应用。
打开解决方案
首先打开解决方案文件。解决方案文件中包含了项目配置,其扩展名为sln。在PS Suite Studio的菜单中选择File->Open,从对话框中选择sample/Graphics/TriangleSample,然后打开TriangleSample.sln。例子默认安装路径如下:
?Windows XP:“C:/Documents and Settings/All Users/Documents/Pss/”
?Windwos 7:“C:/Users/Public/Documents/Pss/”
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144014117.jpg
生成
在PS Suite Studio的菜单中选择Build->Build All,或者直接按F8键来执行生成。想查看生成结果的日志,要点击窗口左下的Bulid successful部分,并按下按钮。当窗口左下显示Bulid successful时即为生成成功。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144015182.jpg
选择执行平台
在确认生成成功后,运行生成后的PS Suite应用试试看。首先要指定执行平台。先试着在Windows下运行一下。
1、将鼠标移动到工具栏的位置,右键点击,勾选PS Suite后会出现下拉列表。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144015850.jpg
2、在下拉列表中选择PlayStation Suite Simulator(PSS模拟器)。
3、在菜单中选择Run->Debug,或者直接按F5键启动应用程序。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144017373.jpg
在PS Suite Studio的窗口中会显示应用程序输出的字符串。
※可以通过选择菜单中的View->Pads->Application Output来显示Application Output窗口。
4、想要结束应用程序,请点击窗口右上角的×或者直接按Shift+F5键。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
在Android设备上运行的设置
该部分解释了在Android设备上运行PSS应用的步骤。注意这个步骤需要Android设备有无线网络环境,连接到网络。
准备
1、通过USB线将Android设备连接到开发用的PC上。
2、在开发用的PC上安装Android设备的驱动。
3、PSS应用将安装到Android设备的SD卡上,确保SD卡有足够的空间。
启动
1、因为PSS应用在启动时必须连接到我们的服务器进行认证,所以请确保Android设备已经和网络建立的无线连接。
2、在PSS Studio打开任意例子,然后从下拉列表中选择Android(xxxxxx)。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144826390.jpg
※(xxxxxx)表示Android设备的ID号,每个Android设备的ID都不同。
3、从菜单中选择->,或者按F5键来将相关文件从开发用的PC上传送到Android设备上,并启动应用。
在PSV上运行的设置
该部分解释了在PSV上运行PSS应用的步骤。在PSV上运行需要一个记忆卡和无线网络环境(WiFi/3G)。
在开发用的PC上安装PSV的USB驱动
如果开发用的PC的系统是Windows XP,在通过USB线将PSV连接到开发用的PC上时会被提示重新安装USB驱动。在这种情况,根据Windows对话框中的指示在开发用的PC上安装USB驱动。如果系统是Windows 7,将不需要这么设定。
在Windows XP上安装USB驱动
1、通过USB线将PSV连接到开发用的PC上。当连接后,会显示下面的对话框,选择"Yes, this time only"(是的,仅本次)然后点击"Next >"(下一步 >)按钮。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144831400.jpg
2、选择"Install the software automatically (Recommended)"(自动安装软件(推荐))然后点击"Next >"(下一步 >)按钮。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144831922.jpg
3、点击按钮将开始安装过程。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144832958.jpg
4、当USB驱动安装完成,会显示下面的对话框。点击"Finish"(完成)按钮来完成安装过程。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144832169.jpg
在PSV上安装PlayStation Suite Development Assistant(PSS开发助手)
接下来,在PSV上安装PSS开发助手。按照下面的步骤来安装。
1、在PSV主界面轻点"Browser"(浏览器)来启动它。输入下面的URL来访问PSS开发者入口。
http://www.playstation.com/pss/developer/openbeta/
2、选择PlayStation Suite Development Assistant下面的"download"将启动PS商店。在打开的页面中选择"PlayStation Suite Development Assistant"并下载它。
3、下载完成后,它将自动安装到PSV中。检查"PS Suite Dev"图标是否已经加入主界面。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144832214.jpg
启动PSS开发助手
1、通过USB线将装有SD卡的PSV连接到开发用的PC上。
2、在PSV主界面轻点"PS Suite Dev"图标来启动它。
3、因为PSS应用在启动时必须连接到我们的服务器进行认证,所以请确保PSV已经和网络建立的无线连接(WiFi/3G)。
※当PSV认证成功,接下来的24小时将不会再次进行认证。
PC端的设定
1、在PSS Studio打开任意例子,然后从下拉列表中选择PS Vita(xxxxxx)。
※(xxxxxx)表示PSV的ID号,每个PSV的ID都不同。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144832673.jpg
2、从菜单中选择->,或者按F5键来将相关文件从开发用的PC上传送到PSV上,并启动应用。
创建一个新项目
创建一个PSS解决方案
该部分将描述如何创建一个PSS解决方案。
1、在PSS Studio的欢迎页面选择或者从菜单选择->->。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144833110.jpg
2、在对话框左边的树形视图中选择->,然后在窗口的中间选择。创建好的包含一套执行程序用的文件。设置好项目名称和保存位置后按OK按钮。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144834443.jpg
3、当你完成这些设定,将创建好一个新的PSS项目。执行生成后,像前面章节提到过的按F5来运行。当创建好,将显示一个类似下面的屏幕。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521144834158.jpg
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之一:程序框架
这篇文章通过制作一款简单的2D射击游戏,来向玩家说明游戏应用的基本组成与PS Suite SDK的开发方法。此外,该文档是以以下读者为目标而撰写的。
对象读者
?初次开发游戏应用的人
?理解C#语言基础的人
最小的PS Suite程序
那么,首先让我们来执行一个最小的PS Suite程序吧。打开PS Suite Studio,在File->Open中打开Sample/Tutorial文件夹。Sample/Tutorial folder默认安装路径如下。
?Windows XP系统:“C:/Documents and Settings/All Users/Documents/Pss/”
?Windows 7系统:“C:/Users/Public/Documents/Pss/”
sample/Tutorial/Sample01
http://psv.tgbus.com//UploadFiles_5352/201205/20120521145457195.jpg
扩展名为sln的文件是解决方案文件,它描述了项目文件的结构。扩展名为csproj的文件是项目文件,它描述了源代码(cs文件)的结构以及生成方法。Sample01文件夹中构建应用程序的内容被称为“项目”。
※请注意,“项目文件csproj”与“项目”的含义是不同的。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521145458614.jpg
解决方案文件和项目文件的结构关系
解决方案文件是项目的起点,所以在开始开发应用时就要打开该文件。打开解决方案文件后并生成后,按F5键执行。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521145458236.jpg

恭喜你!不过这个程序只有一个全黑的屏幕,其它什么都没有,请点击窗口右上的×键或在PS Suite Studio中按下Shift+F5键来结束程序。
PSS应用的基本框架
那么,先来看看下面的源代码吧。想要看到下面的源代码,需要在左边的解决方案浏览器里双击AppMain.cs文件。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521145459330.jpg

这里需要注意Main(), Initialize(), SystemEvents.CheckEvents(), Update(), Render(), and SwapBuffers()函数。
Main()
?程序都是从Main()函数开始的。每个应用中必须有一个Main()函数。如果存在2个或更多,生成时会出错。
Initialize()
?Initialize()里的内容主要描述了初始化的过程。在这个程序框架下这个过程只在启动时被执行1次。
while
?接着进入一个while循环。换句话说,SystemEvents.CheckEvents(), Update()和Render()会在里面被重复执行。
SystemEvents.CheckEvents()
SystemEvents.CheckEvents()用来检查系统依赖事件。举个例子,可以在这检测到Android设备上一个程序最小化事件等,或者在这检测到在Windows上处理窗口消息等。
Update()
Update()中主要描述了委托CPU的计算处理的内容等。
Render()
Render()中主要描述了渲染处理以及委托GPU处理的内容等。在Render()中,帧缓冲先被graphics.Clear()清空。
SwapBuffers()
通过SwapBuffers()以垂直同步的时间来切换帧缓冲。
我们把最后的“以垂直同步的时间来切换帧缓冲”部分拿出来做个详细的说明。为了能让大家更直观地了解程序是怎样运作的,我们将程序改成以下的样子,有<-的地方表示追加部分。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521145459102.jpg

执行该程序之后,画面的背景色会逐渐变白,然后再次切换成黑色。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521145459540.jpg

graphics.SetClearColor(int r, int g, int b, int a)是通过传入的参数来清除画面的。r=255, g=255, b=255是白色。a被称为阿尔法,是用来表示透明度的。0是完全透明,而255则是完全不透明的意思。也就是说,只要多执行几次colorValue++;就会明白它是怎样处理的了。该数值在PC模拟器中1秒中会更新60次,也就是说约16.6毫秒就会更新一次。
处理流程
双缓冲
处理流程图如下所示。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521145459664.jpg

显示图像的显存区域被称为帧缓冲。在游戏应用当中,一般都有两个显示画面的图像区域,这种方式被称为双缓冲。渲染流程如下:
1、首先将后面的区域(back)清除为r=1, g=1, b=1(为了更加容易理解上图,我们将其调整得偏白一些)。
2、如果渲染结束,就要等待经过16毫秒。
3、16毫秒经过后,被清除为r=1, g=1, b=1的区域就移动到前方(front)来了。
4、这次轮到后面的区域被清除为r=2, g=2, b=2了。
5、如果渲染结束,就要等待经过16毫秒。
6、16毫秒经过后,被清除为r=2, g=2, b=2的区域就移动到前方(front)来了。
不断重复该过程,程序就会继续运行下去。之所以要进行切换区域显示,是为了避免在渲染过程当中画面显示不正常。这种配合显示的更新时间被称为“等待垂直同步”。显示的更新时间约为16.6毫秒(注1),所以帧缓冲的切换也要配合这一数字。这一系列的过程都是在SwapBuffers()里执行的。在SwapBuffers()中,每次等待画面切换一轮的这个过程被称为1帧。我们用fps(Frame Per Second: 帧/秒)做单位来表示每秒中更新了多少帧。如果是每秒更新了60次,那就要写成60fps。
(注1)请注意在某些Android设备中是无法达到60fps的。
术语定义
本节中,出现了一些术语,为了避免混淆,让我们重新认识一下。
显示:是指硬件显示设备。
屏幕:是指软件的画面。
帧缓冲:为了显示画面,在显存中开辟的区域。
本节中,出现的术语也会在今后章节中继续沿用下去,请记好。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之二:显示图像
本节说明了如何在屏幕上显示图像。
显示图像的步骤
只是让屏幕逐渐变白一点意思都没有,所以让我们试着让它显示些东西出来看看吧。这一次,打开文件夹Tutorial/Sample02_01/中的解决方案。
以下步骤说明了如何显示图像。
添加图像文件
向项目中添加你想要显示的图像文件。
1、在PS Suite Studio解决方案浏览器中,选择resources文件夹,右键点击->Add->Add File,并选择想要显示的图像文件。
2、添加文件之后,右键点击->Properties->Build Action然后选择“Contents”(PNG文件会默认选择为Contents)。图片文件支持PNG/BMP/JPEG/GIF等格式,由于PNG格式支持透明度,所以如果想用透明颜色的时候,最好使用PNG格式。该文件夹不需要一定是"resources"文件夹,你可以将文件添加到其他你想要的位置。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150125661.jpg
添加着色器程序
向项目中添加着色器程序。
?在这里,向项目中添加顶点着色器Sprite.vcg和片段着色器Sprite.fcg。
?添加文件之后,右键点击->Properties->Build Action然后选择“ShaderProgram”,将生成动作设置成着色器程序之后,生成时将会把Sprite.vcg和Sprite.fcg这两个文件生成一个二进制格式的Sprite.cgx文件。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150126401.jpg
创建纹理和初始化着色器程序
当图像文件和着色器程序添加到项目中后,请将程序按照以下形式进行初始化。
Sample02_01/AppMain.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150126648.jpg
Texture2D
texture = new Texture2D("/Application/resources/Player.png", false);创建了纹理。所谓“创建纹理”,就是在显存中创建图像。
ShaderProgram
在程序中读取着色器程序的时候,指定已生成的Sprite.cgx文件。
shaderProgram = new ShaderProgram("/Application/shaders/sprite.cgx");运行时将编译参数指定的着色器程序。而后即可使用来自shaderProgram的方法进行处理。
创建顶点缓冲
接下来将要设置的是渲染纹理所需要的顶点缓冲。下面将向大家介绍怎样绘制两个三角形,并使他们组成一个四边形。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150126609.jpg
请看下面一段源代码。为了保存四个顶点的“顶点坐标、纹理坐标、顶点颜色、顶点索引”信息,要满足以下条件:
?顶点坐标需要x,y,z三个元素,float数组中要保证有12个位置(用z来指定深度)。
?纹理坐标需要u,v两个元素,float数组中要保证有8个位置。
?顶点颜色需要r,g,b,a四个元素,float数组中要保证有16个位置。
?顶点索引需要确保4个位置(顶点索引用来指定顶点的渲染顺序)。
AppMain.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150126493.jpg
在初始化函数Initialize()中读取图像之后,设置顶点坐标。
AppMain.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150127559.jpg
设置顶点缓冲
接下来要设置顶点缓冲。指定VertexBuffer()函数的第一个参数为顶点个数4。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150128470.jpg
使用vertexBuffer.SetVertices()函数将顶点数据复制到顶点缓冲中。使用graphics.SetVertexBuffer()函数指定渲染时的顶点缓冲。
变换坐标系
接下来,设置用来将像素单位坐标系转换为默认屏幕坐标系的矩阵。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150128110.jpg
ImageRect rectScreen = graphics.Screen.Rectangle;是用来获取屏幕大小的。2D游戏坐标系通常是以左上角为原点的,Y轴正方向指向屏幕下方。显示分辨率是以像素为单位的。与此相对,在默认屏幕坐标系中是以屏幕中心为原点,屏幕右侧是1.0,左侧则为-1.0,上为1.0,下为-1.0。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150129728.jpg
2D游戏坐标系(左图)和屏幕坐标系(右图)
因此,2D游戏坐标系(以下简称为像素坐标系)中指定的多边形想要在屏幕中显示的话,就必须将顶点转换为屏幕坐标系。Matrix4()中设置的值,就是用来执行转换的。
执行渲染多边形
指定各要素之后,即可执行渲染命令。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150129788.jpg
DrawArrays()是用来执行渲染的函数。执行后,屏幕将显示如下画面。
定义简化版的子画面类
http://psv.tgbus.com//UploadFiles_5352/201205/20120521150129288.jpg
推荐大家通过本节中的代码来创建一个可以复用的图片显示类。类定义保存在TutoLib/SimpleSprite.cs文件中。
※SimpleSprite类是专门针对编程指引而制成的简易版,不是最适合处理渲染的类。高速渲染的场合请使用Sce.Pss.HighLevel.GameEngine2D。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之三:用户输入
本节提供一个关于用户输入的说明。
检测用户输入
接下来说明如何通过控制器对已经显示的子画面进行操作。打开Sample/Tutorial/Sample03_01。
Sample/Tutorial/Sample03_01/AppMain.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153337380.jpg
SimpleSprite是前一节定义的用于显示子画面的类。通过GraphicsContext和Texture2D的引用构造子画面。在生成SimpleSprite实例后,给Position赋值来指定它的坐标。
检测控制器输入
GamePad.GetData()是用来检测控制器输入的。在Update()中检测输入。
Sample/Tutorial/Sample03_01/AppMain.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153338799.jpg
GamePad.GetData(0)的参数代表设备号。通常0就可以了。用if语句来检测每个按键的状态。如果按键被按下,修改spritePlayer.Position的值来更新玩家的位置(那张飞机图片)。
键盘映射
对于在PC模拟器上运行,手柄上的按钮被映射到键盘上的按键。
手柄上的按键
PC模拟器上的映射
方向键左箭头←
方向键上箭头↑
方向键右箭头→
方向键下箭头↓
方块按钮字母键A
三角按钮字母键W
圆圈按钮字母键D
叉按钮字母键S
SELECT按钮字母键Z
START按钮字母键X
L按钮字母键Q
R按钮字母键E
更详细的请参考关于PC模拟器。
让我们来生成并运行它。可以通过方向键来控制Player。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153338136.jpg
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之四:面向对象(上)
该文档讲述的是面向对象的技术。
创建游戏框架类
在“程序框架”中,我们已经讲解过通用的PS Suite程序框架。用PS Suite创建程序时,框架几乎是相同的。试着创建一个程序框架作为基类,继承并使其具有价值。打开Sample/Tutorial/Sample04_01,查看TutoLib程序中的GameFramework.cs文件。
Sample/Tutorial/TutoLib/GameFramework.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153338612.jpg
定义GameFramework类,之前代码Main()中的Update()和Render(),目前将在Run()中处理。实例化GameFramework类,调用Run()函数,然后进入循环。
time = (int)stopwatch.ElapsedTicks和
time = (int)stopwatch.ElapsedTicks
这两行是用来计算处理时间的,无论是什么样的程序都需要计算处理时间,所以运用十分广泛,之后会另作说明。
继承GameFramework类,然后实现GameFrameworkSample类。以下是继承的部分。
Sample/Tutorial/Sample04_01/GameFrameworkSample.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153339220.jpg
玩家的操作等,在这个程序中都要通过覆盖(override重写)独立部分来实现。
base.Initialize()、base.Update()、base.Render()在基类GameFramework中调用已定义的处理。
需要注意的是,
?base.Initialize()在已继承的Initialize()函数最前端
?base.Update()在已继承的Update()函数最前端
?base.Render()在已继承的Render()函数最末端
被调用。
如果忘记实现base.Update()和base.Render(),基类中就不会执行,执行结果就有可能不正确,请注意。
生成的GameFrameworkSample类用法如下:
Sample/Tutorial/Sample04_01/AppMain.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153340679.jpg

生成GameFrameworkSample的实例,并调用Run(),和之前一样运行程序。试着运行程序,玩家将和以前一样移动。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153340916.jpg

这次左上角会有一些数字,这是在GameFramework中实现的每帧计算处理时间,接下来将进一步说明。
计算处理时间
在游戏应用中,掌握“什么样的场合中将耗费多久的处理时间”是相当重要的。虽然在命令行应用当中处理时间耗费10-50毫秒没什么问题,但在游戏中如果不能及时切换画面就会产生处理延迟,看上去就会有明显的问题。
执行Sample04_01时,画面左上将显示Update和Render的数字字符串,这是在画面切换时,各种处理所占这16毫秒中的百分之多少。该数字受运行程序所用设备性能的影响,在我的电脑上大概是Update= 0.50%,Render= 25.00%左右。Update几乎没占多少处理时间,那是因为Update()中只有简单的条件判断和加减法运算,处理非常简单。而Render占了25%,处理时间相当长。根据设备的不同,渲染机制也会有所不同,所以Render的处理时间只能作为一个参考值。如果Update+Render的处理时间超过100%,就会来不及切换画面,从而产生处理延迟。计算处理时间的位置是在GameFramework.cs中,让我们来看看这一部分代码。
Sample/Tutorial/TutoLib/GameFramework.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153341746.jpg

Stopwatch类是用来计算经过时间的类,从stopwatch.Start()函数开始计算。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153341787.jpg

stopwatch.ElapsedTicks就是经过时间。如果想要知道每帧开始的时间,就要在循环最前端保存time = (int)stopwatch.ElapsedTicks这个时间。接着在Update()结束的地方,保存time = (int)stopwatch.ElapsedTicks;这个经过时间,然后用time-time得到的差值就是经过时间。接下来也一样,在Render()结束后保存经过时间time = (int)stopwatch.ElapsedTicks;preTime=(int])time.Clone();是把计算所得的时间复制到数组中。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153341226.jpg

然后就是计算各个经过时间,在DebugString中显示。DebugString是在屏幕上显示ASCII字符的类。就像Console.Write()一样,函数将指定一个字符串参数。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153342753.jpg

由于无法显示当前计测中的帧,preTime中保存的是前一帧的计测时间。如果想知道消耗处理时间的详细位置,就要从增加time]数组的大小,以及增加调用time= (int)stopwatch.ElapsedTicks;的次数入手。想要切换调试字体的ON/OFF时,只要按住L键再按R键,而键盘则是按住Q键再按E键即可。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之四:面向对象(下)
该文档讲述的是面向对象的技术。
演员模型
让我们来实现一个游戏所必须的更多角色。
?星星:自己发出的子弹
?敌人:子弹命中时的爆炸
如果分别实现上述特征,那么程序将逐渐变得繁杂起来。如果只有5种还好,但如果种类大量增加,程序的管理就变得难以收拾了。提取游戏中所使用的通用要素的话,会使管理变得更加方便。下面解释如何通过获取通用要素来创建基类,并派生出玩家、敌人、星星和发出的子*弹等内容。
请打开"Sample/Tutorial/Sample04_02"。这里使用了被称为“演员模型”的技术。玩家、星星、**逐个被选为演员,然后程序将对它们实施命令。下面的程序将定义演员基类。
Sample/Tutorial/TutoLib/Actor.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153938452.jpg
关键点是通过virtual将每个函数都实现为一个虚函数。继承类将重写虚函数,重写的方法将被调用。演员可以通过调用AddChild()函数来添加子演员。AddChild()如下图所示。
1、首先创建一个作为根节点(源头)的演员。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153941934.jpg

2、调用root.AddChild(player)来添加一个player。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153941170.jpg

3、调用root.AddChild(starManager)来添加一个用来分别管理星星的starManager。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153941418.jpg

4、这次将starManager作为父节点,然后通过starManager.AddChild(star0)来添加star0,并通过starManager.AddChild(star1)来添加star1。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153946863.jpg

由于演员是呈树状结构的,所以比单纯的线型连接更加方便。当Main()中的Update()调用root.Update()和Render()调用root.Render()时,那么所有属于树结构中的演员将执行处理。
制作Actor类的派生类
框架的引用
由于演员会经常和框架打交道,所以要保存一个框架的引用。在下面的程序里将定义Actor的派生类GameActor。
Sample/Tutorial/Sample04_02/GameActor.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153946799.jpg

追加类成员GameFrameworkSample gs和SimpleSprite sprite,游戏中所使用的角色演员都是通过GameActor类派生出来的。
Player类
在下面的程序中,定义的Player类是从GameActor类中继承而来的。
Sample/Tutorial/Sample04_02/Player.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153947990.jpg

虽然来自控制器的输入和以前一样,不过玩家无法移动出屏幕了。注意别忘记调用base.Update()和base.Render(),如果忘记调用,它们的子节点则不会被处理。
条件编译
#if DEBUG~#endif之间是用来显示玩家坐标的。只有当生成选项是Debug时,这些位置的代码才会有效。当生成选项是Release时,这些位置的代码则不会显示,因此只想在开发期间显示的Debug,这样写会更加方便。
定义Star类
接下来将定义Star类,做法和Player类一样。
Sample/Tutorial/Sample04_02/Star.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153947585.jpg

用Update()给每一帧加算speed来更新坐标,由此来实现星星从上向下移动。当移动到屏幕外时,将星星的Y坐标设置为0.0,这时将随机给定一个X坐标,使其再次从屏幕上方出现。
注册演员
创建已经定义的类的实例,并通过root.AddChild()注册演员树,代码如下。
Sample/Tutorial/Sample04_02/GameFrameworkSample.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153947672.jpg

通过以上代码,演员树将如下图所示。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153947791.jpg

如果调用root.Update()和root.Render(),所有已注册的演员将被处理。
Sample/Tutorial/Sample04_02/GameFrameworkSample.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153948648.jpg

与之前的代码相比更加流畅,书写简洁的代码在大型程序项目中是十分重要的。让我们试着生成并运行程序,屏幕上出现了星星。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521153948513.jpg

运行时会发现:
?Player类中定义的Update()调用时,通过玩家坐标来反映控制器的输入。
?Star类中定义的Update()调用时,会使星星自上而下移动。
这种操作在面向对象中被称为“多态性”。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之五:PSS Studio集成开发环境的基本用法
本节解释了PSS Studio集成开发环境的基本用法
程序调试
设置断点
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154711400.jpg
为了调试程序,首先需要设置断点。为了设置断点,在源代码编辑器中点击你想要设置断点位置的左边的区域。当你点击后,会出现一个红色圆形。设置好断点后,点击Menu->Run->Debug来调试程序(按F5键也可以调试运行程序)。程序运行后,它将在设置了断点的地方停下来。
单步执行
当程序停下来后,可以通过按F10键来让程序每次执行一行(这被称作单步执行)。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154713617.jpg
当代码是调用一个函数的时候,可以通过按F11键使单步执行进入这个被调用的函数。可以通过按Shift+F11键使单步执行跳出当前函数。按F5键可以恢复程序的正常执行。
查看变量的内容
为了查看变量的内容,可以点击Menu->View->Debug Window->Local Variable。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154714365.jpg
通过点击窗口中的列表,可以查看变量的内容。
查看调用历史(调用堆栈)
为了查看调用历史,可以点击Menu->View->Debug Window->Call Stack。
在窗口中将显示函数的调用历史。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之六:输出声音
本节解释了如何播放音效和BGM(背景音乐)。
输出声音
下面用一个实例来展示如何在程序开始时循环播放BGM并且当按钮按下时产生一个音效。
向项目中添加文件
首先,向项目中添加想要播放的音效文件和BGM文件。打开sample/Tutorial/Sample06_01/Sample06_01.sln。
1、在PSS解决方案浏览器中,选择sound文件夹,右击->Add->Add File并选择你想要播放的文件。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154714286.jpg
2、文件添加后,在文件上右击并选择Build Action->Content。当前,只支持WAV格式的音效文件。当前,只支持mp3格式的BGM文件。添加文件的文件夹不需要一定是sound文件夹,它可以是任意位置。
初始化声音
音效
播放音效需要使用Sound类和SoundPlayer类。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154715839.jpg
Sound类代表音效数据。SoundPlayer类用来播放音效。对于一个Sound类中的一种音效可以同时被多个SoundPlayer类播放。
BGM
播放BGM需要使用Bgm类和BgmPlayer类。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154715440.jpg
Bgm类代表BGM数据。BgmPlayer类用来播放BGM。任何时间只能播放一个Bgm类中的数据。因此不能创建多个BgmPlayer类。为了循环播放BGM,需要设置bgmPlayer.Loop为true。
播放声音
为了输出音效,需要调用SoundPlayer类的Play()函数。在下面的例子中,当按叉按钮后会播放一个射击子弹的声音。
Sample/Tutorial/Sample06_01/Player.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154715390.jpg
调用BgmPlayer.Play()函数来播放BGM。
sample/Tutorial/Sample06_01/GameFrameworkSample.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154715801.jpg
射击子弹
通过设置使按下一个按钮时能发射子弹。按照类似星星的方法,为子弹创建一个类。
sample/Tutorial/Sample06_01/Bullet.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154716964.jpg
当一个按钮按下时,使用Player类的Update()函数,来生成一Bullet类的实例,并将其添加到演员树中。
Sample/Tutorial/Sample06_01/Player.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154716849.jpg
程序运行后,BGM将在游戏开始时进行播放。此外,当一个按键按下时,音效将随着子*弹发射而播放。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521154716128.jpg
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之七:释放实例和垃圾回收器
本节说明了如何释放不再需要的实例并作为垃圾回收垃它。
释放不再需要的实例
在前一章节中,我们已经说明了如何实现从自己驾驶的飞机当中发射子弹。不过,如果把这些已经离开屏幕的子弹就那样放置下去的话,接下来发射的子弹消耗的内存会越来越多。所以,为了防止继续消耗内存,那么释放这些不再需要的子弹实例是十分重要的。在C++中,用new开辟的内存可以调用delete来释放。而在C#中,却不像C++中那样拥有明确的释放方法,只有在程序里取消对实例的所有引用,才能被垃圾回收器释放。在C#中,释放实例的方法如下所示。子*弹发射后,演员树将变为以下状态。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155727976.jpg
想要释放已经离开屏幕的bulltet0。这时,应该通过父节点bulletManager中的子节点children来删除bulltet0所引用的位置。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155728606.jpg
删除children中的引用之后,bullet0处于不在被引用的状态中。在这一状态时,只要启动垃圾回收器即可将bullet0的内存回收,而该内存区域则可以再次使用。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155728685.jpg
在演员系统中实现释放实例的机制
那么,让我们在演员系统中来实现释放不再需要的实例吧。首先,准备一个枚举变量来表示演员状态。
sample/Tutorial/TutoLib/Actor.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155729544.jpg
活动中的时候,将ActorStatus Status赋值为ActorStatus.Action。不再需要的时候,将ActorStatus Status赋值为ActorStatus.Dead。
接下来,实现一个方法,将状态为ActorStatus.Dead的演员从List children中删除。
sample/Tutorial/TutoLib/Actor.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155730946.jpg
RemoveAll()是删除列表中的所有元素的方法。在上面的例子中,通过CheckStatus()方法的参数进行条件判断,如果为真,这个元素将被从列表中删除。
接下来,在GameFrameworkSample.cs中的Update()中调用CleanUpDeadActor()。
sample/Tutorial/Sample06_01/GameFrameworkSample.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155730489.jpg
通过这个调用,在每帧中CleanUpDeadActor()将遍历演员树并删除所有被设置了死亡标记的演员。
观察Bullet类。
sample/Tutorial/Sample06_01/Bullet.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155730611.jpg
注意<–here部分,在每帧中坐标都会被更新,并且在演员移出屏幕(当sprite.Position.Y < 0)时给它设置死亡标志。这个设置确保了调用CleanUpDeadActor()时自动删除这些演员。
确认实例是否被释放
在当前状态下,虽然我们可以确认实例是否已经从列表中删除,但并不能确认实例是否被垃圾回收器释放掉。下面是确认实例是否被释放的方法。为类实现析构函数,析构函数会在垃圾回收器释放实例时被调用。为Actor类实现析构函数,通过检查处理,就可以确认实例被释放了。
sample/Tutorial/TutoLib/Actor.cs
像上面那样添加析构函数,当垃圾回收器释放实例时将在输出窗口中显示“~bullet0”。当垃圾回收器执行后,如果没有显示文本,那个实例可能依然在其他地方被引用,检查你的源代码。因为这个过程是用来检查的,在确认后应该将其注释掉。
注意1:在这个例子中,通过重复生成和释放实例来展示了实例的释放。然而考虑到处理时间,保留不再需要的实例并在需要时重新初始化它要比反复生成和释放实例更高效。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
编程向导之八:完成游戏
本节将针对2D射击游戏完成前的内容进行说明。
敌人、敌人子弹、敌人管理
那么,让我们来逐个实现游戏中所必须的角色类吧。可以通过实现星星和自机子弹同样的方法来实现这些类。请打开sample/Tutorial/Sample08_01/Sample08_01.sln。
Enemy类
首先实现敌人类。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155731798.jpg
从出现开始,经过60帧之后,敌人即开始朝自机发射子弹。以direction=direction.Normalize()将方向矢量单位化。当敌人移出屏幕时,就给它设置一个死亡标记。
EnemyBullet类
接着实现敌人**类。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155732287.jpg
用参数的方向矢量乘以速度计算出移动矢量,通过Update()函数累加每一帧的移动矢量。当子弹移出屏幕时,就给它设置一个死亡标记。
EnemyCommander类
下面实现管理敌人出现的类。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155732285.jpg
每隔30帧,从屏幕上方出现一次敌机。接着通过GameFrameworkSample.cs来配置如下演员树。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155732576.jpg
那么运行一下试试看。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155732372.jpg
敌人从屏幕上方出现,并且朝自机发射子弹。因为还没有检测是否命中,所以子弹直接穿过去了。
碰撞检测和爆炸效果
CollisionCheck
下面设置一个碰撞检测,如果命中目标,则会产生一个爆炸效果。请打开sample/Tutorial/Sample08_01/Sample08_02.sln。
sample/Tutorial/Sample08_02/CollisionCheck.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155733197.jpg
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155734478.jpg
为了执行碰撞检测,需要从演员树中开始搜索各演员的Manager类,并以foreach对各个坐标进行碰撞检测。通过Manager类的树状管理,那些不需要进行碰撞检测的演员(例如星星和爆炸效果等)从一开始就被排除在外了,所以会提高运行效率。如果碰撞检测为真,就为该演员设置一个死亡标记,并产生爆炸效果。产生爆炸效果的方法与其它演员类似。
改造Player类
顺便说一句,如果是在自机发生爆炸时和之后的无敌时间中,是无须进行碰撞检测的。为了提高效率,实现一个代表Player状态的变量,并在恰当的时候进行处理。
sample/Tutorial/Sample08_02/Player.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155734504.jpg
接着就要在碰撞检测时查看playerStatus,并进行处理。
管理游戏进行的类
GameManager
接着,让我们来制作简单的开场画面、GameOver画面以及显示得分吧。下面我们来制作一个管理游戏进行的类。
sample/Tutorial/Sample08_02/GameManager.cs
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155734462.jpg
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155735618.jpg
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155737418.jpg
GameManager类会以以下流程来进行游戏。
?在开场画面中,按键来开始游戏。
?游戏中,剩余机体为0时即为GameOver。
?在GameOver画面中经过一段时间之后,或者按键之后,就会再度回到开场画面中。
演员树的最终形态如下所示。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155737128.jpg
完成游戏
游戏总算完成了,按F5执行以下看看吧。虽然只是个简单的游戏,但游戏进行的所有必要结构都一应俱全,之后也可以根据自己的喜好来进行各种修改。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521155737889.jpg
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
关于PC模拟器
本节将说明PC模拟器中开发时的要点。
输入设备
由于PC模拟器不支持Controller Settings(控制器设置),所以要用键盘来实现GamePad的功能。使用GamePad类时,通过按下已分配映射的按键,可获得GamePadButtons的输入信息。此外,由于键盘设备的局限性,所以暂不支持摇杆。
按键映射列表
手柄上的按键
PC模拟器上的映射
方向键左箭头←
方向键上箭头↑
方向键右箭头→
方向键下箭头↓
方块按钮字母键A
三角按钮字母键W
圆圈按钮字母键D
叉按钮字母键S
SELECT按钮字母键Z
START按钮字母键X
L按钮字母键Q
R按钮字母键E
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
关于应用配置文件
本节中将说明关于应用配置文件的内容。
应用配置文件
将应用配置文件和解决方案文件放在同一目录下,在应用程序运行时就会自动读取,并反映出文件内部所记录的内容。可在应用配置文件中配置内存大小以及输入设备等。
配置例子
http://psv.tgbus.com//UploadFiles_5352/201205/20120521160220205.jpg
内存大小配置
项目名概要配置值
managed_heap_size应用内可动态开辟的内存大小单位是Kbyte,默认值是32768(32MB)
resource_heap_size声音数据、图片数据以及纹理等可开辟的内存大小单位是Kbyte,默认值是65536(64MB)
输入设备配置
项目名概要配置值
gamepad游戏手柄设备使用:true,不使用:false。默认值为true。
touch触摸设备使用:true,不使用:false。默认值为true。
motion体感设备使用:true,不使用:false。默认值为true。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
屏幕控制器
On Screen Controller概要
On Screen Controller(以下简称为OSC)是利用触摸屏幕来代替游戏手柄(物理控制器)进行操作的设备。在游戏屏幕的某个部位显示出游戏手柄风格的十字键?按钮等,玩家可通过触摸这些位置进行操作。游戏开发者可选择究竟是否要使用OSC功能。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161423833.jpg
使用OSC
在app.cfg文件中,将gamepad设置为true即可使用,但必须满足以下“兼容环境”。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161424971.jpg
兼容环境
OSC可在Android中使用,但无法在Windows模拟器以及PlayStation®Vita中使用。
多平台兼容政策
OSC支持PS Suite兼容的多种屏幕分辨率?尺寸、以及拥有多屏幕的设备。不仅仅只是将整体缩放为相似形状,而是对应设备特性,考虑玩家方便使用的按键尺寸、设置、内部逻辑等来调整全体布局。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161426903.jpg
玩家定制
玩家定制功能是根据使用OSC的游戏玩家个性,来移动或改变各种分类尺寸的功能。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161426359.jpg
OSC规定有7种分类。
?左扳机
?右扳机
?左类比摇杆
?右类比摇杆
?DPad Key(上下左右键)
?Face Button(△○×□键)
?Select/Start键(包括Pull)
打开玩家定制屏幕
按下实际设备的Menu键后,选择控制器设置→屏幕控制器设置,并且通过点击画着扳手的键来打开玩家定制屏幕。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161428827.jpg
可定制的项目
可进行分类的移动和改变尺寸。
?移动分类的方法:通过点住拖拽屏幕中显示的黄色光标框,即可将其移动到任何位置。
?改变分类尺寸的方法:通过点住拖拽屏幕中显示的分类上下左右按钮,即可改变分类大小。尺寸改变范围为初始大小的一半至两倍。不过不能与其它分类重叠。
玩家定制无法做到的事情:
?不能隐藏按键和分类。
?玩家无法对单个按键进行定制。
开发者定制
由于屏幕中要显示OSC,所以经常会覆盖游戏屏幕,使游戏看起来不方便。为了改善这一状况,开发者也可以对OSC进行定制。该功能被称为OSC的开发者定制。
?消除按钮。
?调整按钮的初始位置:玩家可再次进行调整。
由此可以隐藏游戏中不需要显示的按钮,也可以避开游戏屏幕中重要的对象来配置按键位置。本功能是可选择的,如果不使用本功能,整套OSC将显示在标准位置上。
关于OSC定制工具
与之前描述的一样,开发者可通过开发者定制来改变按钮的位置。而且为了支持更广泛的设备,OSC可在内部调整按钮布局。考虑到后者来对前者进行调整,想要迎合多样的设备通常是十分困难的,所以才提供了支持这一系列操作的工具。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161428939.jpg
本工具就是在Windows上运行的GUI(图形界面)工具。开发者定制可改变的项目在GUI中可进行鼠标和数值输入的操作。此外,可通过设备模拟器来确认这些改变在众多设备上是否可以正确显示。
关于osc.cfg
osc.cfg是工具的输出文件,它记录着在工具上生成的布局信息。另一方面,osc.cfg是以YAML这种文本格式来记录的,可用文本编辑器打开,检查内容,也可以直接进行编辑。
关于布局逻辑和参数
osc.cfg在工具中是以可确定参数的表格一览形式记录的,在工具以及目标设备中,这些参数使用共享的逻辑来确定最终布局。关于这个布局逻辑,我们将做简单的说明。布局逻辑可用来调整细节,并使其更新为较新逻辑。在此,我们将不受更新的影响,来说明一下普遍的基础规则。改变配置是以在空间约束较少的大屏幕设备(9英寸)为基础而进行的,在这一屏幕中调整按键及按键分类(包含1到多个按键)的尺寸。这时,尺寸将作为实际尺寸(单位为英寸)来进行管理。此外,关于分类的位置(纵位置),为了使其与游戏画面更加具有亲和性,要指定画面内的比例(百分比)。在小型的设备中,为了确保操作性,屏幕内OSC所占比例相对来说较大。从上述步骤制作的基本布局出发,当设备较小时,要缩小分类之间的空隙并合理摆放,最终将整体缩小,使其适应小屏幕。以上细节规则,请在之后的布局逻辑详情当中查看。那么接下来让我们边实际操作工具,边试着使用OSC的开发者定制功能。
OSC定制工具
概要:使用OSC定制工具,可针对OSC按键进行移动和改变尺寸等操作。将使用工具输出的osc.cfg文件添加到PSS应用中,就可以使用定制后的OSC了。
教程
1、启动OSC定制工具
运行toolsOscCustomizeToolOscCustomizeTool.exe来启动OSC定制工具。
2、删除不用的按键
在Main Window中的Use标签页中,将复选框中的对号取消,就可以将不用的按键隐藏了。在这里,我们试着取消「R Analog」和「DPad Key」的对号。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161428605.jpg
3、调整布局的过程
利用View Window和Main Window等,来编辑OSC的配置情报。
3-1、拖拽
当View Window处于Edit Mode时,可用鼠标来改变View Window中显示的按键位置和尺寸。让我们来编辑View Window中显示的Face Button。首先,将△键移动到○键上方,接着将□键移动到×键左方。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161429605.jpg
如果想重置上述编辑过程,只要在各分类或按键上右击,并在弹出菜单中选择Reset。
3-2,、输入数值
可通过编辑Main Window中的Single Screen / Dual Screen标签页中的各种参数来修改View Window中显示的OSC坐标。
Single Screen标签页中的Category标签内可编辑「L Analog」的位置。在这里,我们将它与「Face Button」的Y坐标或宽和高等对齐。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161429535.jpg
表中的X, Y, Width, Height分别代表分类的水平位置、垂直位置、宽和高。Y的单位是百分比,而其它单位都是英寸。
4、改变窗口尺寸确认设备
首先从Edit Mode中切换为View Mode,点击View Window左上的来执行切换。操作Slider Window以及用鼠标改变View Window的尺寸,即可在任意屏幕尺寸中确认OSC的配置了。
操作Slider Window的Slider部分,将其移动到4英寸的位置。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161429587.jpg
View Window的Window尺寸发生变化,可确认为4英寸设备上的OSC配置。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161430388.jpg
同时拖动View Window的边缘改变尺寸,在预想屏幕尺寸范围内,确认配置不会出现问题。
5、切换到双屏并调整
通过选择Main Window中显示的Dual Screen标签页,使View Window的显示切换至相应的屏幕。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161430984.jpg
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161431864.jpg
双屏和单屏生成布局的方式一样。各分类和按钮都可以进行编辑,不过由于双屏设备较少,如果不熟悉双屏设备的话,也可以使用标准配置。
6、文件输出
从Main Window的Menu中,选择「File (F)」→「Save (S)」,输出的数据文件(osc.cfg)将被保存到使用OSC的应用目录下。
7、配置应用目录
在PlayStation®Suite Studio打开的项目中添加osc.cfg,在弹出菜单中选择“Build Action”→“Content”,在生成应用时将传输到设备当中,文件名必须是osc.cfg。
逻辑版本
OSC定制工具可以从指定的各种参数中计算OSC的显示位置,根据逻辑版本的不同,计算结果也会有所不同。当没必要使用旧版本的时候,推荐使用最新版本。
工具功能参考、菜单项目解说
OSC定制工具由以下窗口组成。
Main Window
与OSC相关的各种参数赋值以及选择复选框的窗口。
菜单:
File:可读写osc.cfg文件。
New:可初始化OSC定制工具的设置值。
Load:可读取OSC的定制数据文件。
Save:将当前编辑中的定制数据保存在文件中。
Exit:关闭工具。
Background:可对View Window中显示的背景图像进行设置。例如显示游戏画面的截屏或查看与OSC之间的平衡。
Load:读取图像文件,并将其作为View Window的背景显示。读取的图像在单屏中将作为屏幕整体背景,而在双屏中则只作为上半部分的背景。
Clear:清除由Background菜单中Load读取的图像。
标签:
Use:指定作为OSC来使用的分类及按键显示状态。
Category:指定各分类的显示状态。
DPad Key, Face Button, Select/Start:指定分类属下按键的显示属性。不过,如果父代分类是隐藏的,那么父代属下的全部按键都会被隐藏。
Single Screen / Dual Screen:指定各分类及按键的坐标。
Category:将各分类的显示坐标指定为英寸。矩形的中心为原点。只有Y坐标被指定为View Window客户区屏幕上端开始的百分比形式。双屏时指定为View Window的客户区屏幕中央(橙线)起的百分比形式。
DPad Key, Face Button, Select/Start:以成为父代的分类为中心,指定将被显示的按键坐标为相对坐标(英寸)。
其它项目
Logic Version:指定使用OSC配置的逻辑版本。
System Bar:在View Window中显示System Bar的辅助功能。实际系统栏的尺寸会随着设备DPI而变化。本功能仅供参考。
View Window
使用Main Window中指定的参数,来显示OSC的窗口。有用鼠标拖拽编辑的Edit Mode和用来预览的View Mode这两种类型。
Edit Mode
可通过鼠标来改变OSC各分类及按键的位置,窗口的客户区大小是固定的。移动按键及分类的方法:各分类及按键都可移动到任意位置,但无法移动也无法扩大到设置范围之外。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161431536.jpg
View Mode
使用Main Window、View Window的Edit Mode改变的参数来显示OSC。窗口的客户区大小可以随意改变。
Slider Window
可改变View Window的显示尺寸。上方配置的单选按钮表示View Window的比例,移动下方配置的滑块可改变View Window的尺寸。
其它特性
布局逻辑详解:为了更深入地理解使用工具进行OSC定制,这里介绍一下布局逻辑中的一部分调整功能。
分类自动链接
设计时并排配置的分类(高度Y相同)在大型或小型设备上经过布局逻辑被调整为同样高度。如果没有链接功能的话,就会出现以下种种问题。使用L类比摇杆而没有使用R类比摇杆的时候,在小设备上右列配置的Face Button会比D-Pad Key高得多,就会成为图中这样毫无平衡的布局。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161432611.jpg
如果在工具中将自动链接设置为有效的情况下,分类将会以蓝线链在一起。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161432368.jpg
填充:纵向有两个分类并行时,小设备上的分类之间将会被加入适当填充,而将它们分开。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161433302.jpg
Main Window的按键坐标和View Window的可移动范围
在View Window上,当使用鼠标移动各分类及按钮时,是无法移动到工具限制范围外的。
L Trigger, L Analog, DPad Key:以屏幕左侧配置的分类为前提,就无法移动到屏幕右侧。分类的X坐标是从屏幕左端开始的相对坐标(x>=0.0)。在工具上拖拽时,在屏幕中间左右的位置会显示一条红线,这说明无法移动到红线右侧进行配置。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161433753.jpg
R Trigger, R Analog, Face Button:以屏幕右侧配置的分类为前提,就无法移动到屏幕左侧。分类的X坐标是从屏幕右端开始的相对坐标(x<=0.0)。在工具上拖拽时,在屏幕中间左右的位置会显示一条红线,这说明无法移动到红线左侧进行配置。
http://psv.tgbus.com//UploadFiles_5352/201205/20120521161433439.jpg
Select/Start:Select/Start只能配置在其它分类坐标的下面。将屏幕的左、右、中间来解释。左侧开始配置的情况就是从屏幕左端开始的相对坐标(x>0.0)。右侧开始配置的情况就是从屏幕右端开始的相对坐标(x<0.0),而从中间(x=0.0)开始配置的情况被解释为中央配置。
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
GameEngine2D
关于GameEngine2D
GameEngine2D包含以下内容:
Sce.Pss.HighLevel.GameEngine2D提供了创建简单2D游戏所需的一些函数。
这个库被分割在两个命名空间下:
Sce.Pss.HighLevel.GameEngine2D.Base包含各种各样的2D核心功能,比如数学库的扩展、渲染功能(子画面渲染和立即模式)、输入帮手、摄像机、字体映射、一个矩阵栈等。Sce.Pss.HighLevel.GameEngine2D包含基于Sce.Pss.HighLevel.GameEngine2D.Base构建的“游戏引擎”(场景图、调度器、行为等)。GameEngine2D库中一些更高级的方面松散的基于Cocos2D(http://www.cocos2d-iphone.org/),特别是它采用了类似的核心对象,像Director、Scheduler、ActionManager。
这个库提供了源代码。
GameEngine2D不包含以下内容:
GameEngine2D没有提供任何碰撞检测功能,也许除了Sce.Pss.HighLevel.GameEngine2D.Base.Math中一些简单的通用例程。GameEngine2D没有提供任何物理功能、声音、网络等。它没有任何明确的UI系统,虽然在它之上可以简单的实现一些UI元素,例如使用它的简单文本和子画面渲染功能(在一些例子中会看到)。
基本用法
例子HelloSprite阐明了基本用法。
初始化
第一步是初始化Director,Director是一个单例,通过Director.Instance可以使你访问所有GameEngine2D全局对象。它必须通过Director.Initialize()来初始化:
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161935798.jpg
创建一个空的场景
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161935411.jpg
在初始化之后,我们需要创建一个场景图。我们可以创建的最简单的场景只是由一个Scene对象作为根节点组成的。
循环
由于我们准备好运行了,所以我们可以这样创建主循环:
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161936329.jpg
高级的循环
作为一种选择,我们也可以手动处理循环。在那种情况下你要负责按适当的顺序调用Director.Instance的Update(),Render()和PostSwap()。
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161936356.jpg
关于场景图
一般结构
GameEngine2D的场景图以层级关系保存游戏世界的节点,并在渲染时遍历。它不被用来做其他任何事。例如调用Update()时不会遍历(这个在Scheduler中处理)。每个场景图的根节点都是一个Scene节点。Scene导航通过一个场景栈经由Director.Instance单例来处理(类似Cocos2D)。此外,在GameEngine2D中,Director也保存了大部分GameEngine2D库的其他全局对象。Node对象含有一列子节点(通过Children属性来访问),并且之多含有一个父节点(通过Parent属性来访问)。使用AddChild()、RemoveChild()和RemoveAllChildren()来修改Parent和Children。
节点更新
每个节点都和“actions”相关联。行为通过ActionManager.Instance进行管理,但是主要通过Node的成员函数来操作。每个节点可以有一些调度函数,例如像它们关联的主Update函数。调度函数通过Scheduler.Instance进行管理,但是主要通过Node的成员函数来操作。ActionManager和Scheduler和Coscos2D里的类似。
节点位置属性
Node对象有一个包含Position/Rotation/Scale/Skew组件组成的2D变换,Pivot被用来作为变换中 Rotation/Scale/Skew的中心点。这里“局部”变换(相对于Parent节点来说的)可以通过调用GetTransform()来得到。在代码方面,节点变换矩阵等价于:
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161936905.jpg
设置上面的任何属性都会使节点和它的子树移动,或旋转,或缩放,或倾斜。
节点对象层次结构
这是场景图节点的类型层次。灰色的节点是中间类型,你从不会直接实例化它们。
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161936568.jpg
如何使子画面移动
SpriteUV和SpriteTile可以让你从Node中操作个别的子画面对象。除了节点的变换属性(子画面节点的功能),SpriteUV和SpriteTile还有Quad属性来确定它们的几何形状。Quad属性是一个TRS对象(变换(T),旋转®,缩放(S)),它可以被看作是子画面的第二个局部变换(变换单位四元组使其成为一个有方向,缩放的子画面矩形)。但是为了清楚起见,我们将它定义为四元组的 “几何形状”。
使用Scheduler来移动节点
大部分时间你将在调度函数中移动Node对象。一个简单快速的方法是使用Node.Schedule,在Scheduler中给节点注册一个lambda函数,每帧调用这个注册的函数:
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161937420.jpg
另一个方法是每帧调用Sprite类中的节点函数,覆盖Update()函数,并通过Node.ScheduleUpdate()来调用它。
使用Action来移动节点
节点属性的行为可以用来移动节点。下面的代码将演示在0.1秒内将子画面移动到(10,5)的位置。
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161938362.jpg
通过设置那些特别行为的Tween属性,你可以改变插值曲线。
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161938508.jpg
一些其他的行为会影响位置属性,一些类似于Cocos2D(MoveTo,MoveBy,ScaleTo,ScaleBy等)和一些更通用的,比如 ActionTweenGenericVector2,ActionTweenGenericVector4,ActionTweenGenericVector2Scale,ActionTweenGenericVector2Rotation。
关于子画面几何形状:TRS
子画面的Quad属性(一个TRS对象)允许你通过设定大小、位置和方向在节点的局部空间内(记住子画面的基本变换属性依然有效)指定子画面的几何形状。T属性(T代表变换)是指以矩形左下角点的坐标。S属性(S代表缩放)是指矩形的大小。R属性(R代表旋转)代表了矩形的方向(你能看到它是矩形的局部X轴)。注意一个TRS的旋转代表一个单位向量,而不是代表角度这个标量-虽然也有接口以角度来设置和获取R属性。TRS不会将R属性标准化,所以你需要保证其标准化。通过设置RotationNormalize来替代R属性将会使R属性标准化。R被设定为(1,0),即X轴不旋转。
这里有一些演示T,R,S值的意义的例子。在那些图片上,世界的X和Y轴用黑粗线表示。在上下文子画面内,你也可以看到那些线作为节点局部坐标系(也就是通过GetTransform()获得的空间)。最简单的TRS可能是单位四元组(或单位变换),被称作TRS.Quad0_1:
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161938568.jpg
另一个例子,这次带有一个旋转:
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161939369.jpg
子画面和场景图变换
唯一的变换信息是通过遍历图调用Node.GetTransform()来获得的。子画面对象的Quad属性不会影响子节点的位置:它只会影响子画面自己的几何形状(矩形)。
在SpriteUV、SpriteTile、SpriteList和RawSpriteTile中选择
使用哪种子画面类型
SpriteUV产生一个子画面节点,你可以手动设置顶点的UV。SpriteTile很可能更有用,因为2D游戏通常按规整的网格打包子画面图像数据,例如做一些子画面帧动画。
性能
但是SpriteUV和SpriteTile绘制它们的子画面都很“独立”,这意味着它们有较高的设置开销和昂贵的对象。
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161939178.jpg
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161939325.jpg
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161939782.jpg
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161940643.jpg
http://bbs.tgbus.com/forum-753-1.html
论坛PSS专区
Core概要
Sce.Pss.Core提供了数学函数等游戏系统基本功能。
数学函数
FMath是一个提供了数学函数的包装函数和便利函数的静态类。定义了float用的数学函数以及一些便利的函数。
向量类型
Matrix4、Vector4、Vector3、Vector2和Quaternion是表示float元素的向量类型结构。定义了4D矩阵、4D以及以下的向量以及四元数。
包装类型
Half、Rgba、Rgba4444、Rgba5551和Rgba565是表示图形中使用的数据结构。定义了半精度浮点型以及整数表示的颜色类型。
单位和坐标系
角度是以弧度为单位来表示的。矩阵是以右手坐标系来表示的。此外,矩阵乘法的顺序是parentchild和matrixvector。请注意Cg着色器语言中的矩阵乘法顺序是相反的。例如,在Cg着色器语言的WorldViewProjection语义中,根据Sce.Pss.Core,是按照 projectionviewworld来计算的。
使用举例
以下代码是生成矩阵和计算矩阵以及访问元素的例子。
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161940456.jpg
使用举例2
如果想要的话,可用静态函数来代替成员函数。为了提高性能,也可以使用引用参数的重载函数。
http://psv.tgbus.com//UploadFiles_5352/201205/20120529161940762.jpg
关于参数限制
当使用需要传递引用参数的函数时,将this参数或ref参数作为变量指定给out参数将计算不出正确的结果。
Graphics概要
Sce.Pss.Core.Graphics提供了图形渲染功能。其功能模型是继续OpenGL ES 2.0的。
图形上下文
GraphicsContext控制全部图形渲染,这个类代表OpenGL的图像上下文。这个类的构造函数用来初始化图形设备和屏幕,成员函数用来执行图形渲染。GraphicsContext根据系统的标准设置初始化图形设备和屏幕。如果有必要,屏幕尺寸和像素格式可以通过参数来指定。在初始化后,可以获得图形设备的规格和实际屏幕尺寸,以及像素格式。为了执行图形渲染,需要提前创建一个图形对象(稍后描述),设置图形对象和渲染状态,并使用GraphicsContext的成员函数来渲染图元。
着色器程序
ShaderProgram控制着色器功能,这个类代表OpenGL的程序对象。它包含顶点着色器和片段着色器,这个类通过保存这些着色器程序的文件来创建。ShaderProgram拥有多个统一的变量和属性变量。可以设置统一的变量值,并将顶点数据连续地转移到属性变量。通过分配给它们的数字来访问这些变量。如果有必要,可以用指定的数字关联这些变量,这对应用很有用。着色器文件的扩展名是.cgx,它是通过写好的Cg语言源代码转换的二进制文件。使用.vcg和.fcg或.vp.cg和.fp.cg作为源代码的扩展名。当源代码的扩展名是.vcg和fcg时,相同名字的顶点着色器和片段着色器会保存到一个文件中。
顶点缓冲
VertexBuffer保存了顶点数据,这个类代表OpenGL的顶点缓冲对象。必要时,这个类可以保存多个顶点数组和一个索引数组,它可以通过指定大小和格式来创建。可以将多个VertexBuffer指定到GraphicsContext。每个顶点数组按顺序被连接到ShaderProgram的属性变量。当多个索引数组启用时,将使用最后一个。
纹理
纹理保存了像素数据,这个类代表OpenGL的一个纹理对象。它有衍生类(Texture2D、TextureCube等),可以从一个图像文件或指定它大小和格式来创建一个Texture。可以将多个Texture指定到GraphicsContext。每个Texture按顺序被连接到ShaderProgram的采样器。可用的图像格式是PNG、JPG、BMP和GIF(但是,不支持动画GIF)。
帧缓冲
FrameBuffer控制着渲染结果的存储地址,这个类代表OpenGL的一个帧缓冲对象。将渲染结果的存储地址从屏幕改到另一个缓冲,这将启用离屏渲染。使用FrameBuffer可以设置颜色和深度的存储地址。作为颜色的存储地址可以设置为ColorBuffer,作为深度的存储地址可以设置为DepthBuffer。如果在创建时指定了Renderable选项,作为颜色的存储地址可以设置为Texture。根据颜色的存储地址和深度的存储地址,可能不会进行渲染。在当前的组合下是否进行渲染可以通过参考FrameBuffer.Status属性来检查。
颜色缓冲和深度缓冲
ColorBuffer和DepthBuffer保存了渲染结果,这些类代表OpenGL的渲染缓冲对象。ColorBuffer保存颜色值,DepthBuffer保存深度值以及模板值,这些类可以通过指定大小和格式来创建。不能将ColorBuffer和DepthBuffer设置给GraphicsContext。这些应设置给FrameBuffer。
关于功能限制
为了设备之间的兼容性起见,以下功能无法使用。
?纹理的重复模式不是2的乘方
?压缩的纹理
?顶点纹理
?深度纹理
?3D纹理
?半浮点纹理渲染
?亮度阿尔法纹理渲染
此外,设备的性能只限于以下值。
?MaxTextureSize 2048
?MaxCubeMapTextureSize 2048
?MaxRenderbufferSize 2048
?MaxVertexUniformVectors 128
?MaxFragmentUniformVectors 64
?MaxVertexAttribs 8
?MaxVaryingVectors 8
?MaxTextureImageUnits 8
?MaxAliasedLineWidth 8
?MaxAliasedPointSize 128
着色器描述
着色器描述与标准Cg语言相比有以下限制。
?不能使用与GLSL和Cg保留字相同的名字作为变量和函数名。
?注意一些保留字是不区分大小写的(Texture、Matrix、Vector等)。
?顶点着色器输出和片段着色器输入的语义必须指定。
?顶点着色器输出和片段着色器输入的名字和语义必须匹配。
?片段着色器输出必须制定COLOR语义。
?着色器不能使用重叠的TEXUNIT语义。
?在一些语义中,变量的类型是受限的(NORMAL、PSIZE、FOG等)。
?循环迭代次数的最大值必须是一个常数。
?为了控制循环迭代次数,可以通过一条break语句来中止循环。
?不能使用attribute、varying和sampler变量数组。
?不能使用uniform int数组访问uniform float2/3/4 xyzw。
?不能使用uniform int数组访问uniform float4x4 columns。
?不能对标量变量进行swizzle(f.xxxx等)。
?如果没有PSIZE,varying变量可以使用8 packed vectors(不包含POSITION)。
?如果有PSIZE,varying变量可以使用8 vectors(不包含POSITION和PSIZE)。
顶点着色器的输入可以用以下语义来指定
?POSITION
?NORMAL
?TEXCOORD0-7
?COLOR0-1
?DIFFUSE
?SPECULAR
?TANGENT
?BINORMAL
?BLENDWEIGHT
?BLENDINDICES
?FOGCOORD
?POINTSIZE
顶点着色器的输出可以用以下语义来指定
?POSITION(HPOS)
?TEXCOORD0-7(TEX0-7)
?COLOR0-1(COL0-1)
?FOGC(FOG)
?PSIZE(PSIZ)
片段着色器的输入可以用以下语义来指定
?TEXCOORD0-7(TEX0-7)
?COLOR0-1(COL0-1)
?FOGC(FOG)
?POINTCOORD
?WPOS
?FACE
片段着色器的输出可以用以下语义来指定
?COLOR
Audio概要
Sce.Pss.Core.Audio提供了播放音效和BGM的功能。
音效
Sound类代表音效数据。SoundPlayer类用来播放音效。对于一个Sound类中的一种音效可以同时被多个SoundPlayer类播放。Sound通过wav文件创建。通过调用Sound.CreatePlayer()创建SoundPlayer与Sound对象之间的连接。调用SoundPlayer.Play()将播放音效。
BGM
Bgm类代表BGM数据。BgmPlayer类用来播放BGM。任何时间只能播放一个Bgm类中的数据。因此不能创建多个BgmPlayer类。Bgm通过mp3文件创建。通过调用Bgm.CreatePlayer()创建BgmPlayer与Bgm对象之间的连接。调用BgmPlayer.Play()将播放音乐。
Input概要
Sce.Pss.Core.Input提供了从输入设备获得信息的功能。
手柄
GamePad.GetData()返回GamePadData结构,它保存了手柄状态。定期调用GamePad.GetData()并根据手柄的状态来控制应用。
触摸屏
Touch.GetData()返回一个TouchData结构的数组,它保存了手指触摸触摸屏的状态。当多个手指触摸触摸屏时,将返回保存多个TouchData结构的数组。定期调用Touch.GetData()并根据触摸屏的状态来控制应用。
运动传感器
Motion.GetData()返回MotionData结构,它保存了运动传感器检测到的加速度和角速度的值。定期调用Motion.GetData()并根据运动传感器的状态来控制应用。
Imaging概要
Sce.Pss.Core.Imaging提供了有关图像处理的功能。你可以加载图像文件和在图像中渲染字符。
图像
Image类代表图像。Image可以通过PNG、JPG、BMP或者GIF图像文件(但是,不支持动画GIF)创建,同样也可以通过指定的颜色和大小创建一个单色图像。为转换图像提供了如Image.Resize()和Image.Crop()这样的方法。为在图像中粘贴文本或其他图像提供了如Image.DrawText()和Image.DrawImage()这样的方法。为了从Image创建纹理,需要使用Image.ToBuffer()来获得图像的内存镜像,并将它传递给Texture2D.SetPixels()。
字体和渲染字符
可以通过调用Image.DrawText()在图像内绘制字符。你可以通过传递给Image.DrawText()的Font对象来指定渲染字符时用的字体。可以通过指定它的名字、大小、风格来创建一个Font。此外,可以通过传递FontAlias来创建一个系统标准字体。Font.GetTextWidth()是用来获得渲染字符图像所需宽度的方法。这个方法根据字符串的长度来确定图像的宽度。此外,Font.GetTextMetrics()是用来获得每个字符度量信息的方法。对于简单的目的这个方法不是必需的,它是用来获得每个字符的宽,高等的。
Environment概要
Sce.Pss.Core.Environment提供了保存数据,获得应用的运行时环境和调用其他应用的功能。
SystemEvents类
SystemEvents类接收来自系统的事件。它可以在一个应用从最小化状态恢复时响应事件。应用必须在每帧显式调用SystemEvents.CheckEvents()。通过调用CheckEvents()来检查来自系统的事件,并更新其内部的状态。通过注册如SystemEvents.OnRestored的事件处理程序,将会在应用状态改变时收到通知。
SystemParameters类
SystemParameters用来获得系统设置。例如,可以从SystemParameters.Language和SystemParameters.GamePadButtonMeaning来获得语言设置和○×按键的含义。
Storage类
Storage类是利用文件来保存和加载应用数据的类。使用Storage类,在每个平台应用会自动地使用适当的位置来保存数据。
PersistentMemory类
PersistentMemory类提供了永久的内存来自动保存/恢复应用状态。当应用中止时,PersistentMemory类自动将数据保存在提供的64KB非易失性内存区域,当程序重新启动时,它自动读取这段内存。由于可以被保存的内存大小被限制为64KB,所以根据其目的,它必须它必须从Stroage类中分离出来。
Shell类
Shell类调用一个shell功能(例如,启动其他应用)。通过Shell.Action.BrowserAction()等来创建一个代表指定调用内容的Action结构,并将这个Action结构传给Shell.Execute()来调用shell功能。
通用对话框
通用对话框是用于显示应用通常使用的对话框的功能。ICommonDialog接口是一个代表通用对话框的通用接口。ICommonDialog定义了通用对话框的通用接口,例如,Open()方法和State属性。TextInputDialog是一个用来显示文本输入对话框的通用对话框类。使用TextInputDialog可以显示一个用来输入字符的模态对话框。
剪贴板
通过Clipboard类,你可以从运行时环境的剪贴板中得到文本或将文本保存到剪贴板。
UI概要
Sce.Pss.HighLevel.UI提供了UI Toolkit,它实现了UI机制。在UI Toolkit上操作UI部件和动画也包含在内。可以通过加载Sce.Pss.HighLevel.UI.dll来使用它。可以很容易地显示按钮和对话框,也可以通过附加的布局工具很简单的放置UI部件。有关详情,请参考UI Toolkit Programming Guide和Sce.Pss.HighLevel.ui的API参考。
UISystem类
UISystem类是一个使用UI Toolkit提供的功能的静态类。
Model概要
Sce.Pss.HighLevel.Model提供了基本模型显示功能。
模型
BasicModel是一个代表基本模型数据的类,它通过加载一个保存模型数据的文件来创建。BasicModel有设置世界矩阵、设置当前运动、动画计算、矩阵计算、图形渲染等API,并通过调用这些可以显示模型。模型文件的扩展名是.mdx,它是通过如COLLADA的一般模型数据转换的二进制文件。模型文件保存了如层次结构、形状数据、材质、纹理和动画的信息。
程序
BasicProgram是一个代表基本着色器程序的类,它可以应用如光照、雾和皮肤的基本效果。BasicProgram包含如矩阵、材质、灯光、雾、渲染模式等参数,可以通过设置这些参数来实现着色器功能。根据设置参数可以自动加载着色器文件。所以,BasicProgram需要的所有着色器文件必须复制到应用目录。
参数
BasicParameters是一个管理BasicProgram参数的类。上面提到的参数都保存在这个类中。一个BasicProgram有一个BasicParameters,但是多个BasicProgram可以共享一个BasicParameters。这对于例如摄像机和灯光的全局参数设置很有用。
程序容器
BasicProgramContainer是一个管理已经加载的程序的类,它可以使用字符串作为键将程序添加到字典中。加载一个模型后,这个类用于连接程序和模型。通过这个,根据字符串键适当的程序可以应用于模型上,或者已经加载的程序可以共享给多个模型。
纹理容器
BasicTextureContainer是一个管理已经加载的纹理的类,它可以使用字符串作为键将纹理添加到字典中。加载一个模型后,这个类用于连接纹理和模型。通过这个,根据字符串键适当的纹理可以应用与模型上,或者已经加载的纹理可以共享给多个模型。
GameEngine2D概要
Sce.Pss.HighLevel.GameEngine2D提供了一个2D游戏引擎。它有创建2D游戏所需的功能(例如子画面、粒子和瓦片)。一些类如Director、Action和TransitionScene配备了类似Cocos2d(http://www.cocos2d-iphone.org/)的接口。
基础库
Sce.Pss.HighLevel.GameEngine2D.Base命名空间提供了2D游戏引擎基础类,如数学相关的类和图形系统类。
Director类
Director是一个控制着整个游戏引擎的类。它有管理Scene类的功能和主循环有关的功能。
Action类
Action周期性地执行各种功能(如对象移动/旋转、放大/缩小、变色)。
Node类
Node是一个代表场景图节点的基类。从Node类继承的类有Scene、SpriteUV和ParticleSystem等类。
Scene类
Scene是一个代表场景图根节点的基类。
SpriteUV类
SpriteUV是一个代表单个子画面的简单类。你可以指定子画面的纹理显示范围。
SpriteList类
SpriteList是一个用于在一条渲染指令中显示多个子画面的类。以渲染的性能为目的,它会适当的将尽可能多的精灵一起渲染。
SpriteTile类
SpriteTile是一个用于以瓦片形状排列渲染的类。
Label类
Label是一个用于绘制字符串的类。
ParticleSystem类
ParitcleSystem是一个用于通过渲染一组小粒子来创建视觉效果(如火焰、烟雾和雨)的类。为了控制粒子移动,引入了各种各样的参数。
TransitionScene类
TransitionScene提供了场景转换时的一些视觉效果。
Physics2D概要
Sce.Pss.HighLevel.Physics2D提供了基本的2D物理模拟功能。
PhysicsBody
PhysicsBody是一个代表基本2D刚体的类,它包含几个参数,如刚体的速度和加速度。
PhysicsShape
PhysicsShape是一个代表基本2D碰撞形状的类,它可以表示最多30个顶点的凸多边形。但球体被看做是没有顶点的多边形例外处理。
PhysicsJoint
PhysicsJoint是一个代表基本2D关节的类,它给出了刚体对角度和位置的限制。你可以利用这个PhysicsJoint创建球关节和滑动关节。
PhysicsScene
PhysicsScene是一个代表基本2D物理场景的类。在每个场景中进行物理模拟。
PhysicsSolverPair
PhysicsSolverPair是求解阶段的碰撞信息,它包含一对刚体的碰撞信息。
PhysicsUtility
PhysicsUtility是定义了模拟内部使用的常量和静态函数的类。