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

C++游戏开发之旅 23

问题概述

现在我们已经实现了完整的移动系统,但是游戏手感上还是有缺陷的,玩家操作的时候会遇到某些问题。

最直接的就是,在进行平台跳跃的时候,我们跳跃判定是很严格的,比如只有在Idle、walk状态下进行,还有就是在平台边缘极限跳跃的时候,感觉明明按下跳跃了,但是依然失败了。

其次,玩家在下斜坡的时候,因为没有接触到地面,状态会有一个断续的改变,角色似乎在抖动;

还有就是玩家无敌状态下不知道持续到什么时候结束,缺少视觉反馈。

解决方案:游戏手感优化

土狼时间(Coyote Time): 允许玩家在离地后短暂时间内仍然可以跳跃

为了解决玩家在下斜坡时候状态一直切换的问题,我们需要更严格的判断,在从Idle和Walk状态进入Fall时,需要满足土狼时间超时 && 离地

无敌闪烁:添加一个计时器

1.添加土狼时间

我们需要在player_component.h中定义土狼时间和计时器。

// 土狼时间
static constexpr float coyote_time_ = 0.15f;
float coyote_timer_ = 0.0f;bool is_on_ground() const;// player_component.cpp
bool PlayerComponent::is_on_ground() const
{return coyote_timer_ < coyote_time_ || physics_component_->hasCollidedBelow();
}

这里会新增一个函数is_on_ground(),只有当超过土狼时间并且物理组件不和下边缘进行碰撞的情况下,才判定为离开地面

当然,在player_component中的update需要累加土狼时间。

void PlayerComponent::update(float dt, engine::core::Context &context)
{// 如果离开地面,土狼时间开始计时,一段时间后才表示离开地面if(!physics_component_->hasCollidedBelow()){coyote_timer_ += dt;} else { // 如果接触地面,土狼时间重置coyote_timer_ = 0;}if(!current_state_) return;auto new_state = current_state_->update(dt, context);if(new_state){changeState(std::move(new_state));}
}

设置完后,我们需要对Idle和Walk两个状态中的update进行修改,将原来的判断player_component_->getPhysicsComponent()->hasCollidedBelow()改为判断is_on_ground()

if(!player_component_->is_on_ground()){  // 没有和下方发生碰撞,则进入下落状态return std::make_unique<FallState>(player_component_);
}

这样我们就解决了玩家下斜坡状态抖动的问题,以及边缘极限跳跃失败的问题。

2.无敌闪烁

我们需要定义无敌闪烁时间以及计时器

// 无敌闪烁
static constexpr float flash_interval_ = 0.1f;
float flash_timer_ = 0.0f;

我们是通过不断设置精灵组件中的是否显示来实现闪烁效果的,整体比较简单。

void PlayerComponent::update(float dt, engine::core::Context &context)
{// 如果离开地面,土狼时间开始计时,一段时间后才表示离开地面if(!physics_component_->hasCollidedBelow()){coyote_timer_ += dt;} else { // 如果接触地面,土狼时间重置coyote_timer_ = 0;}// 如果无敌, 则闪烁if(health_component_->isInvincible()){flash_timer_ += dt;// 这里定义了一个周期0.2sif(flash_timer_ > flash_interval_ * 2){flash_timer_ -= flash_interval_ * 2;}// 在半个周期内闪烁, 如果小于半个周期, 则隐藏, 否则显示if(flash_timer_ < flash_interval_){sprite_component_->setHidden(true);} else {sprite_component_->setHidden(false);}} else { // 如果不在无敌状态, 则显示sprite_component_->setHidden(false);}if(!current_state_) return;auto new_state = current_state_->update(dt, context);if(new_state){changeState(std::move(new_state));}
}

我们定义了一个周期,为0.2s,当计时器小于半个周期,则隐藏,大于则显示;超过一个周期则重置。当然如果当前角色不在无敌时间内,需要保证其显示。这样1s内有5个周期,会闪烁5次。

编译运行

游戏手感好了许多。

http://www.jsqmd.com/news/436740/

相关文章:

  • gorm save 修改时非空字段不保存!
  • P12742 [POI 2016 R3] 信使 Messenger
  • 从0到1吃透Agent、MCP、Skills的关系!
  • 京东e卡回收新思路,解锁变现新姿势 - 京顺回收
  • ComPDF的产品升级:从工具包到PDF服务 - 实践
  • 2026年3月连斗式提升机厂家最新推荐,连续上料效率更高 - 品牌鉴赏师
  • 2026年3月仿大理石板材设备厂家推荐,行业权威盘点与品质红榜发布 - 品牌鉴赏师
  • 第一类斯特林数列
  • 2026年工程铺路钢板出租,优质厂家助力项目,工地施工钢板出租/临时道路钢板出租,工程铺路钢板出租厂家哪个好 - 品牌推荐师
  • 2026年中国露点仪市场白皮书:知名厂家推荐与高精度监测技术深度对标
  • 2026年3月管道涂塑设备厂家推荐,行业测评与采购选择指南 - 品牌鉴赏师
  • 2026年3月钢管粉末喷涂设备厂家最新推荐,粉末涂装技术实力优选 - 品牌鉴赏师
  • 2025年12月GESP真题及题解(C++七级): 选择题和判断题(题解)
  • 站内Geo优化SOP:专家于磊“两大核心+四轮驱动”实战指南
  • 大模型(LLMs)从入门到精通:涵盖基础、进阶、微调、LangChain及参数高效微调全解析!
  • 2026年3月太原优质搬家公司口碑推荐榜:搬厂、居民搬家、单位搬家、长短途搬家选择指南,老兵搬家深耕太原本土,守护每段搬迁路 - 海棠依旧大
  • 大模型横评:GPT、Claude、Gemini、Llama及国产模型优劣与选型指南!
  • 2026年3月PVC管材设备厂家推荐,行业权威盘点与品质红榜发布 - 品牌鉴赏师
  • 为什么链表排序要使用归并排序?
  • 深耕太原本土!2026年3月太原搬家公司口碑榜:搬厂、居民搬家、单位搬家、长短途搬家选择指南,老兵搬家一站式服务破解搬迁难题 - 海棠依旧大
  • 2026年3月混凝土增强纤维丝拉丝机厂家推荐,行业权威盘点与品质红榜发布 - 品牌鉴赏师
  • 用Agentic AI改造智能客服:提示工程架构师的5个实战技巧
  • MAUI库推荐五:Maui.PDFView
  • 2026北京液冷超充厂家推荐榜单:全液冷超充/浸没式液冷超充/大功率超充/超级充电站/超充设备/电动汽车超充,专业实力赋能新能源补能升级 - 海棠依旧大
  • 为什么要用深拷贝
  • 2026年3月端午礼品厂家最新推荐,节日礼盒定制实力供应商 - 品牌鉴赏师
  • 2026年3月苏州本地代理记账机构精选推荐:财务/财税代理记账选择指南,道之然财务打造优质服务标杆 - 海棠依旧大
  • 从AlphaZero原理到多智能体自主软件开发:理想蓝图与现实进路
  • 2026年山东真空泵厂家Top5推荐:不锈钢真空泵、水环真空泵、真空泵出口、真空负压泵站厂家选择专注实干型小厂优选榜单 - 海棠依旧大
  • JavaScript性能优化技术全面解析:从代码分割到内存管理