| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- // ----------------------------------------------------------------
- // From Game Programming in C++ by Sanjay Madhav
- // Copyright (C) 2017 Sanjay Madhav. All rights reserved.
- //
- // Released under the BSD License
- // See LICENSE.txt for full details.
- // ----------------------------------------------------------------
- #include "PlayerMove.h"
- #include "Actor.h"
- #include "Game.h"
- #include "PhysWorld.h"
- PlayerMove::PlayerMove(Actor* owner)
- :MoveComponent(owner)
- {
- }
- void PlayerMove::Update(float deltaTime)
- {
- const float zOffset = 50.0f;
- const float segmentLength = 100.0f;
- PhysWorld* phys = mOwner->GetGame()->GetPhysWorld();
- // Test whether forward/strafe movement are valid
- // Start point is player position +z offset
- Vector3 start = mOwner->GetPosition();
- start.z += zOffset;
- // For forward/back
- if (!Math::NearZero(mForwardSpeed))
- {
- // End point is in direction of forward/backward vector
- Vector3 dir = mOwner->GetForward();
- if (mForwardSpeed < 0.0f)
- {
- dir *= -1.0f;
- }
- Vector3 end = start + dir * segmentLength;
- // Create line segment
- LineSegment l(start, end);
- // Test segment vs world
- PhysWorld::CollisionInfo info;
- if (phys->SegmentCast(l, info))
- {
- // If we collided, don't allow movement
- mForwardSpeed = 0.0f;
- }
- }
- // For strafing
- if (!Math::NearZero(mStrafeSpeed))
- {
- // End point is in direction of right/left vector
- Vector3 dir = mOwner->GetRight();
- if (mStrafeSpeed < 0.0f)
- {
- dir *= -1.0f;
- }
- Vector3 end = start + dir * segmentLength;
- // Create line segment
- LineSegment l(start, end);
- // Test segment vs world
- PhysWorld::CollisionInfo info;
- if (phys->SegmentCast(l, info))
- {
- // If we collided, don't allow movement
- mStrafeSpeed = 0.0f;
- }
- }
- // Now update move component based on modified speeds
- MoveComponent::Update(deltaTime);
- }
|