1、这个初学者工具包包含示例代码,您可以从这段示例代码开始学习开发实时战略游戏,例如Hostile Worlds,它是使用UDK制作目前还在开发中的游戏。包含哪些内容?与平台游戏初学者工具包或竞速游戏初学者工具包不同;在这个初学者工具包中有大量代码和内容。它还有一些与实时策略游戏实际并不相关的高级功能,但是对开发的其他方面也会有帮助。 Platform abstraction - RTS 初学者工具包可以分辨出玩家正在使用什么平台玩游戏。根据玩家使用的平台,使用的玩家控制器和 HUD 类也会有所不同。但是,只是中断了对 PC 和 Console 平台类的支持。目前,只完全支持移动设备平台。 Cam
2、era - RTS 初学者工具包有一个指导您如何创建一个像鸟的眼睛视图相机一样的相机的示例。它可以支持平移、触摸平移和缩放。 Structures - RTS 初学者工具包中包含可以处理玩家构建的结构的示例代码。 Units - RTS 初学者工具包中包含可以处理玩家可以将命令发布到的单元的示例代码。 Skills - RTS 初学者工具包中包含可以处理单元的技能的示例代码。 Resource Management - RTS 初学者工具包中包含可以处理玩家资源的示例代码。 AI - RTS 初学者工具包中包含向您说明如何创建一个能够构建结构、单元并与您作战的敌人 AI 玩家的示例代码。 Up
3、grades - RTS 初学者工具包中包含向您说明如何为您的单元创建升级的示例代码。 Structure Upgrades - RTS 初学者工具包中包含向您说明如何创建可以将自己本身升级为高级形式的结构的示例代码。 Networking - RTS 初学者工具包已经在心里通过相互关联进行构建,这样为您设置了函数复制。 Documentation - RTS 初学者工具包使用与Javadocs相似的类型完整保存。 UI - RTS 初学者工具包有一个可以处理简单按钮的小型自定义 UI 码基数。代码结构 RTS 初学者工具包是一个大型的复杂项目,因此在您开始扩展和/或修改这个初学者工具包创建您
4、的游戏之前了解所有部分是重要的。如何发现“隐藏”在鼠标/手指后面的秘密?鼠标界面代码与鼠标界面开发工具包精华文章相比工作方式截然不同。在这个 RTS 游戏实例中,您实际上不希望距离远的单元选择起来困难,或者您可能希望在任何给定时间优先选择不同的单元。例如,您可能希望使单元比结构更重要,结构比资源点更重要。RTS 初学者工具包解决了由于创建代表屏幕上单元的大小的屏幕空间方框而产生的问题。要解决远处的单元的屏幕框太小的问题,可以将人造间距添加到框大小(但是,在开发过程中,由于相机类型这个问题并没有真正出现)。要解决优先级问题,首先遍历单元,然后是结构,接下来是资源。因为触摸已经在屏幕空间中捕获,所
5、以在此会对框范围内的点进行比较,找出鼠标/手指在什么上面。如果鼠标/手指没有触摸任何东西,那么可以断定它一定已经触及到世界。在这个代码段中,代码会遍历世界中的所有资源,同时为它们计算屏幕绑定框。UDKRTSMobileHUD.uc/ 为所有资源计算屏幕绑定框for (i = 0; i = 0.1f) OutBox.Min.X = -1.f; OutBox.Min.Y = -1.f; OutBox.Max.X = -1.f; OutBox.Max.Y = -1.f; return OutBox; ComponentsBoundingBox.Min = PrimitiveComponent.Bou
6、nds.Origin - PrimitiveComponent.Bounds.BoxExtent; ComponentsBoundingBox.Max = PrimitiveComponent.Bounds.Origin + PrimitiveComponent.Bounds.BoxExtent; / Z1 / X1, Y1 BoundingBoxCoordinates0.X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates0.Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates
7、0.Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoordinates0 = HUD.Canvas.Project(BoundingBoxCoordinates0); / X2, Y1 BoundingBoxCoordinates1.X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates1.Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates1.Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoo
8、rdinates1 = HUD.Canvas.Project(BoundingBoxCoordinates1); / X1, Y2 BoundingBoxCoordinates2.X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates2.Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates2.Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoordinates2 = HUD.Canvas.Project(BoundingBoxCoordin
9、ates2); / X2, Y2 BoundingBoxCoordinates3.X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates3.Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates3.Z = ComponentsBoundingBox.Min.Z; BoundingBoxCoordinates3 = HUD.Canvas.Project(BoundingBoxCoordinates3); / Z2 BoundingBoxCoordinates4.X = Componen
10、tsBoundingBox.Min.X; BoundingBoxCoordinates4.Y = ComponentsBoundingBox.Min.Y; BoundingBoxCoordinates4.Z = ComponentsBoundingBox.Max.Z; BoundingBoxCoordinates4 = HUD.Canvas.Project(BoundingBoxCoordinates4); BoundingBoxCoordinates5.X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates5.Y = Component
11、sBoundingBox.Min.Y; BoundingBoxCoordinates5.Z = ComponentsBoundingBox.Max.Z; BoundingBoxCoordinates5 = HUD.Canvas.Project(BoundingBoxCoordinates5); BoundingBoxCoordinates6.X = ComponentsBoundingBox.Min.X; BoundingBoxCoordinates6.Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates6.Z = Components
12、BoundingBox.Max.Z; BoundingBoxCoordinates6 = HUD.Canvas.Project(BoundingBoxCoordinates6); BoundingBoxCoordinates7.X = ComponentsBoundingBox.Max.X; BoundingBoxCoordinates7.Y = ComponentsBoundingBox.Max.Y; BoundingBoxCoordinates7.Z = ComponentsBoundingBox.Max.Z; BoundingBoxCoordinates7 = HUD.Canvas.Pr
13、oject(BoundingBoxCoordinates7); / 找出左方、顶部、右方和底部坐标 OutBox.Min.X = HUD.Canvas.ClipX; OutBox.Min.Y = HUD.Canvas.ClipY; OutBox.Max.X = 0; OutBox.Max.Y = 0; / 遍历边界盒坐标 for (i = 0; ArrayCount(BoundingBoxCoordinates); / 检测最小的 X 坐标 if (OutBox.Min.X BoundingBoxCoordinatesi.X) OutBox.Min.X = BoundingBoxCoordin
14、atesi.X; / 检测最小的 Y 坐标 if (OutBox.Min.Y BoundingBoxCoordinatesi.Y) OutBox.Min.Y = BoundingBoxCoordinatesi.Y; / 检测最大的 X 坐标 if (OutBox.Max.X OutBox.Max.X = BoundingBoxCoordinatesi.X; / 检测最大的 Y 坐标 if (OutBox.Max.Y OutBox.Max.Y = BoundingBoxCoordinatesi.Y; / 检查边界盒是否在屏幕范围内 if (OutBox.Min.X 0 & OutBox.Max.
15、X HUD.Canvas.ClipX & OutBox.Max.X HUD.Canvas.ClipX) | (OutBox.Min.Y OutBox.Max.Y HUD.Canvas.ClipY & OutBox.Max.Y HUD.Canvas.ClipY) else / 限定边界盒坐标 OutBox.Min.X = FClamp(OutBox.Min.X, 0.f, HUD.Canvas.ClipX); OutBox.Max.X = FClamp(OutBox.Max.X, 0.f, HUD.Canvas.ClipX); OutBox.Min.Y = FClamp(OutBox.Min.Y
16、, 0.f, HUD.Canvas.ClipY); OutBox.Max.Y = FClamp(OutBox.Max.Y, 0.f, HUD.Canvas.ClipY);在这个代码段中,检测到触摸事件的时候, 这段代码会遍历单元(pawn)数组和结构数组。如果触摸地点在单元或结构的屏幕绑定框范围内,然后它被选中,随后注册它的 HUD 操作。UDKRTSMobilePlayerController.uc/ 检查我们是否触摸了任何游戏相关对象if (PlayerReplicationInfo ! UDKRTSTeamInfo = UDKRTSTeamInfo(PlayerReplicationIn
17、fo.Team); if (UDKRTSTeamInfo ! UDKRTSMobileHUD = UDKRTSMobileHUD(MyHUD); if (UDKRTSMobileHUD ! / 我们触摸的是否是一个 pawn? if (TouchEvent.Response = ETR_None & UDKRTSTeamInfo.Pawns.Length 0) UDKRTSTeamInfo.Pawns.Length; if (UDKRTSTeamInfo.Pawnsi != None & classUDKRTSMobileHUD.static.IsPointWithinBox(TouchLoc
18、ation, UDKRTSTeamInfo.Pawnsi.ScreenBoundingBox) & TouchEvents.Find(AssociatedActor, UDKRTSTeamInfo.Pawnsi) = INDEX_NONE) UDKRTSTeamInfo.Pawnsi.Selected(); UDKRTSTeamInfo.Pawnsi.RegisterHUDActions(UDKRTSMobileHUD); TouchEvent.AssociatedActor = UDKRTSTeamInfo.Pawnsi; TouchEvent.Response = ETR_Pawn; br
19、eak; / 我们触摸的是一个结构? UDKRTSTeamInfo.Structures.Length UDKRTSTeamInfo.Structures.Length; if (class.static.IsPointWithinBox(TouchLocation, UDKRTSTeamInfo.Structuresi.ScreenBoundingBox) &, UDKRTSTeamInfo.Structuresi) = INDEX_NONE) UDKRTSTeamInfo.Structuresi.Selected(); UDKRTSTeamInfo.Structuresi.Register
20、HUDActions(UDKRTSMobileHUD); TouchEvent.AssociatedActor = UDKRTSTeamInfo.Structuresi; TouchEvent.Response = ETR_Structure;选择结构/单元后按钮显示在 HUD 上的方式?在 RTS 初学者工具包中,按钮被称为 HUD 操作。HUD 操作是在 UDKRTSHUD.uc 中定义的结构体。在这个代码段中,您可以看到 HUD 操作只定义了贴图和一组 UV 坐标贴图。将这些变量显示在虚幻编辑器中,这样就允许游戏开发者们设置这些值。在游戏中使用其他四个变量执行其他函数,我们将会在后续内容
21、中进行说明。/ HUD 上的 HUD 操作struct SHUDAction var() Texture2D Texture; var() float U; var() float V; var() float UL; var() float VL; var EHUDActionReference Reference; var int Index; var bool PostRender; var delegate IsHUDActionActiveDelegate;然后,在另一个叫做 SAssociatedHUDAction 的结构体内使用 HUD 操作结构体。这些将 HUD 操作的数组与
22、actor 相关联。/ HUD 上与 actor 相关联的 HUD 操作struct SAssociatedHUDAction var Actor AssociatedActor; var array HUDActions;当用户选择结构/单元(通过在移动设备版本中触摸结构/单元)的时候,在结构/单元上调用函数 RegisterHUDActions()。然后该函数会将相关 HUD 操作注册到 HUD。在这个代码段中,Portrait 变量是 SHUDAction,它可以定义在很多 RTS 游戏中常见的角色画像。因此,这段代码会设置可以通知游戏其他地方如何进行这项 HUD 操作的参数变量,一个可
23、以存储一些元数据和后期渲染布尔变量的索引变量(稍后进一步说明)。只要 HUD 操作设置完成,就会进行注册。UDKRTSPawn.ucsimulated function RegisterHUDActions(UDKRTSMobileHUD HUD) local SHUDAction SendHUDAction; if (HUD = None | OwnerReplicationInfo = None | HUD.AssociatedHUDActions.Find(, Self) != INDEX_NONE | Health = 0) return; / 注册相机中心 HUD 操作 if (Portrait.Texture ! SendHUDAction = Portrait; SendHUDAction.Reference = EHAR_Center; SendHUDAction.Index = -1; SendHUDAction.PostRender = true; HUD.RegisterHUDAction(Self, SendHUDAction);这个代码段会描述注册 HUD 操作时会发生什么。它会在 AssociatedHUDActions 数列内进行搜索,看看是否应该将其插入到中间, 进行这项
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1