c语言跑酷小游戏代码,跑酷游戏代码

本文介绍了使用Unreal Engine 4.18.3开发的跑酷小游戏的代码实现,主要涉及游戏模式、角色行为和地板生成。代码通过C++实现,包括游戏模式类`APikaqiuThirdTestGameMode`,角色类`APikaqiuThirdTestCharacter`,以及地板和金币的生成与碰撞检测。游戏中地板由直线和左右两侧的地板组成,随机生成,并有碰撞检测功能。角色可以响应输入进行移动和旋转。
摘要由CSDN通过智能技术生成

引擎:UE4 4.18.3

代码结构

8022e9e73786330c98e206c2bc0c1cdb.png

运行图

8c9729f20f9aa836c20a634d93009465.png

PikaqiuThirdTestGameMode.h// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"

#include "GameFramework/GameModeBase.h"

#include "PikaqiuThirdTestGameMode.generated.h"

UCLASS(minimalapi)

class APikaqiuThirdTestGameMode : public AGameModeBase

{

GENERATED_BODY()

//存储直线的地板

UPROPERTY()

TArray> pikaMidArr;

//存储左右的地板

UPROPERTY()

TArray> pikaLRArr;

public:

APikaqiuThirdTestGameMode();

virtual void BeginPlay() override;

//添加地板

void PikaAddFloor();

//打印测试

void PikaPirnt(FString piksStr);

TSubclassOf pikaNewFloor;

FTransform pikaNextTransforms;

//获取随机的地板

TSubclassOf PikaRandomInputFloor();

//将UI界面加载到屏幕上

void PikaUIAddToScreen();

//UI实例变量

UUserWidget *PikaMainUI;

TSubclassOf PikaUIMainInstance;

//确定金币的生成方向X轴或Y轴

//1:X轴负方向 2:Y轴负方向 3:X轴正方向 4:Y轴正方向

//LEFT -1 RIGHT +1

int32 IsX;

};

PikaqiuThirdTestGameMode.cpp// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#include "PikaqiuThirdTestGameMode.h"

#include "PikaqiuThirdTestCharacter.h"

#include "UObject/ConstructorHelpers.h"

#include "PikaFloor.h"

#include "PikaMainUI.h"

#include "Engine.h"

#include "PikaGameStateBase.h"

APikaqiuThirdTestGameMode::APikaqiuThirdTestGameMode()

{

// set default pawn class to our Blueprinted character

static ConstructorHelpers::FClassFinder PlayerPawnBPClass(TEXT("/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter"));

if (PlayerPawnBPClass.Class != NULL)

{

DefaultPawnClass = PlayerPawnBPClass.Class;

}

//初始化容器

pikaMidArr.Empty();

pikaLRArr.Empty();

//获取蓝图中的直线地板

TSubclassOf pikaFloorBP01 = LoadClass(NULL , TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP01.PikaFloorBP01_C'"));

pikaMidArr.Add(pikaFloorBP01);

TSubclassOf pikaFloorBP02 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP02.PikaFloorBP02_C'"));

pikaMidArr.Add(pikaFloorBP02);

TSubclassOf pikaFloorBP03 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP03.PikaFloorBP03_C'"));

pikaMidArr.Add(pikaFloorBP03);

//获取蓝图中的上下地板

TSubclassOf pikaFloorBP04 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP04.PikaFloorBP04_C'"));

pikaMidArr.Add(pikaFloorBP04);

TSubclassOf pikaFloorBP05 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP05.PikaFloorBP05_C'"));

pikaMidArr.Add(pikaFloorBP05);

//获取蓝图中的左右地板

TSubclassOf pikaFloorBP06 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP06.PikaFloorBP06_C'"));

pikaLRArr.Add(pikaFloorBP06);

TSubclassOf pikaFloorBP07 = LoadClass(NULL, TEXT("Blueprint'/Game/Floor/BP/PikaFloorBP07.PikaFloorBP07_C'"));

pikaLRArr.Add(pikaFloorBP07);

//获取自定义的UI类实例

static ConstructorHelpers::FClassFinder PikaWidget(TEXT("/Game/UMG/PikaMainUI"));

PikaUIMainInstance = PikaWidget.Class;

//加载我们的GameState

GameStateClass = APikaGameStateBase::StaticClass();

IsX = 1;

}

void APikaqiuThirdTestGameMode::BeginPlay()

{

Super::BeginPlay();

if (GetWorld())

{

for (int32 i=0 ; i<10 ; i++)

{

PikaAddFloor();

}

}

//将UI界面加载到屏幕上

PikaUIAddToScreen();

}

void APikaqiuThirdTestGameMode::PikaAddFloor()

{

pikaNewFloor = PikaRandomInputFloor();

if (pikaNewFloor != NULL)

{

FVector const pikaLoction = pikaNextTransforms.GetLocation();

FRotator pikaRotation(pikaNextTransforms.Rotator());

//在场景中放入地板

APikaFloor *pikaFloor = GetWorld()->SpawnActor(pikaNewFloor, pikaLoction, pikaRotation);

//记录当前地板的位置,做为下一个生成的地板的初始位置

pikaNextTransforms = pikaFloor->PikaGetAttachToTransform();

//PikaPirnt(pikaNextTransforms.ToString());

}

}

void APikaqiuThirdTestGameMode::PikaPirnt(FString piksStr)

{

if (GEngine)

{

GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, piksStr);

}

}

//获取随机的地板

TSubclassOf APikaqiuThirdTestGameMode::PikaRandomInputFloor()

{

//return pikaMidArr[2];

int32 pikaRandom = FMath::RandRange(1, 100);

//生成直线地板(包括上下地板)的概率

int32 pikaProbMid = 60;

if (pikaRandom <= pikaProbMid)

{

//生成直线地板

int32 pikaSumMidArr = pikaMidArr.Num();

if (pikaSumMidArr)

{

//组数开始的下标为0

int32 pikaIndexMid = FMath::RandRange(0, pikaSumMidArr - 1);

return pikaMidArr[pikaIndexMid];

}

}

else

{

//生成左右地板

int32 pikaSumLRArr = pikaLRArr.Num();

if (pikaSumLRArr)

{

int32 pikaIndexLR = FMath::RandRange(0, pikaSumLRArr - 1);

return pikaLRArr[pikaIndexLR];

}

}

return NULL;

}

//将UI界面加载到屏幕上PikaMainUI

void APikaqiuThirdTestGameMode::PikaUIAddToScreen()

{

if (PikaUIMainInstance)

{

if (GetWorld())

{

PikaMainUI = CreateWidget(GetWorld(), PikaUIMainInstance);

if (PikaMainUI)

{

PikaMainUI->AddToViewport();

UPikaMainUI *PikaMain = Cast(PikaMainUI);

if (PikaMain)

{

//初始化金币数和步数

PikaMain->pikaCoinNum = FText::FromString(TEXT("0"));

PikaMain->pikaCharacterDistance = FText::FromString(TEXT("0"));

}

}

}

}

}

PikaqiuThirdTestCharacter.h// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"

#include "GameFramework/Character.h"

#include "PikaqiuThirdTestCharacter.generated.h"

UCLASS(config = Game)

class APikaqiuThirdTestCharacter : public ACharacter

{

GENERATED_BODY()

/** Camera boom positioning the camera behind the character */

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))

class USpringArmComponent* CameraBoom;

/** Follow camera */

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))

class UCameraComponent* FollowCamera;

public:

APikaqiuThirdTestCharacter();

/** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)

float BaseTurnRate;

/** Base look up/down rate, in deg/sec. Other scaling may affect final rate. */

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera)

float BaseLookUpRate;

protected:

/** Resets HMD orientation in VR. */

void OnResetVR();

/** Called for forwards/backward input */

void MoveForward(float Value);

/** Called for side to side input */

void MoveRight(float Value);

/**

* Called via input to turn at a given rate.

* @param Rate    This is a normalized rate, i.e. 1.0 means 100% of desired turn rate

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值