网站设计范文,深圳网站建设新闻,宝安区做网站,公司网站模版 dedecms在这一篇里#xff0c;我们将实现对存档的删除功能#xff0c;在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置#xff0c;我们可以通过存档进入游戏#xff0c;玩家在游戏中可以在存档点存储存档。
实现删除存档
删除存档需要一个弹框确认#xff0…在这一篇里我们将实现对存档的删除功能在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置我们可以通过存档进入游戏玩家在游戏中可以在存档点存储存档。
实现删除存档
删除存档需要一个弹框确认防止玩家误操作所以我们需要一个弹框的用户控件。 创建一个新的蓝图基于我们之前自定义的用户空间基类。 然后添加对应的UI外层添加覆层是为了保证动态创建添加到视口时位置正确尺寸框内的组件为组成弹框的内容。 里面比较注意的点一个是边框的设置我们需要将其设置为边界然后调整边缘。 我增加了一个背景模糊保证玩家注意点只关注到弹框。 在覆层这里我们将事件修改为可视这样鼠标事件将不会传递到后面的ui上将不会参数误触的问题 下面为制作完成的效果。 接下来我们为弹框取消按钮和确认按钮绑定点击事件。
在取消时我们只需要清除自身即可 在确认时我们通过一个事件分发器外部可以绑定事件分发器的回调来绑定触发确认后的回调
增加删除功能
我们在GameMode里增加一个删除存档的函数用于删除已经存在的存档 /*** 删除存档* param SlotName 需要删除存档对应的视图模型实例名称* param SlotIndex 存档索引*/static void DeleteSlotData(const FString SlotName, int32 SlotIndex);实现就是通过函数获取存档存在就删除即可。
void ARPGGameMode::DeleteSlotData(const FString SlotName, const int32 SlotIndex)
{//检查是否有对应名称的存档if(UGameplayStatics::DoesSaveGameExist(SlotName, SlotIndex)){//删除已保存的存档UGameplayStatics::DeleteGameInSlot(SlotName, SlotIndex);}
}接着我们在加载界面的视图模型里增加一个删除存档事件用于用户控件蓝图调用 /*** 删除存档* param Slot 点击存档的位置以索引来代表*/UFUNCTION(BlueprintCallable)void DeleteButtonPressed(int32 Slot);在实现这里通过调用GameMode里的事件删除然后修改显示用户控件枚举更新对应存档UI显示的用户控件。
void UMVVM_LoadScreen::DeleteButtonPressed(const int32 Slot)
{//删除存档const ARPGGameMode* RPGGameMode CastARPGGameMode(UGameplayStatics::GetGameMode(this));RPGGameMode-DeleteSlotData(LoadSlots[Slot]-GetSlotName(), Slot);//修改用户控件显示LoadSlots[Slot]-LoadSlotStatus Vacant; //修改为创建存档LoadSlots[Slot]-InitializeSlot(); //修改存档显示
}接着我们在对应的存档用户控件里增加一个按钮用于删除存档。 在蓝图初始化回调里我们绑定删除按钮的点击事件创建一个弹框来添加到视口并监听事件分发器的事件如果在弹框选择了确认将触发删除事件我们使用添加到加载界面的视图模型的删除函数删除即可。
实现地图名称更新
在创建新存档这里我们需要实现读取到地图的名称并且地图名称需要是可以自定义的。 首先我们修改加载界面使用的GameMode的父类让其基础战斗场景使用的蓝图类这样它也会继承类里设置的数据我们只需要在父类上设置子类上也会成为默认值。 接着我们将一些不必要的类设置恢复到之前状态战斗场景使用的不必要在加载界面使用。 接着我们在c里在GameMode类里增加一些配置用于配置初始进入的地图和地图名称并增加一个映射可以增加多个地图。 这里映射使用了TSoftObjectPtr这个指针只保存路径如果不使用对应的资源不会加载到场景可以在需要时再加载。 //初始地图名称UPROPERTY(EditDefaultsOnly)FString DefaultMapName;//游戏初始地图UPROPERTY(EditDefaultsOnly)TSoftObjectPtrUWorld DefaultMap;//地图名称和地图的映射UPROPERTY(EditDefaultsOnly)TMapFString, TSoftObjectPtrUWorld Maps;然后覆写BeginPlay函数在BeginPlay里将初始地图加入到映射
protected:virtual void BeginPlay() override;void ARPGGameMode::BeginPlay()
{Super::BeginPlay();Maps.Add(DefaultMapName, DefaultMap);
}然后增加一个函数用于进入对应地图
void TravelToMap(const UMVVM_LoadSlot* Slot);我们通过UGameplayStatics::OpenLevelBySoftObjectPtr加载软引用的地图它在未使用时不会加载所以在打开时会出现卡顿。
void ARPGGameMode::TravelToMap(const UMVVM_LoadSlot* Slot)
{const FString SlotName Slot-GetSlotName();const int32 SlotIndex Slot-SlotIndex;//打开地图UGameplayStatics::OpenLevelBySoftObjectPtr(Slot, Maps.FindChecked(Slot-GetMapName()));
}接着打开蓝图我们设置初始的地图和名称。 接着我们需要在用户控件上让其自动更新名称在存档的视图模型上增加对地图名称的相关设置 接着在加载界面视图模型里在创建存档时设置 在获取存档后记得设置存档用户控件使用的视图模型的地图名称。 存档视图模型可以获取到数据我们接着增加一个函数用于进入游戏的事件调用用于打开新关卡。
void UMVVM_LoadScreen::EnterGameButtonPressed(const int32 Slot)
{ARPGGameMode* RPGGameMode CastARPGGameMode(UGameplayStatics::GetGameMode(this));RPGGameMode-TravelToMap(LoadSlots[Slot]);
}最后我们在显示存档的用户控件里绑定地图名称的显示 并绑定加载进度的点击回调调用进入关卡事件并测试即可。