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
日本語訳
한국어
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
如何创建一个鼠标指针
概述
这个中级关卡教程会教您如何将一个可切换鼠标指针添加到一个现有的HUD。 这个鼠标指针不会在Flash文件的页面上存在,但只会在库中。 当用户按下且在键盘上按住左边的shift键时,它在运行时通过虚幻脚本被实例化并被附加到_root.Flash.timeline。 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)
- 鼠标指针位图
- MouseContainer(鼠标容器)视频剪辑(有实例名: mouseCursor_mc)
- MouseContainer movieclip(鼠标容器)视频剪辑(没有实例名)
- 将任一您所要的过滤器添加到该视频剪辑(mouseCursor_mc),比如一个投影过滤器。
- 现在,松开mouseCursor_mc,将一个新的图层添加到时间轴上(在MouseContainer里的时间轴)调用它的动作。
- 在该动作层的第一帧上添加以下代码:
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;
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"); }
defaultproperties { bIgnoreMouseInput = true }
虚幻脚本 - 修改HUD封装类
首先,将这些变量添加到您的HUD封装类中(实例化以上HUD类的类)
var GFxObject HudMovieSize; var MouseInterfacePlayerInput MouseInterfacePlayerInput; var float MouseX, MouseY;
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); }
exec function SetShowCursor(bool showCursor) { // Replace HudMovie with the name of your instantiated HUD. HudMovie.ToggleCursor(showCursor, MouseX, MouseY); }
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")
- 保存并编译脚本。
- 通过运行这个游戏来测试您的新指针!