Add player damage, death, and respawn

This commit is contained in:
Sara Montecino 2022-11-12 14:33:50 -08:00
parent 7780f965fc
commit 88db9deea4
9 changed files with 95 additions and 12 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -100,6 +100,7 @@ void ABasePawn::Tick(float DeltaTime)
if (current_health <= 0) if (current_health <= 0)
{ {
handle_death(); handle_death();
current_health = max_health;
} }
} }
@ -107,8 +108,7 @@ void ABasePawn::handle_move_forward(float axis)
{ {
if (axis != 0) if (axis != 0)
{ {
FVector forward = FRotationMatrix(FRotator()).GetUnitAxis(EAxis::X); AddMovementInput(FVector(1,0,0), axis);
AddMovementInput(forward, axis);
} }
} }
@ -116,8 +116,7 @@ void ABasePawn::handle_move_right(float axis)
{ {
if (axis != 0) if (axis != 0)
{ {
FVector right = FRotationMatrix(FRotator()).GetUnitAxis(EAxis::Y); AddMovementInput(FVector(0, 1, 0), axis);
AddMovementInput(right, axis);
} }
} }
@ -172,19 +171,30 @@ void ABasePawn::handle_death()
*/ */
collision->SetCollisionEnabled(ECollisionEnabled::NoCollision); collision->SetCollisionEnabled(ECollisionEnabled::NoCollision);
if (death_effect)
{
death_effect->Destroy();
death_effect = nullptr;
}
/* /*
* Spawn particle effect. * Spawn particle effect.
*/ */
FVector player_location = player_mesh->GetComponentLocation(); FVector player_location = player_mesh->GetComponentLocation();
FActorSpawnParameters spawnParameters; FActorSpawnParameters spawnParameters;
spawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; spawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
AActor* bullet = GetWorld()->SpawnActor<AActor>( death_effect = GetWorld()->SpawnActor<AActor>(
death_class, death_class,
player_location, player_location,
FRotator(0,0,0), FRotator(0,0,0),
spawnParameters spawnParameters
); );
destroy_self();
}
void ABasePawn::destroy_self()
{
/* /*
* Remove thyself from this world. * Remove thyself from this world.
*/ */

View File

@ -49,6 +49,8 @@ protected:
}; };
}; };
virtual void destroy_self();
// Called when the game starts or when spawned // Called when the game starts or when spawned
virtual void BeginPlay() override; virtual void BeginPlay() override;
@ -125,4 +127,9 @@ protected:
* Last yaw. * Last yaw.
*/ */
Yaw yaw; Yaw yaw;
/**
* Spawned death effect actor.
*/
AActor* death_effect;
}; };

View File

@ -55,6 +55,15 @@ void APlayerPawn::Tick(float delta_time)
{ {
reset_boost(); reset_boost();
} }
if (respawn_wait_s > 0)
{
respawn_wait_s -= delta_time;
if (respawn_wait_s <= 0)
{
respawn();
}
}
} }
void APlayerPawn::boost() void APlayerPawn::boost()
@ -96,4 +105,45 @@ void APlayerPawn::reset_boost()
cooldown_wait_s = 0; cooldown_wait_s = 0;
} }
}
void APlayerPawn::destroy_self()
{
APlayerController* controller = Cast<APlayerController>(Controller);
if (!controller)
{
LogError("Cannot find palyer controller");
return;
}
stop_shooting();
reset_boost();
DisableInput(controller);
player_mesh->SetHiddenInGame(true);
if (death_effect)
{
death_effect->Destroy();
death_effect = nullptr;
}
/*
* Start respawn timer.
*/
respawn_wait_s = respawn_s;
}
void APlayerPawn::respawn()
{
APlayerController* controller = Cast<APlayerController>(Controller);
if (!controller)
{
LogError("Cannot find palyer controller");
return;
}
EnableInput(controller);
player_mesh->SetHiddenInGame(false);
collision->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
} }

View File

@ -24,9 +24,17 @@ public:
// Called to bind functionality to input // Called to bind functionality to input
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
protected: protected:
virtual void destroy_self() override;
UPROPERTY(EditAnywhere, Category="Player") UPROPERTY(EditAnywhere, Category="Player")
UCameraComponent* main_camera; UCameraComponent* main_camera;
/**
* Time in seconds before respawn.
*/
UPROPERTY(EditAnywhere, Category = "Player")
float respawn_s;
/** /**
* Multiplier to apply to current speed while boosting. Applies to max speed and accleration. * Multiplier to apply to current speed while boosting. Applies to max speed and accleration.
*/ */
@ -48,6 +56,7 @@ protected:
private: private:
void boost(); void boost();
void reset_boost(); void reset_boost();
void respawn();
/** /**
* Default max speed. Cached when boost is called. * Default max speed. Cached when boost is called.
@ -68,4 +77,9 @@ private:
* Time waited for cooldown. * Time waited for cooldown.
*/ */
float cooldown_wait_s; float cooldown_wait_s;
/**
* Time waiting for respawn.
*/
float respawn_wait_s;
}; };

View File

@ -12,18 +12,20 @@ xAdd enemy cars
xAdd dash xAdd dash
xShoot from any direction xShoot from any direction
xShoot at continuous rate when holding shoot button xShoot at continuous rate when holding shoot button
Add local multiplayer xAdd player damage
x Blueprint
- C++
Add player damage
Add player ammo Add player ammo
Add player health pickups
Add HUD UI Add HUD UI
Add win condition Add win condition
- Time based. Keep president alive until he reaches destination. - Time based. Keep president alive until he reaches destination.
Add menu
Add local multiplayer
x Blueprint
- C++
Add netcode
Add art
- Car models
- Street shader
Add sounds Add sounds
Add juice Add juice
Add muzzle on shoot Add muzzle on shoot
Camera zoom out based on screen size? Looks too small when I shrink the window Camera zoom out based on screen size? Looks too small when I shrink the window
Add menu
Add netcode