Пилим платформер на UE4 - часть 8 (C++)
Делаем летающую платформу, используя C++ вместо блюпринтов. Платформа умеет летать между набором фиксированных точек, замирая на каждой на указанный интервал времени.
Исходники из видео
CPP:
#include "FloatPlatform.h"
#include <EngineGlobals.h>
#include <Runtime/Engine/Classes/Engine/Engine.h>
FVector spos;
FVector cpos;
FVector tpos;
FVector k;
int32 cpoint=0;
int32 tpoint = 1;
float pointtimer = 0;
// Sets default values
AFloatPlatform::AFloatPlatform()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
}
// Called when the game starts or when spawned
void AFloatPlatform::BeginPlay()
{
Super::BeginPlay();
if (lpts > 1)
{
cpoint = 0;
tpoint = 1;
cpos = points[cpoint];
SetActorLocation(cpos);
spos = cpos;
tpos = DefTPOS(tpoint);
}
}
// Called every frame
void AFloatPlatform::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
MovePlatf(DeltaTime);
}
void AFloatPlatform::MovePlatf(float dt)
{
int32 ckx;
int32 ckz;
cpos = GetActorLocation();
//вектор дистанции
FVector dv = tpos - spos;
float dst=FMath::Abs(dv.FVector::Size());
//коэффициент направления по Х
if (tpos.X > cpos.X)
{
ckx = 1;
}
else
{
ckx = -1;
}
k.X = (FMath::Abs(dv.X)*ckx) / dst;
GEngine->AddOnScreenDebugMessage(-1, 0.01f, FColor::Red, FString::Printf(TEXT("ckx=%d; kx=%f; dvX=%f"), ckx, k.X,dv.X));
//у нас 2д игра, нет движения по У
k.Y = 0;
//то же для Z
if (tpos.Z > cpos.Z)
{
ckz = 1;
}
else
{
ckz = -1;
}
k.Z = (FMath::Abs(dv.Z)*ckz) / dst;
//собственно движение
if (pointtimer <= 0)
{
cpos += k * spd*dt;
}
else
{
pointtimer -= dt;
}
//расстояние от текущей точки до активной цели
float dd = (tpos - cpos).FVector::Size();
//если платформа возле точки
if (dd <= (spd * dt * 2))
{
//смещаемся на точку вперед
cpoint++;
tpoint++;
//если дошли до номинального конца массива точек, съезжаем на начало
if (cpoint > (lpts - 1))
{
cpoint = 0;
}
if (tpoint > (lpts - 1))
{
tpoint = 0;
}
spos = cpos;
tpos = DefTPOS(tpoint);
//принудительно помещаем платформу на заданную точку
cpos = DefTPOS(cpoint);
pointtimer = pointtime;
}
SetActorLocation(cpos,true);
if (GEngine) {
GEngine->AddOnScreenDebugMessage(-1, 0.01f, FColor::Yellow, FString::Printf(TEXT("cp=%d; tp=%d; dd=%f"), cpoint, tpoint, dd));
}
}
FVector AFloatPlatform::DefTPOS(int32 pnt)
{
return points[pnt];
}
H:
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "FloatPlatform.generated.h"
UCLASS()
class GENEPRINCESS_API AFloatPlatform : public AActor
{
GENERATED_BODY()
public:
AFloatPlatform();
protected:
//объявления функций
virtual void BeginPlay() override;
void MovePlatf(float dt);
FVector DefTPOS(int32 pnt);
//объявления свойств
UPROPERTY(EditAnywhere)
float spd = 250;
UPROPERTY(EditAnywhere)
float lpts = 2;
UPROPERTY(EditAnywhere)
float pointtime = 1;
UPROPERTY(EditAnywhere)
TArray <FVector> points;
//основные переменные
FVector spos;
FVector cpos;
FVector tpos;
FVector k;
int32 cpoint;
int32 tpoint;
float pointtimer;
public:
// Тик
virtual void Tick(float DeltaTime) override;
};
Смотрите также:
Комментарии
Дарин, наконец-то добрался до просмотра! Вступление огонь! вот только звук речи очень тихий, приходится вслушиваться. С 10 минуту чуть получше стало со звуком.
В целом годно, спасибо за материал!)


<a href= http://mosros.flybb.ru/viewtopic.php?f=2&t=635>Процесс получения диплома стоматолога: реально ли это сделать быстро?</a>