当前位置: 首页 > news >正文

12c++呵呵老师【变量,定时器和事件】

1.添加一个actor类

 2.首先创建在游戏中显示的简单倒数定时器。在Countdown.h中,在类定义的末尾声明计时的变量和方法。

int32 CountdownTime;
//可渲染文本组件
UTextRenderComponent* CountdownText;
void UpdateTimerDisplay();

 记得引入相关头文件

#include "Components/TextRenderComponent.h"

3.在源文件的构造函数中,初始化可渲染的文本 组件,并将倒数时间初始化为3秒。

 //将此Actor设为逐帧调用Tick()。如无需此功能,可关闭以提高性能。
    PrimaryActorTick.bCanEverTick = false;
    CountdownText = CreateDefaultSubobject<UTextRenderComponent>(TEXT("CountdownNumber"));
    //设置对齐方式
    CountdownText->SetHorizontalAlignment(EHTA_Center);
    //设置字体大小
    CountdownText->SetWorldSize(150.0f);
    //设置根组件
    RootComponent = CountdownText;
    //初始化倒计时
    CountdownTime = 3;

4.ACountdown::UpdateTimerDisplay 应更新文本显示,以显示剩余时间。时间结束时,则显示为零

void ACountdown::UpdateTimerDisplay()
{
    CountdownText->SetText(FString::FromInt(FMath::Max(CountdownTime, 0)));
}

 5.在 Countdown.h 的类定义中添加倒数函数和控制其所需的定时器句柄。添加完成后,再添加一个函数,以便在倒数结束时执行特别操作:

void AdvanceTimer();

void CountdownHasFinished();

FTimerHandle CountdownTimerHandle;

6.初始化 ACountdown::BeginPlay 中显示的文本,并设置逐秒前进和更新倒数的定时器

UpdateTimerDisplay();
//这是一个程序内部的计时器,用来调用其他事件的
//CountdownTimerHandle:句柄
//this:本对象调用计时器
//&ACountdown::AdvanceTimer:函数指针调用函数,表示唤醒这个事件
//1.0f:每一秒唤醒一次
//true:循环执行
GetWorldTimerManager().SetTimer(CountdownTimerHandle, this, &ACountdown::AdvanceTimer, 1.0f, true);

 7.编写 ACountdown::AdvanceTimer 和 ACountdown::CountdownHasFinished 的主体

void ACountdown::AdvanceTimer()
{
    --CountdownTime;
    UpdateTimerDisplay();
    if (CountdownTime < 1)
    {
        //倒数完成,停止运行定时器。
        GetWorldTimerManager().ClearTimer(CountdownTimerHandle);
        CountdownHasFinished();
    }
}

void ACountdown::CountdownHasFinished()
{
    //改为特殊读出
    CountdownText->SetText(TEXT("GO!"));
}

=========================

现在改进一下,加入反射

1.倒数定时器目前被硬编码为使用3秒的值。如可在编辑器中将倒数时间设为想要的任何值,此操作将十分有用,也较易完成。在 Visual Studio 中,可打开 Countdown.h。UPROPERTY 支持改变虚幻引擎使用变量方式的参数。需将变量设为可编辑,因此可添加 EditAnywhere 参数

UPROPERTY(EditAnywhere)
int CountdownTime;

2.编译,然后点击场景中的计时器,可以设置这个变量了

===================================

1.除改变定时器的值外,同时也使非程序员开发者可改变定时器启动时触发的操作。通过将这个函数变成 UFUNCTION,将其向虚幻引擎公开。

2.为了让非程序员调用C++函数,并用 蓝图 对其进行覆盖,需对 Countdown.h 进行以下修改。

UFUNCTION(BlueprintNativeEvent)
void CountdownHasFinished();
virtual void CountdownHasFinished_Implementation();

 BlueprintCallable 函数以C++编写,可从 蓝图图表 中调用,但只能通过编辑C++代码进行修改或重写。

在C++ header (.h)文件中设置 BlueprintImplementableEvent 函数,但是函数的主体则在蓝图图表中完成编写,而非C++中。创建此类通常是为了使非程序员能够对无预期默认动作或标准行为的特殊情况创建自定义反应。 

BlueprintNativeEvent 函数与 BlueprintCallable 和 BlueprintImplementableEvent 函数的组合类似。其具备用C++中编程的默认行为,但此类行为可通过在蓝图图表中覆盖进行补充或替换。对此类代码编程时,C++代码固定使用命名末尾添加了_Implementation的虚拟函数 (土话说:即当那啥,又立牌坊,两不误)

3.然后,在Countdown.cpp中,需对以下行进行修改:

//void ACountdown::CountdownHasFinished()
//注释掉CountdownHasFinished()
//用下面这个
void ACountdown::CountdownHasFinished_Implementation()

 4.然后进行定义

void ACountdown::CountdownHasFinished_Implementation()
{
    //改为特殊读出
    CountdownText->SetText(TEXT("GO!"));
}

==========================================

使用蓝图扩展和覆盖C++

1. 得到一个蓝图

 2.编写蓝图

 3.测试失败,倒数被设为结束时显示GO!,而非0。由于已使用 蓝图 可视化脚本完全取代了C++功能,因此不会发生此情况。此结果并非理想结果。

4.通过右键点击 Countdown Has Finished 节点,并在快捷菜单中选择 添加对父函数的调用(Add call to parent function) 来完成。

 测试成功

 

相关文章:

  • 元宇宙地产演化史:从文本时代到区块链时代
  • Linux搭建开源企业云盘Seafile,私有文件同步云盘及基本使用
  • 【推荐系统】推荐系统基础算法-基于矩阵分解的推荐方法、隐语义模型
  • celery apply_async定时任务重复执行问题
  • 接口测试基本知识点
  • C++学习记录4
  • JSP企业内部交流系统myeclipse开发mysql数据库bs框架java编程jdbc
  • 关于获得淘宝商品评论的那些事
  • 资深工程师整理2022年最新面试题汇总
  • 打破程序员“中年危机”8年测试工程师经验之谈
  • 资深架构师必备知识:Netty+MySQL+并发+JVM+多线程
  • java移动端选课系统设计与实现服务器端计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  • hadoop historyserver启动,无法访问,查看报错等问题
  • Worthington公司刀豆蛋白A的特性及参考文献
  • 面试算法 二叉树的遍历,方法 :线索二叉树 ( morris ) ,前序遍历: 中序遍历: 后序遍历
  • 【mysql】环境安装、服务启动、密码设置
  • gops —— Go 程序诊断分析工具
  • iOS 系统授权开发
  • Javascript编码规范
  • Js基础——数据类型之Null和Undefined
  • PAT A1092
  • Redis的resp协议
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 马上搞懂 GeoJSON
  • 转载:[译] 内容加速黑科技趣谈
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #pragma 指令
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #微信小程序(布局、渲染层基础知识)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (九十四)函数和二维数组
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET 反射的使用
  • .net对接阿里云CSB服务
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @EnableWebMvc介绍和使用详细demo
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [acm算法学习] 后缀数组SA
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [C#基础]说说lock到底锁谁?
  • [ffmpeg] aac 音频编码
  • [HDU]2161Primes
  • [IE编程] 如何获得IE版本号
  • [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
  • [Oh My C++ Diary]用cout输出流保留输出小数位数的方法