智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

[UE4][Canvas]用C++代码绘制血条(HealthBar)

Posted on   Bill Yuan  阅读(1716)  评论(0编辑  收藏  举报

转自:http://aigo.iteye.com/blog/2275110

参考自Epic官方项目StrategyGame

血条效果:

 

StrategyHUD.h

复制代码
/**   
 * Draws health bar for specific actor.  
 *  
 * @param   ForActor    Actor for which the health bar is for.  
 * @param   HealthPct   Current Health percentage.  
 * @param   BarHeight   Height of the health bar  
 * @param   OffsetY     Y Offset of the health bar.  
 */    
void DrawHealthBar(AActor* ForActor, float HealthPct, int32 BarHeight, int OffsetY = 0) const;  
复制代码

 

StrategyHUD.cpp

复制代码
void AStrategyHUD::DrawHealthBar(AActor* ForActor, float HealthPercentage, int32 BarHeight, int32 OffsetY) const    
{    
    FBox BB = ForActor->GetComponentsBoundingBox();    
    FVector Center = BB.GetCenter();    
    FVector Extent = BB.GetExtent();    
    FVector2D Center2D = FVector2D(Canvas->Project(FVector(Center.X,Center.Y,Center.Z + Extent.Z)));    
    float ActorExtent = 40;    
    if (Cast<APawn>(ForActor) != NULL)    
    {    
        AStrategyChar* StrategyChar = Cast<AStrategyChar>(ForActor);    
        if( ( StrategyChar != NULL ) && ( StrategyChar->GetCapsuleComponent() != NULL ) )    
        {    
            ActorExtent = StrategyChar->GetCapsuleComponent()->GetScaledCapsuleRadius();    
        }    
    }    
    else if (Cast<AStrategyBuilding>(ForActor) != NULL)    
    {    
        Center2D = FVector2D(Canvas->Project(ForActor->GetActorLocation()));    
        ActorExtent = 60;    
    }    
    
    FVector Pos1 = Canvas->Project(FVector(Center.X,Center.Y - ActorExtent*2, Center.Z + Extent.Z));    
    FVector Pos2 = Canvas->Project(FVector(Center.X,Center.Y + ActorExtent*2, Center.Z + Extent.Z));    
    float HealthBarLength = (Pos2-Pos1).Size2D();    
    
    AStrategyPlayerController* MyPC = GetPlayerController();    
    IStrategyTeamInterface* ActorTeam = Cast<IStrategyTeamInterface>(ForActor);    
    UTexture2D* HealthBarTexture = EnemyTeamHPTexture;    
    
    if (ActorTeam != NULL && MyPC != NULL && ActorTeam->GetTeamNum() == MyPC->GetTeamNum())    
    {    
        HealthBarTexture = PlayerTeamHPTexture;    
    }     
    float X = Center2D.X - HealthBarLength/2;    
    float Y = Center2D.Y + OffsetY;    
    FCanvasTileItem TileItem( FVector2D( X, Y ), HealthBarTexture->Resource, FVector2D( HealthBarLength * HealthPercentage,  BarHeight ), FLinearColor::White );    
    TileItem.BlendMode = SE_BLEND_Translucent;    
    TileItem.UV1 = FVector2D(HealthPercentage, 1.0f);    
    
    Canvas->DrawItem( TileItem );    
    //Fill the rest of health with gray gradient texture    
    X = Center2D.X-HealthBarLength/2 + HealthBarLength * HealthPercentage;    
    Y = Center2D.Y + OffsetY;    
    TileItem.Position = FVector2D( X, Y );    
    TileItem.Texture = BarFillTexture->Resource;    
    TileItem.UV1 = FVector2D(1.0f, 1.0f);    
    TileItem.Size = FVector2D( HealthBarLength * (1.0f - HealthPercentage), BarHeight );    
    TileItem.SetColor(FLinearColor(0.5f, 0.5f, 0.5f, 0.5f));    
    Canvas->DrawItem( TileItem );        
}    
复制代码

 

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2010-10-25 Web服务
点击右上角即可分享
微信分享提示