UDN
Search public documentation:

GFxCreateCursorCH
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 > 怎样创建一个鼠标指针

如何创建一个鼠标指针


概述


这个中级关卡教程会教您如何将一个可切换鼠标指针添加到一个现有的HUD。 这个鼠标指针不会在Flash文件的页面上存在,但只会在库中。 当用户按下且在键盘上按住左边的shift键时,它在运行时通过虚幻脚本被实例化并被附加到_root.Flash.timeline。

ALERT! Note: 使用这个方法时,最好将您所有的界面内容都放置好,如位于_root中容器视频剪辑中的按钮、下拉框、复选框等(除了鼠标指针外)。 鼠标指针也位于_root内。 这能保证鼠标总是在顶部,即使弹出的界面元素打开时也是如此(比如在下拉框菜单控件中找到的内容)。 当在运行时动态创建这些弹出元素的内容时,它们通常将自身设为位于任何物体之上。 这个弹出控件会出现在鼠标指针上方,而不是在容器视频剪辑内。

Flash


  • 打开您的HUD FLA文件,并在页面上创建一个新的鼠标指针图片,图片可以是一个位图,也可以使用Flash绘画工具。 请确保小提示如大多数指针一样位于左上角。
  • 现在选中指针图片,并右击选择"Convert to Symbol(转换到标记)"
  • 在名称域中,输入MouseContainer(鼠标容器)。
  • 种类应该是Movie Clip(视频剪辑)。
  • 注册码应该设在左上角。
  • 启用ActionScript输出并在第一帧输出。
  • 在标识符域中,输入MouseContainer(鼠标容器)。
  • 点击OK。
  • 现在在页面上双击指针键入MouseContainer(鼠标容器)视频短片。
  • 再次选中图形并右击选择"Convert to Symbol(转换到标记)"
  • 将其命名为MouseImage
  • 种类应该还是Movie Clip(视频剪辑)。
  • 注册码应该还是设在左上角。
  • 点击OK。
  • 选中在页面上的指针视频短片并赋予它一个mouseCursor_mc的实例名。
  • 您应该看到以下层次:
    • MouseContainer movieclip(鼠标容器)视频剪辑(没有实例名)
      • MouseContainer(鼠标容器)视频剪辑(有实例名: mouseCursor_mc)
        • 鼠标指针位图
  • 将任一您所要的过滤器添加到该视频剪辑(mouseCursor_mc),比如一个投影过滤器。
  • 现在,松开mouseCursor_mc,将一个新的图层添加到时间轴上(在MouseContainer里的时间轴)调用它的动作。
  • 在该动作层的第一帧上添加以下代码:

ActionScript
import flash.external.ExternalInterface;

Mouse.hide();

var mouseListener:Object = new Object();

mouseListener.onMouseMove = function ()
{
  mouseCursor_mc._x = _root._xmouse;
  mouseCursor_mc._y = _root._ymouse;

  ExternalInterface.call("UpdateMousePosition", _root._xmouse, _root._ymouse);

  updateAfterEvent();
};

Mouse.addListener(mouseListener);

  • 现在返回到您Flash文件的_root timeline并从页面中删除这个指针视频剪辑(MouseContainer)。 不要着急,它仍然在库内。 注意: 在您的库里需要有两个视频剪辑: MouseContainer(鼠标容器)&MouseImage(鼠标图片),还有鼠标指针位图
  • 保存、发布并将您修改过的HUD文件导入UDK。

虚幻脚本 - HUD类修改(扩展GFxMoviePlayer)


首先,将这些变量添加到您的HUD类中(这些变量是扩展GFxMoviePlayer的)。

// Standard Flash Objects
var GFxObject RootMC, MouseContainer, MouseCursor;

var array<ASValue> args;

将这些代码添加到您的Start() 或Init()函数中。

RootMC = GetVariableObject("_root");
AddFocusIgnoreKey('LeftShift'); // Tells HUD to ignore Left Shift keyboard presses

将这些函数添加到您的类中:

event UpdateMousePosition(float X, float Y)
{
  local MouseInterfacePlayerInput MouseInterfacePlayerInput;

  MouseInterfacePlayerInput = MouseInterfacePlayerInput(GetPC().PlayerInput);
  if (MouseInterfacePlayerInput != None)
  {
    MouseInterfacePlayerInput.SetMousePosition(X, Y);
  }
}

/** Toggles mouse cursor on/off */
function ToggleCursor(bool showCursor, float mx, float my)
{
  if (showCursor)
  {
    MouseContainer = CreateMouseCursor();
    MouseCursor = MouseContainer.GetObject("my_cursor");
    MouseCursor.SetPosition(mx,my);
    MouseContainer.SetBool("topmostLevel", true);
  }
  else
  {
    MouseContainer.Invoke("removeMovieClip", args);
    MouseContainer = none;
  }

  bIgnoreMouseInput = !showCursor;
}

function GFxObject CreateMouseCursor()
{
  return RootMC.AttachMovie("MouseContainer", "MouseCursor");
}

CreateMouseCursor(创建鼠标指针)函数附加了在Flash中的Movie Clip,它有针对 _root timeline (页面)的MouseContainer(鼠标容器)标识符,并赋予它一个MouseCursor(鼠标指针)的实例名。

在默认属性中,请确认包含以下内容:

defaultproperties
{
  bIgnoreMouseInput = true
}

虚幻脚本 - 修改HUD封装类


首先,将这些变量添加到您的HUD封装类中(实例化以上HUD类的类)

var GFxObject HudMovieSize;
var MouseInterfacePlayerInput MouseInterfacePlayerInput;
var float MouseX, MouseY;

其次,将这几行代码(标记为红色的)添加到您的PostBeginPlay()函数中:

simulated function PostBeginPlay()
{
  Super.PostBeginPlay();

  // Your HUD instantiation code here...

  // Stage.originalRect contains the original width and height of the SWF file.
  // Replace HudMovie with the name of your instantiated HUD.
  HudMovieSize = HudMovie.GetVariableObject("Stage.originalRect");

  MouseInterfacePlayerInput = MouseInterfacePlayerInput(PlayerOwner.PlayerInput);
}

其次,添加这个函数,在用户按下左边的shift键时会执行这个函数。 这个函数在HUD类中调用ToggleCursor()函数,并在按下左边的shift键,或在发布时为false(假值)时,将其以真值传递。 它也传输鼠标X和Y的位置。

exec function SetShowCursor(bool showCursor)
{
  // Replace HudMovie with the name of your instantiated HUD.
  HudMovie.ToggleCursor(showCursor, MouseX, MouseY);
}

现在,将这几行代码添加到PostRender()事件函数,它就位于HudMovie.TickHud(0)调用的上方。 使用这两行代码来取得当前鼠标指针的X 和Y 轴的位置:

event PostRender()
{
  super.PostRender();

  MouseX = MouseInterfacePlayerInput.MousePosition.X;
  MouseY = MouseInterfacePlayerInput.MousePosition.Y;

  // Tick HUD
  if(LP != none)
  {
    HudMovie.TickHud(0);
  }
}

虚幻脚本 - MouseInterfacePlayerInput Class(鼠标接口玩家输入)类


创建这个新的类并将它保存为 MouseInterfacePlayerInput.uc;请确认将所有SFHudWrapper的实例替代为您的HUD封装类名称。

class MouseInterfacePlayerInput extends PlayerInput;

// Stored mouse position. 设置为 private write 权限,因为我们不希望其他类修改它,但是仍然允许其他类进行访问。
var PrivateWrite IntPoint MousePosition;
var SFHudWrapper SFHudWrapper;
var float HudX, HudY;

event PlayerInput(float DeltaTime)
{
  GetHudSize();

  if (myHUD != None)
  {
    // Add the aMouseX to the mouse position and clamp it within the viewport width
    MousePosition.X = Clamp(MousePosition.X + aMouseX, 0, HudX);
    // Add the aMouseY to the mouse position and clamp it within the viewport height
    MousePosition.Y = Clamp(MousePosition.Y - aMouseY, 0, HudY);
  }

  Super.PlayerInput(DeltaTime);
}

// This function gets the original width and height of the HUD SWF and stores those values in HudX and HudY.
function GetHudSize()
{
  // First store a reference to our HUD Wrapper and get the resolution of the HUD
  SFHudWrapper = SFHudWrapper(myHUD);
  HudX = SFHudWrapper.HudMovieSize.GetFloat("width");
  HudY = SFHudWrapper.HudMovieSize.GetFloat("height");
}

function SetMousePosition(int X, int Y)
{
  GetHudSize();

  if (MyHUD != None)
  {
    MousePosition.X = Clamp(X, 0, HudX);
    MousePosition.Y = Clamp(Y, 0, HudY);
  }
}

defaultproperties
{
}

虚幻脚本 - 修改PlayerController Class(玩家控制器类)


将这些代码添加到您PlayerController Class(玩家控制器类)的默认属性中:

defaultproperties
{
  InputClass=class'MouseInterfacePlayerInput'
}

配置文件

然后将这些代码行添加到您的DefaultInput.ini文件: 代码:

.Bindings=(Name="LeftShift",Command="SetShowCursor true | Onrelease SetShowCursor false")

  • 保存并编译脚本。
  • 通过运行这个游戏来测试您的新指针!