UDN
Search public documentation:

GFxPositioningGuideCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 用户界面 & HUD > Scaleform GFx > SetViewScaleMode、SetAlignment 和 SetViewport 指南

SetViewScaleMode、SetAlignment 和 SetViewport 指南


概述


这个教程大致介绍了三个GFxMoviePlayer函数SetViewScaleMode()、SetAlignment()和SetViewport(),这样您就能比较容易知道在什么时候使用它们以及使用的方法。首先,GFx短片在使用Start()和Advance()函数启动后才会在该短片上调用这三个函数。

这通常是您使用它们的方法:

Unrealscript
function CreateMovie()
{
  MyMovie = new MenuClass;

  // MenuClass 的初始化函数包含 Sart() 和 Advance()
  MyMovie.Init(class'Engine'.static.GetEngine().GamePlayers[MyMovie.LocalPlayerOwnerIndex]);

  MyMovie.SetViewScaleMode(SM_NoScale);
  MyMovie.SetAlignment(Align_TopCenter);
}

SetViewScaleMode 参数


SetViewScaleMode 让您能具体了解应该怎样对GFx短片进行缩放,能使之随着分辨率的变化而同屏幕匹配。缩放模式可以通过ActionScript或虚幻脚本进行设置。

UnrealScript
MyMovie.SetViewScaleMode(SM_NoScale);

  • SM_NoScale - 该SWF的尺寸和长宽比(aspect ratio-AR)同在Flash的IDE中所设的原先创建的文档尺寸是一致的,不管在UDK中分辨率有无变化,缩放都不会进行,剪辑会在游戏分辨率比Flash文档尺寸小的时候进行
  • SM_ShowAll - 不管您在UDK中设置了什么分辨率,整个SWF总是可见的;保持原先的长宽比(AR)就能确保在SWF上执行统一缩放;剪辑不会进行,但是信息框会进行。
  • *SM_ExactFit - 调整它的长宽比对SWF进行拉伸,或非统一缩放,使它同屏幕分辨率匹配;这会导致视频剪辑在X和Y上扭曲,剪辑不会进行。
  • SM_NoBorder SWF总是以原始的长宽比显示,但会根据分辨率缩放;剪辑会在游戏分辨率比Flash文档尺寸小的时候进行。

ActionScript
Stage.scaleMode = "noScale";

  • noScale - 与 SM_NoScale 相同。
  • showAll - 与 SM_ShowAll 相同。
  • exactFit - 与 SM_ExactFit 相同。
  • noBorder - 与 SM_NoBorder 相同。

SetAlignment 参数


SetAlignment 允许您指定 GFx 视频在屏幕上的对齐方式。SetAlignment 可以通过 ActionScript 或 UnrealScript 进行设置。

UnrealScript
MyMovie.SetAlignment(Align_TopCenter);

  • Align_Center - 屏幕水平方向和垂直方向以 SWF 为中心。
  • Align_TopCenter - SWF 的顶部位于屏幕的顶部,而屏幕水平方向以 SWF 为中心。
  • Align_BottomCenter - SWF 的底部位于屏幕的底部,而屏幕水平方向以 SWF 为中心。
  • Align_CenterLeft - 屏幕垂直方向以 SWF 为中心并且它与屏幕的左侧对齐。
  • Align_CenterRight - 屏幕垂直方向以 SWF 为中心并且它与屏幕的右侧对齐。
  • Align_TopLeft - SWF 的左上角在屏幕的左上角。
  • Align_TopRight - SWF 的右上角在屏幕的右上角。
  • Align_BottomLeft - SWF 的左下角在屏幕的左下角。
  • Align_BottomRight - SWF 的右下角在屏幕的右下角。

ActionScript
Stage.align = "TL";

  • C - 与 Align_Center 相同。
  • TC - 与 Align_TopCenter 相同。
  • BC - 与 Align_BottomCenter 相同。
  • CL - 与 Align_CenterLeft 相同。
  • CR - 与 Align_CenterRight 相同。
  • TL - 与 Align_TopLeft 相同。
  • TR - 与 Align_TopRight 相同。
  • BL - 与 Align_BottomLeft 相同。
  • BR - 与 Align_BottomRight 相同。

SetViewport


SetViewport 允许您手动改变 GFx 短片视窗的显示大小和位置。

示例: MyMovie.SetViewport(0, 0, 1280, 720) 会将短片大小显示为 1280x720,短片的左上角从屏幕坐标 0,0 开始。

示例使用案例

  • 在 Flash 中,创建一个新的 1280x720 文档。
  • 创建四个不同颜色的小矩形,然后将每个矩形放置在这个 Flash 文件的角上,与每条边的距离大约是 15 个像素。
  • 将全部这四个矩形转换为短片剪辑片断。要点: 所有矩形的注册点都应该在矩形的左上角。确保当您在符号窗口转换中使用注册点图标将每个矩形转换为一个符号时正确设置注册点。
  • 为每个矩形提供一个实例名称,从左上角开始顺时针方向依次命名它们: rectangle1, rectangle2, rectangle3, rectangle4。您现在应该会看到如下内容:
    HUDAlignment.png
  • 新建一个动作层。
  • 在这个层上,输入下面的代码:

ActionScript
_global.gfxExtensions = true;

Stage.scaleMode = "noScale";
Stage.align = "TL";

var srl:Object = new Object();

function updateHud():Void
{
  // 将矩形放置在距离边 15 个像素的地方

  // 左上方
  rectangle1._y = 15;
  rectangle1._x = 15;

  // 右上方
  rectangle2._y = 15;
  rectangle2._x = (Stage["visibleRect"].width - 15) - rectangle2.width;

  // 右下方
  rectangle3._y = (Stage["visibleRect"].height - 15) - rectangle3.height;
  rectangle3._x = (Stage["visibleRect"].width - 15) - rectangle3.width;

  // 左下方
  rectangle4._y = (Stage["visibleRect"].height - 15) - rectangle4.height;
  rectangle4._x = 15;
}

// 通知舞台检测是否有更改。
Stage.addListener(srl);

// Stage resize handler - 每当通过分辨率更改调整这个短片的时候都会运行这个选项。
srl.onResize = function()
{
    updateHud();
}

// 调用与初始化相关的 updateHud
updateHud();

stop();

  • 保存并完善这个 SWF,然后导入到 UDK 中。
  • 使用 Kismet(打开 GFx 短片)或者创建一个可以将这个 SWF 显示在屏幕上的 UnrealScript 类作为 HUD。
  • 在分辨率为 1280x720 的情况下运行游戏。您应该可以看到您刚刚创建的 HUD。
  • 通过 Tab 键打开控制台,然后将分辨率更改为其他值,例如使用 "setres 800x600" 的 800x600。
  • 注意这四个矩形将会在 HUD 的同一个位置(角),但是大小没有改变(没有进行缩放)。

ALERT! 注意: 与其使用下面的 ActionScript 对齐和缩放模式代码:

ActionScript
Stage.scaleMode = "noScale";
Stage.align = "TL";

您完全可以使用 UnrealScript 进行这项操作:

UnrealScript
MyMovie.SetViewScaleMode(SM_NoScale);
MyMovie.SetAlignment(Align_TopLeft);