Advertisement
Guest User

Untitled

a guest
Jan 9th, 2015
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.19 KB | None | 0 0
  1.  
  2.  
  3. #include "SpaceDive.h"
  4. #include "MainPawn.h"
  5. #include "AsteroidSpawn.h"
  6. #include "SpaceDivePlayerState.h"
  7. #include "HighscoresSaveGame.h"
  8.  
  9. AMainPawn::AMainPawn(const class FObjectInitializer& OI)
  10.     : Super(OI), bDragActivated(false), LastTouchPoint(0.0f, 0.0f), bPlayerDied(false), PlayerLifesAtMultiplier(0), bUseMotionControl(false)
  11. {
  12.     // Subobject creation
  13.     MainCamera = OI.CreateDefaultSubobject<UCameraComponent>(this, TEXT("MainCamera"));
  14.     CameraCapsule = OI.CreateDefaultSubobject<UCapsuleComponent>(this, TEXT("CameraCapsule"));
  15.     MultiplierSphere = OI.CreateDefaultSubobject<USphereComponent>(this, TEXT("MultiplierSphere"));
  16.     InnerPointSphere = OI.CreateDefaultSubobject<USphereComponent>(this, TEXT("InnerPointSphere"));
  17.     OuterPointSphere = OI.CreateDefaultSubobject<USphereComponent>(this, TEXT("OuterPointSphere"));
  18.  
  19.     CameraCapsule->AddRelativeRotation(FRotator(0.f, 90.f, 0.f));
  20.  
  21.     // Event subscription
  22.     CameraCapsule->OnComponentBeginOverlap.AddDynamic(this, &AMainPawn::OnCollide);
  23.     MultiplierSphere->OnComponentBeginOverlap.AddDynamic(this, &AMainPawn::OnMultiplierCollide);
  24.     InnerPointSphere->OnComponentBeginOverlap.AddDynamic(this, &AMainPawn::OnInnerPointSphereCollide);
  25.     OuterPointSphere->OnComponentBeginOverlap.AddDynamic(this, &AMainPawn::OnOuterPointSphereCollide);
  26.  
  27.     // Creating the object hierarchy
  28.     RootComponent = MainCamera;
  29.     CameraCapsule->AttachTo(MainCamera);
  30.     MultiplierSphere->AttachTo(MainCamera);
  31.     InnerPointSphere->AttachTo(MainCamera);
  32.     OuterPointSphere->AttachTo(MainCamera);
  33.  
  34.    
  35. }
  36.  
  37. void AMainPawn::SetupCapsule()
  38. {
  39.     NearPlaneHeight = 2 * 10.0f * FMath::Tan(FMath::DegreesToRadians(MainCamera->FieldOfView / 2));
  40.     NearPlaneWidth = MainCamera->AspectRatio * NearPlaneHeight;
  41.  
  42.     for (TActorIterator<AAsteroidSpawn> Itr(GetWorld()); Itr; ++Itr)
  43.     {
  44.         CameraBoundsWidth = Itr->GetActorScale3D().Y * 0.75f * 0.5f;
  45.         CameraBoundsHeight = Itr->GetActorScale3D().Z * 0.75f * 0.5f;
  46.     }
  47.  
  48.     const float Area = NearPlaneWidth * NearPlaneHeight;
  49.     const float CollisionArea = Area / 9.0f;
  50.  
  51.     const float Radius = FMath::Sqrt(CollisionArea / PI);
  52.  
  53.    
  54.     CameraCapsule->SetCapsuleSize(Radius, 0.01f);
  55.  
  56. }
  57.  
  58. void AMainPawn::SetupMultiplierSphere()
  59. {
  60.     const float Area = NearPlaneWidth * NearPlaneHeight;           
  61.     const float HelperArea = Area / MultiplierSphereDivider;
  62.     const float Radius = FMath::Sqrt(HelperArea / PI);
  63.     MultiplierSphere->SetSphereRadius(Radius);
  64.     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, FString::SanitizeFloat(Radius));
  65. }
  66.  
  67. void AMainPawn::SetupInnerPointSphere()
  68. {
  69.     const float Area = NearPlaneWidth * NearPlaneHeight;
  70.     const float HelperArea = Area / InnerPointSphereDivider;
  71.     const float Radius = FMath::Sqrt(HelperArea / PI);
  72.     InnerPointSphere->SetSphereRadius(Radius);
  73.     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, FString::SanitizeFloat(Radius));
  74. }
  75.  
  76. void AMainPawn::SetupOuterPointSphere()
  77. {
  78.     const float Area = NearPlaneWidth * NearPlaneHeight;
  79.     const float HelperArea = Area / OuterPointSphereDivider;
  80.     const float Radius = FMath::Sqrt(HelperArea / PI);
  81.     OuterPointSphere->SetSphereRadius(Radius);
  82.     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, FString::SanitizeFloat(Radius));
  83. }
  84.  
  85. void AMainPawn::Tick(float Delta)
  86. {
  87.     Super::Tick(Delta);
  88.  
  89.     if (bUseMotionControl)
  90.     {
  91.         TickMotionInput(Delta);
  92.     }
  93.     else
  94.     {
  95.         TickTouchInput(Delta);
  96.     }
  97.     TickPlayerMovement(Delta);
  98.     TickCameraRoll(Delta);
  99.    
  100.  
  101.     /*DrawDebugSphere(GetWorld(), MultiplierSphere->GetComponentLocation(), MultiplierSphere->GetScaledSphereRadius(), 32, FColor::Blue);
  102.     DrawDebugSphere(GetWorld(), InnerPointSphere->GetComponentLocation(), InnerPointSphere->GetScaledSphereRadius(), 32, FColor::Red);
  103.     DrawDebugSphere(GetWorld(), OuterPointSphere->GetComponentLocation(), OuterPointSphere->GetScaledSphereRadius(), 32, FColor::Yellow);
  104.     DrawDebugCapsule(GetWorld(), CameraCapsule->GetComponentLocation(), CameraCapsule->GetScaledCapsuleHalfHeight(), CameraCapsule->GetScaledCapsuleRadius(), CameraCapsule->GetComponentRotation().Quaternion(), FColor::Green); */
  105. }
  106.  
  107. void AMainPawn::TickPlayerMovement(float Delta)
  108. {
  109.     // Move player
  110.     FVector NewLoc = FVector(0.0f, MoveRightVal * FMath::Abs(MovementSpeedFactor) * Delta, MoveUpVal * MovementSpeedFactor * Delta);
  111.     this->AddActorLocalOffset(NewLoc, true);
  112.  
  113.     // Ensure, that player is in the camera bounds
  114.     NewLoc = this->GetActorLocation();
  115.     NewLoc.Y = FMath::Clamp<float>(NewLoc.Y, 0.0f - CameraBoundsWidth, 0.0f + CameraBoundsWidth);
  116.     NewLoc.Z = FMath::Clamp<float>(NewLoc.Z, 0.0f - CameraBoundsHeight, 0.0f + CameraBoundsHeight);
  117.     this->SetActorLocation(NewLoc);
  118. }
  119.  
  120. void AMainPawn::TickTouchInput(float Delta)
  121. {
  122.     if (!bPlayerDied && bDragActivated)
  123.     {
  124.         const float FactorWeight = 0.2000;
  125.        
  126.         APlayerController* const PC = Cast<APlayerController>(GetController());
  127.         check(PC);
  128.  
  129.         float LocationX;
  130.         float LocationY;
  131.         bool bPressed;
  132.  
  133.         PC->GetInputTouchState(ETouchIndex::Touch1, LocationX, LocationY, bPressed);
  134.         const FVector2D TouchLoc(LocationX, LocationY);
  135.  
  136.         const FVector2D DeltaTouch((TouchLoc - LastTouchPoint) *  FactorWeight);
  137.         MoveRightVal = DeltaTouch.X;
  138.         MoveUpVal = DeltaTouch.Y;
  139.  
  140.         LastTouchPoint = TouchLoc;
  141.        
  142.     }
  143. }
  144.  
  145. void AMainPawn::TickCameraRoll(float Delta)
  146. {
  147.     const FRotator NewRot(0.0f, 0.0f, RollRotationRate * Delta);
  148.     GetController()->SetControlRotation(NewRot + GetControlRotation());
  149. }
  150.  
  151. void AMainPawn::TickMotionInput(float Delta)
  152. {
  153.     APlayerController* const PC = Cast<APlayerController>(Controller);
  154.  
  155.     FVector Tilt;
  156.     FVector RotationRate;
  157.     FVector Gravity;
  158.     FVector Acceleration;
  159.  
  160.     PC->GetInputMotionState(Tilt, RotationRate, Gravity, Acceleration);
  161.  
  162.     /*
  163.     if (GEngine)
  164.     {
  165.         GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Green, Tilt.ToString());
  166.         GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Yellow, RotationRate.ToString());
  167.         GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Red, Gravity.ToString());
  168.         GEngine->AddOnScreenDebugMessage(-1, 1.f, FColor::Blue, Acceleration.ToString());
  169.     }
  170.     */
  171.  
  172.     // The "normal" tilt value, so where the deadzone is
  173.     const float TiltNormal = 2.0f;
  174.     // The half width of the dead zone (1 to each side)
  175.     const float TiltTolerance = 0.1f;
  176.     // The "normal" gravity value, so the deadzone
  177.     const float GravityYNormal = 0.0f;
  178.     // The half width of the deadzone (1 to each side)
  179.     const float GravityYTolerance = 0.5f;
  180.    
  181.     // Tilt max and min values, that can occur
  182.     const float TiltMax = 3.0f;
  183.     const float TiltMin = 0.0f;
  184.     // Gravity max and min value, that can occur
  185.     const float GravityYMin = -10.0f;
  186.     const float GravityYMax = 10.0f;
  187.    
  188.     // Motion scaling factor
  189.     const float MotionFactor = 10.0f;
  190.  
  191.     float TiltOffset = ((TiltMax - TiltMin) / 2) - TiltMax; // So the middle is on 0.0f
  192.  
  193.     MoveUpVal = MotionFactor * -(Tilt.Z + TiltOffset) / ((TiltMax - TiltMin) / 2); // Divide by the last part to clamp between 0 and 1
  194.  
  195.     MoveRightVal = MotionFactor * Gravity.Y / ((GravityYMax - GravityYMin) / 2); // Same as above without offset
  196.  
  197.     // DEADZONES
  198.  
  199.     if ((Tilt.Z <= TiltNormal + TiltTolerance) && (Tilt.Z >= TiltNormal - TiltTolerance))
  200.     {
  201.         MoveUpVal = 0.0f;
  202.     }
  203.  
  204.     if ((Gravity.Y <= GravityYNormal + GravityYTolerance) && (Gravity.Y >= GravityYNormal - GravityYTolerance))
  205.     {
  206.         MoveRightVal = 0.0f;
  207.     }
  208. }
  209.  
  210. void AMainPawn::BeginPlay()
  211. {
  212.     Super::BeginPlay();
  213.  
  214.     SetupCapsule();
  215.     SetupMultiplierSphere();
  216.     SetupInnerPointSphere();
  217.     SetupOuterPointSphere();
  218.     SetupMusic();
  219.  
  220.     Cast<ASpaceDivePlayerState>(PlayerState)->PlayerLifes = InitialPlayerLifes;
  221.  
  222.     GetController()->SetControlRotation(FRotator(0.0f, 0.0f, -85.0f));
  223. }
  224.  
  225. void AMainPawn::SetupMusic()
  226. {
  227.     ASpaceDivePlayerState* const State = Cast<ASpaceDivePlayerState>(PlayerState);
  228.     const int SoundIndex = FMath::RandRange(0, MusicList.Num() - 1);
  229.     USoundBase* const SoundToPlay = MusicList[SoundIndex];
  230.  
  231.     check(SoundToPlay);
  232.  
  233.     UGameplayStatics::PlaySoundAttached(SoundToPlay, MainCamera);
  234.    
  235. }
  236.  
  237. void AMainPawn::SetupPlayerInputComponent(UInputComponent* InputComponent)
  238. {
  239.     InputComponent->BindAxis("MoveUp", this, &AMainPawn::MoveUp);
  240.     InputComponent->BindAxis("MoveRight", this, &AMainPawn::MoveRight);
  241. }
  242.  
  243. void AMainPawn::MoveUp(float Val)
  244. {
  245.     MoveUpVal = Val;
  246. }
  247.  
  248. void AMainPawn::MoveRight(float Val)
  249. {
  250.     MoveRightVal = Val;
  251. }
  252.  
  253. void AMainPawn::OnPlayerTouch(bool bTouch)
  254. {
  255.     bDragActivated = bTouch;
  256.    
  257.     APlayerController* const Controller = Cast<APlayerController>(GetController());
  258.     check(Controller);
  259.  
  260.     float LocationX;
  261.     float LocationY;
  262.     bool bIsPressed;
  263.  
  264.     Controller->GetInputTouchState(ETouchIndex::Touch1, LocationX, LocationY, bIsPressed);
  265.     LastTouchPoint = FVector2D(LocationX, LocationY);
  266. }
  267.  
  268.  
  269. void AMainPawn::OnCollide(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bSweep, const FHitResult& SweepResult)
  270. {  
  271.     OnHit();
  272.     OtherActor->Destroy();
  273.     Cast<ASpaceDivePlayerState>(PlayerState)->ResetMultiplier();
  274. }
  275.  
  276. void AMainPawn::OnMultiplierCollide(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bSweep, const FHitResult& SweepResult)
  277. {
  278.     MultiplierCollides();
  279.     //GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, "Multiplier");
  280.     PlayerLifesAtMultiplier = (Cast<ASpaceDivePlayerState>(PlayerState))->PlayerLifes;
  281.     GetWorldTimerManager().SetTimer(this, &AMainPawn::OnMultiplierDelayEnds, 0.25f, false);
  282. }
  283.  
  284. void AMainPawn::OnMultiplierDelayEnds()
  285. {
  286.     ASpaceDivePlayerState* const SDPlayerState = Cast<ASpaceDivePlayerState>(PlayerState);
  287.     check(SDPlayerState);
  288.  
  289.     if (SDPlayerState->PlayerLifes == PlayerLifesAtMultiplier)
  290.     {
  291.         check(MultiplierSound);
  292.         SDPlayerState->IncreaseMultiplier();
  293.         UGameplayStatics::PlaySoundAtLocation(GetWorld(), MultiplierSound, FVector(0.0f, 0.0f, 0.0f));
  294.     }
  295. }
  296.  
  297. void AMainPawn::OnInnerPointSphereCollide(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bSweep, const FHitResult& SweepResult)
  298. {
  299.     AddPlayerPoints(InnerPointSpherePoints);
  300.     //GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, "Point");
  301. }
  302.  
  303. void AMainPawn::OnOuterPointSphereCollide(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bSweep, const FHitResult& SweepResult)
  304. {
  305.     AddPlayerPoints(OuterPointSpherePoints);
  306.     //GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, "Less Points");
  307. }
  308.  
  309. void AMainPawn::AddPlayerPoints(float Points)
  310. {
  311.     if (PlayerState)
  312.     PlayerState->Score += Points * Cast<ASpaceDivePlayerState>(PlayerState)->Multiplier;
  313. }
  314.  
  315. void AMainPawn::OnHit()
  316. {
  317.     PlayerHitEvent.Broadcast();
  318.  
  319.     ASpaceDivePlayerState* LocalPlayerState = Cast<ASpaceDivePlayerState>(PlayerState);
  320.  
  321.     PlayerHitsAsteroid();
  322.     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, "Hit");
  323.     (LocalPlayerState->PlayerLifes)--;
  324.     if (LocalPlayerState->PlayerLifes == 0)
  325.     {
  326.         GameOver();
  327.     }
  328. }
  329.  
  330. void AMainPawn::GameOver()
  331. {
  332.  
  333.     SaveScore();
  334.     bPlayerDied = true;
  335.     PlayerDies();
  336.     GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, "Game Over");
  337.     GameOverEvent.Broadcast();
  338. }
  339.  
  340. void AMainPawn::SaveScore()
  341. {
  342.     UHighscoresSaveGame* SaveGame = Cast<UHighscoresSaveGame>(UGameplayStatics::CreateSaveGameObject(UHighscoresSaveGame::StaticClass()));
  343.  
  344.     if (UGameplayStatics::DoesSaveGameExist(SaveGame->SaveSlotName, SaveGame->UserIndex))
  345.     {
  346.         SaveGame = Cast<UHighscoresSaveGame>(UGameplayStatics::LoadGameFromSlot(SaveGame->SaveSlotName, SaveGame->UserIndex));
  347.     }
  348.  
  349.     ASpaceDivePlayerState* const SDPlayerState = Cast<ASpaceDivePlayerState>(PlayerState);
  350.  
  351.     for (int32 i = 0; i < SaveGame->HighscoreData.Num(); i++)
  352.     {
  353.         if (SDPlayerState->Score >= SaveGame->HighscoreData[i])
  354.         {
  355.             SaveGame->HighscoreData.Insert(SDPlayerState->Score, i);
  356.             SaveGame->HighscoreData.RemoveAt(SaveGame->HighscoreData.Num() - 1); // Highscore list should keep a size of 10
  357.  
  358.             break;
  359.         }
  360.     }
  361.  
  362.     UGameplayStatics::SaveGameToSlot(SaveGame, SaveGame->SaveSlotName, SaveGame->UserIndex);
  363. }
  364.  
  365. void AMainPawn::SetYAxisInverted(bool bInverted)
  366. {
  367.     const bool bShouldInvert = bInverted && (MovementSpeedFactor > 0.0f);
  368.     const bool bShouldRevert = !bInverted && (MovementSpeedFactor < 0.0f);
  369.  
  370.     if (bShouldInvert || bShouldRevert)
  371.     {
  372.         MovementSpeedFactor *= -1.f;
  373.     }
  374. }
  375.  
  376. void AMainPawn::SetUseMotionControl(bool bUseMotionControl)
  377. {
  378.     this->bUseMotionControl = bUseMotionControl;
  379. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement