Untitled
unknown
plain_text
2 years ago
4.0 kB
9
Indexable
#include "Game.h"
#include "Pellet.h"
#include "Mesh.h"
#include "MeshComponent.h"
#include "CollisionComponent.h"
#include "Renderer.h"
#include "Player.h"
#include "Portal.h"
Pellet::Pellet(Game* game)
: Actor(game)
{
mPelletMesh = new MeshComponent(this);
mPelletMesh->SetMesh(game->GetRenderer()->GetMesh("Assets/Meshes/Sphere.gpmesh"));
mPelletMesh->SetTextureIndex(1);
mPelletColl = new CollisionComponent(this);
mPelletColl->SetSize(PELLET_SIZE, PELLET_SIZE, PELLET_SIZE);
}
void Pellet::OnUpdate(float deltaTime)
{
mInvunlerableTime -= deltaTime;
mTeleportCooldown -= deltaTime;
mVelocity = SPEED * mForward;
Vector3 newPos = GetPosition() + (mVelocity * deltaTime);
SetPosition(newPos);
std::vector<Actor*>& tempColliders = GetGame()->GetColliders();
//if the pellet collides with the player
if (mPelletColl->Intersect(GetGame()->GetPlayer()->GetComponent<CollisionComponent>()))
{
SetState(ActorState::Destroy);
}
//check for pellet teleport
if (mTeleportCooldown <= 0.0f)
{
Game* game = GetGame();
Portal* blue = game->GetBluePortal();
Portal* orange = game->GetOrangePortal();
//check if both portal exist
if (blue != nullptr && orange != nullptr)
{
// Vector3 newPos;
//enters the blue portal
if (mPelletColl->Intersect(blue->GetComponent<CollisionComponent>()))
{
// mVelocity = blue->GetPortalOutVector(mVelocity, orange, 0.0f) *
// orange->GetQuatForward();
// newPos = blue->GetPortalOutVector(GetPosition(), orange, 1.0f);
// SetPosition(newPos);
Teleport(blue, orange);
mTeleportCooldown = TELEPORT_COOLDOWN;
}
//enters the orange portal
else if (mPelletColl->Intersect(orange->GetComponent<CollisionComponent>()))
{
// mVelocity = orange->GetPortalOutVector(mVelocity, blue, 0.0f) *
// blue->GetQuatForward();
// newPos = orange->GetPortalOutVector(GetPosition(), blue, 1.0f);
// SetPosition(newPos);
Teleport(orange, blue);
mTeleportCooldown = TELEPORT_COOLDOWN;
}
}
}
//0.25 second have passed since first spawning pellet
if (mInvunlerableTime < 0.0f && mTeleportCooldown < 0.0f)
{
//check for collision with other colliders
for (auto collider : tempColliders)
{
if (mPelletColl->Intersect(collider->GetComponent<CollisionComponent>()))
{
SetState(ActorState::Destroy);
}
}
}
}
void Pellet::Teleport(class Portal* entry, class Portal* exit)
{
//calculate the rotation for the player
if (Vector3::Cross(exit->GetQuatForward(), Vector3::UnitZ).Length() != 0.0f)
{
Vector3 desireFace;
if (Vector3::Cross(entry->GetQuatForward(), Vector3::UnitZ).Length() == 0.0f)
{
desireFace = exit->GetQuatForward();
}
else
{
desireFace = entry->GetPortalOutVector(GetForward(), exit, 0.0f);
}
//update player rotation
Vector3 crossOfXDesire = Vector3::Cross(Vector3::Normalize(Vector3::UnitX),
Vector3::Normalize(desireFace));
float angle = Math::Acos(
Vector3::Dot(Vector3::Normalize(desireFace), Vector3::Normalize(Vector3::UnitX)));
if (crossOfXDesire.z > 0.0f)
{
SetRotation(angle);
}
else
{
SetRotation(-angle);
}
}
float maxVelLength = Math::Max((1.5f * mVelocity.Length()), 350.0f);
//find the direction of the Player
Vector3 direction;
if (Vector3::Cross(exit->GetQuatForward(), Vector3::UnitZ).Length() == 0.0f ||
Vector3::Cross(entry->GetQuatForward(), Vector3::UnitZ).Length() == 0.0f)
{
direction = exit->GetQuatForward();
}
else
{
direction = entry->GetPortalOutVector(Vector3::Normalize(mVelocity), exit, 0.0f);
}
mVelocity = direction * maxVelLength;
//find new position of the player
Vector3 basePoint;
if (Vector3::Cross(exit->GetQuatForward(), Vector3::UnitZ).Length() == 0.0f ||
Vector3::Cross(entry->GetQuatForward(), Vector3::UnitZ).Length() == 0.0f)
{
basePoint = exit->GetPosition();
}
else
{
basePoint = entry->GetPortalOutVector(GetPosition(), exit, 1.0f);
}
SetPosition(basePoint + exit->GetQuatForward() * 50.0f);
}Editor is loading...
Leave a Comment