实时策略游戏初学者工具包Word格式文档下载.docx
《实时策略游戏初学者工具包Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《实时策略游戏初学者工具包Word格式文档下载.docx(56页珍藏版)》请在冰豆网上搜索。
这个初学者工具包包含示例代码,您可以从这段示例代码开始学习开发实时战略游戏,例如HostileWorlds,它是使用UDK制作目前还在开发中的游戏。
包含哪些内容?
与平台游戏初学者工具包或竞速游戏初学者工具包不同;
在这个初学者工具包中有大量代码和内容。
它还有一些与实时策略游戏实际并不相关的高级功能,但是对开发的其他方面也会有帮助。
∙Platformabstraction-RTS初学者工具包可以分辨出玩家正在使用什么平台玩游戏。
根据玩家使用的平台,使用的玩家控制器和HUD类也会有所不同。
但是,只是中断了对PC和Console平台类的支持。
目前,只完全支持移动设备平台。
∙Camera-RTS初学者工具包有一个指导您如何创建一个像鸟的眼睛视图相机一样的相机的示例。
它可以支持平移、触摸平移和缩放。
∙Structures-RTS初学者工具包中包含可以处理玩家构建的结构的示例代码。
∙Units-RTS初学者工具包中包含可以处理玩家可以将命令发布到的单元的示例代码。
∙Skills-RTS初学者工具包中包含可以处理单元的技能的示例代码。
∙ResourceManagement-RTS初学者工具包中包含可以处理玩家资源的示例代码。
∙AI-RTS初学者工具包中包含向您说明如何创建一个能够构建结构、单元并与您作战的敌人AI玩家的示例代码。
∙Upgrades-RTS初学者工具包中包含向您说明如何为您的单元创建升级的示例代码。
∙StructureUpgrades-RTS初学者工具包中包含向您说明如何创建可以将自己本身升级为高级形式的结构的示例代码。
∙Networking-RTS初学者工具包已经在心里通过相互关联进行构建,这样为您设置了函数复制。
∙Documentation-RTS初学者工具包使用与Javadocs相似的类型完整保存。
∙UI-RTS初学者工具包有一个可以处理简单按钮的小型自定义UI码基数。
代码结构
RTS初学者工具包是一个大型的复杂项目,因此在您开始扩展和/或修改这个初学者工具包创建您的游戏之前了解所有部分是重要的。
如何发现“隐藏”在鼠标/手指后面的秘密?
鼠标界面代码与鼠标界面开发工具包精华文章相比工作方式截然不同。
在这个RTS游戏实例中,您实际上不希望距离远的单元选择起来困难,或者您可能希望在任何给定时间优先选择不同的单元。
例如,您可能希望使单元比结构更重要,结构比资源点更重要。
RTS初学者工具包解决了由于创建代表屏幕上单元的大小的屏幕空间方框而产生的问题。
要解决远处的单元的屏幕框太小的问题,可以将人造间距添加到框大小(但是,在开发过程中,由于相机类型这个问题并没有真正出现)。
要解决优先级问题,首先遍历单元,然后是结构,接下来是资源。
因为触摸已经在屏幕空间中捕获,所以在此会对框范围内的点进行比较,找出鼠标/手指在什么上面。
如果鼠标/手指没有触摸任何东西,那么可以断定它一定已经触及到世界。
在这个代码段中,代码会遍历世界中的所有资源,同时为它们计算屏幕绑定框。
UDKRTSMobileHUD.uc
//为所有资源计算屏幕绑定框
for(i=0;
i<
UDKRTSGameReplicationInfo.Resources.Length;
++i)
{
if(UDKRTSGameReplicationInfo.Resources[i]!
=None)
{
UDKRTSGameReplicationInfo.Resources[i].ScreenBoundingBox=CalculateScreenBoundingBox(Self,UDKRTSGameReplicationInfo.Resources[i],UDKRTSGameReplicationInfo.Resources[i].CollisionCylinder);
//渲染调试绑定框
if(ShouldDisplayDebug('
BoundingBoxes'
))
Canvas.SetPos(UDKRTSGameReplicationInfo.Resources[i].ScreenBoundingBox.Min.X,UDKRTSGameReplicationInfo.Resources[i].ScreenBoundingBox.Min.Y);
Canvas.DrawColor=UDKRTSGameReplicationInfo.Resources[i].BoundingBoxColor;
Canvas.DrawBox(UDKRTSGameReplicationInfo.Resources[i].ScreenBoundingBox.Max.X-UDKRTSGameReplicationInfo.Resources[i].ScreenBoundingBox.Min.X,UDKRTSGameReplicationInfo.Resources[i].ScreenBoundingBox.Max.Y-UDKRTSGameReplicationInfo.Resources[i].ScreenBoundingBox.Min.Y);
}
}
在这个代码段中,代码会计算屏幕绑定框。
这与Actor选择框开发工具包精华文章相似。
UDKRTSHUD.uc
functionBoxCalculateScreenBoundingBox(HUDHUD,ActorActor,PrimitiveComponentPrimitiveComponent)
localBoxComponentsBoundingBox,OutBox;
localVectorBoundingBoxCoordinates[8];
localinti;
if(HUD==None||PrimitiveComponent==None||Actor==None||WorldInfo.TimeSeconds-Actor.LastRenderTime>
=0.1f)
OutBox.Min.X=-1.f;
OutBox.Min.Y=-1.f;
OutBox.Max.X=-1.f;
OutBox.Max.Y=-1.f;
returnOutBox;
ComponentsBoundingBox.Min=PrimitiveComponent.Bounds.Origin-PrimitiveComponent.Bounds.BoxExtent;
ComponentsBoundingBox.Max=PrimitiveComponent.Bounds.Origin+PrimitiveComponent.Bounds.BoxExtent;
//Z1
//X1,Y1
BoundingBoxCoordinates[0].X=ComponentsBoundingBox.Min.X;
BoundingBoxCoordinates[0].Y=ComponentsBoundingBox.Min.Y;
BoundingBoxCoordinates[0].Z=ComponentsBoundingBox.Min.Z;
BoundingBoxCoordinates[0]=HUD.Canvas.Project(BoundingBoxCoordinates[0]);
//X2,Y1
BoundingBoxCoordinates[1].X=ComponentsBoundingBox.Max.X;
BoundingBoxCoordinates[1].Y=ComponentsBoundingBox.Min.Y;
BoundingBoxCoordinates[1].Z=ComponentsBoundingBox.Min.Z;
BoundingBoxCoordinates[1]=HUD.Canvas.Project(BoundingBoxCoordinates[1]);
//X1,Y2
BoundingBoxCoordinates[2].X=ComponentsBoundingBox.Min.X;
BoundingBoxCoordinates[2].Y=ComponentsBoundingBox.Max.Y;
BoundingBoxCoordinates[2].Z=ComponentsBoundingBox.Min.Z;
BoundingBoxCoordinates[2]=HUD.Canvas.Project(BoundingBoxCoordinates[2]);
//X2,Y2
BoundingBoxCoordinates[3].X=ComponentsBoundingBox.Max.X;
BoundingBoxCoordinates[3].Y=ComponentsBoundingBox.Max.Y;
BoundingBoxCoordinates[3].Z=ComponentsBoundingBox.Min.Z;
BoundingBoxCoordinates[3]=HUD.Canvas.Project(BoundingBoxCoordinates[3]);
//Z2
BoundingBoxCoordinates[4].X=ComponentsBoundingBox.Min.X;
BoundingBoxCoordinates[4].Y=ComponentsBoundingBox.Min.Y;
BoundingBoxCoordinates[4].Z=ComponentsBoundingBox.Max.Z;
BoundingBoxCoordinates[4]=HUD.Canvas.Project(BoundingBoxCoordinates[4]);
BoundingBoxCoordinates[5].X=ComponentsBoundingBox.Max.X;
BoundingBoxCoordinates[5].Y=ComponentsBoundingBox.Min.Y;
BoundingBoxCoordinates[5].Z=ComponentsBoundingBox.Max.Z;
BoundingBoxCoordinates[5]=HUD.Canvas.Project(BoundingBoxCoordinates[5]);
BoundingBoxCoordinates[6].X=ComponentsBoundingBox.Min.X;
BoundingBoxCoordinates[6].Y=ComponentsBoundingBox.Max.Y;
BoundingBoxCoordinates[6].Z=ComponentsBoundingBox.Max.Z;
BoundingBoxCoordinates[6]=HUD.Canvas.Project(BoundingBoxCoordinates[6]);
BoundingBoxCoordinates[7].X=ComponentsBoundingBox.Max.X;
BoundingBoxCoordinates[7].Y=ComponentsBoundingBox.Max.Y;
BoundingBoxCoordinates[7].Z=ComponentsBoundingBox.Max.Z;
BoundingBoxCoordinates[7]=HUD.Canvas.Project(BoundingBoxCoordinates[7]);
//找出左方、顶部、右方和底部坐标
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>
BoundingBoxCoordinates[i].X)
OutBox.Min.X=BoundingBoxCoordinates[i].X;
//检测最小的Y坐标
if(OutBox.Min.Y>
BoundingBoxCoordinates[i].Y)
OutBox.Min.Y=BoundingBoxCoordinates[i].Y;
//检测最大的X坐标
if(OutBox.Max.X<
OutBox.Max.X=BoundingBoxCoordinates[i].X;
//检测最大的Y坐标
if(OutBox.Max.Y<
OutBox.Max.Y=BoundingBoxCoordinates[i].Y;
//检查边界盒是否在屏幕范围内
if((OutBox.Min.X<
0&
&
OutBox.Max.X<
0)||(OutBox.Min.X>
HUD.Canvas.ClipX&
OutBox.Max.X>
HUD.Canvas.ClipX)||(OutBox.Min.Y<
OutBox.Max.Y<
0)||(OutBox.Min.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,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(PlayerReplicationInfo.Team);
if(UDKRTSTeamInfo!
UDKRTSMobileHUD=UDKRTSMobileHUD(MyHUD);
if(UDKRTSMobileHUD!
//我们触摸的是否是一个pawn?
if(TouchEvent.Response==ETR_None&
UDKRTSTeamInfo.Pawns.Length>
0)
UDKRTSTeamInfo.Pawns.Length;
if(UDKRTSTeamInfo.Pawns[i]!
=None&
class'
UDKRTSMobileHUD'
.static.IsPointWithinBox(TouchLocation,UDKRTSTeamInfo.Pawns[i].ScreenBoundingBox)&
TouchEvents.Find('
AssociatedActor'
UDKRTSTeamInfo.Pawns[i])==INDEX_NONE)
UDKRTSTeamInfo.Pawns[i].Selected();
UDKRTSTeamInfo.Pawns[i].RegisterHUDActions(UDKRTSMobileHUD);
TouchEvent.AssociatedActor=UDKRTSTeamInfo.Pawns[i];
TouchEvent.Response=ETR_Pawn;
break;
//我们触摸的是一个结构?
UDKRTSTeamInfo.Structures.Length>
UDKRTSTeamInfo.Structures.Length;
if(class'
.static.IsPointWithinBox(TouchLocation,UDKRTSTeamInfo.Structures[i].ScreenBoundingBox)&
UDKRTSTeamInfo.Structures[i])==INDEX_NONE)
UDKRTSTeamInfo.Structures[i].Selected();
UDKRTSTeamInfo.Structures[i].RegisterHUDActions(UDKRTSMobileHUD);
TouchEvent.AssociatedActor=UDKRTSTeamInfo.Structures[i];
TouchEvent.Response=ETR_Structure;
选择结构/单元后按钮显示在HUD上的方式?
在RTS初学者工具包中,按钮被称为HUD操作。
HUD操作是在UDKRTSHUD.uc中定义的结构体。
在这个代码段中,您可以看到HUD操作只定义了贴图和一组UV坐标贴图。
将这些变量显示在虚幻编辑器中,这样就允许游戏开发者们设置这些值。
在游戏中使用其他四个变量执行其他函数,我们将会在后续内容中进行说明。
//HUD上的HUD操作
structSHUDAction
var()Texture2DTexture;
var()floatU;
var()floatV;
var()floatUL;
var()floatVL;
varEHUDActionReferenceReference;
varintIndex;
varboolPostRender;
vardelegate<
IsHUDActionActive>
IsHUDActionActiveDelegate;
};
然后,在另一个叫做SAssociatedHUDAction的结构体内使用HUD操作结构体。
这些将HUD操作的数组与actor相关联。
//HUD上与actor相关联的HUD操作
structSAssociatedHUDAction
varActorAssociatedActor;
vararray<
SHUDAction>
HUDActions;
当用户选择结构/单元(通过在移动设备版本中触摸结构/单元)的时候,在结构/单元上调用函数RegisterHUDActions()。
然后该函数会将相关HUD操作注册到HUD。
在这个代码段中,Portrait变量是SHUDAction,它可以定义在很多RTS游戏中常见的角色画像。
因此,这段代码会设置可以通知游戏其他地方如何进行这项HUD操作的参数变量,一个可以存储一些元数据和后期渲染布尔变量的索引变量(稍后进一步说明)。
只要HUD操作设置完成,就会进行注册。
UDKRTSPawn.uc
simulatedfunctionRegisterHUDActions(UDKRTSMobileHUDHUD)
localSHUDActionSendHUDAction;
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数列内进行搜索,看看是否应该将其插入到中间,进行这项