Add an offset in HorzCollisionBar and reset it at the beginning of every frame.
This commit is contained in:
parent
cdd37fead7
commit
3522ce37a3
8 changed files with 67 additions and 10 deletions
|
@ -20,6 +20,8 @@
|
||||||
#include "gameplayscene.hpp"
|
#include "gameplayscene.hpp"
|
||||||
#include "mover.hpp"
|
#include "mover.hpp"
|
||||||
#include "drawable.hpp"
|
#include "drawable.hpp"
|
||||||
|
#include "placeable.hpp"
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
namespace cloonel {
|
namespace cloonel {
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
|
@ -32,8 +34,18 @@ namespace cloonel {
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
void GameplayScene::OnUpdate (float parDelta) {
|
void GameplayScene::OnUpdate (float parDelta) {
|
||||||
for (auto itMover : m_movers) {
|
{
|
||||||
itMover->Update(parDelta);
|
std::unordered_set<Placeable*> notify;
|
||||||
|
for (auto mover : m_movers) {
|
||||||
|
mover->CopyPlaceables(notify);
|
||||||
|
}
|
||||||
|
for (auto placeable : notify) {
|
||||||
|
assert(placeable);
|
||||||
|
placeable->BeginMovement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (auto mover : m_movers) {
|
||||||
|
mover->Update(parDelta);
|
||||||
}
|
}
|
||||||
m_collider.RunCollisionTests(parDelta);
|
m_collider.RunCollisionTests(parDelta);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,8 +41,8 @@ namespace cloonel {
|
||||||
///reference time frame.
|
///reference time frame.
|
||||||
///----------------------------------------------------------------------
|
///----------------------------------------------------------------------
|
||||||
float calculateOverlappingTime (float parDeltaT, float parAY, float parBY, float parDeltaA, float parDeltaB) {
|
float calculateOverlappingTime (float parDeltaT, float parAY, float parBY, float parDeltaA, float parDeltaB) {
|
||||||
const float deltaDiff = std::max(parDeltaA, parDeltaB) - std::min(parDeltaA, parDeltaB);
|
//const float deltaDiff = std::max(parDeltaA, parDeltaB) - std::min(parDeltaA, parDeltaB);
|
||||||
assert(deltaDiff >= 0.0f);
|
const float deltaDiff = std::abs(parDeltaA - parDeltaB);
|
||||||
|
|
||||||
if (deltaDiff <= 0.00001f)
|
if (deltaDiff <= 0.00001f)
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
|
@ -67,6 +67,7 @@ namespace cloonel {
|
||||||
|
|
||||||
const auto& retStart = (midpointA.Start().x() > midpointB.Start().x() ? midpointA.Start() : midpointB.Start());
|
const auto& retStart = (midpointA.Start().x() > midpointB.Start().x() ? midpointA.Start() : midpointB.Start());
|
||||||
const auto& retEnd = (midpointA.End().x() < midpointB.End().x() ? midpointA.End() : midpointB.End());
|
const auto& retEnd = (midpointA.End().x() < midpointB.End().x() ? midpointA.End() : midpointB.End());
|
||||||
|
assert(retStart.y() == retEnd.y());
|
||||||
return std::make_pair(true, Line2D(retStart, retEnd));
|
return std::make_pair(true, Line2D(retStart, retEnd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,6 +83,7 @@ namespace cloonel {
|
||||||
HorzCollisionBar::HorzCollisionBar (const float2& parFrom, float parLength) :
|
HorzCollisionBar::HorzCollisionBar (const float2& parFrom, float parLength) :
|
||||||
Placeable(parFrom),
|
Placeable(parFrom),
|
||||||
m_segment(parFrom, float2(1.0f, 0.0f), parLength),
|
m_segment(parFrom, float2(1.0f, 0.0f), parLength),
|
||||||
|
m_offset(0.0f),
|
||||||
m_callback(&DoNothing)
|
m_callback(&DoNothing)
|
||||||
{
|
{
|
||||||
assert(parLength != 0.0f);
|
assert(parLength != 0.0f);
|
||||||
|
@ -105,12 +107,24 @@ namespace cloonel {
|
||||||
m_callback(parOverlap, parDirection);
|
m_callback(parOverlap, parDirection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
void HorzCollisionBar::AddOffset (const float2& parOffset) noexcept {
|
||||||
|
Placeable::AddOffset(parOffset);
|
||||||
|
m_segment += parOffset;
|
||||||
|
m_offset += parOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
void HorzCollisionBar::BeginMovement() {
|
||||||
|
m_offset = float2(0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
///--------------------------------------------------------------------------
|
///--------------------------------------------------------------------------
|
||||||
bool Collide (float parDeltaT, const HorzCollisionBar& parA, const HorzCollisionBar& parB, HorzCollisionBar::Line2D& parOut) {
|
bool Collide (float parDeltaT, const HorzCollisionBar& parA, const HorzCollisionBar& parB, HorzCollisionBar::Line2D& parOut) {
|
||||||
const auto offsetA = parA.GetPos() - parA.m_segment.Start();
|
const auto overlap(getOverlap(parDeltaT, parA.m_segment, parB.m_segment, parA.GetOffset(), parB.GetOffset()));
|
||||||
const auto offsetB = parB.GetPos() - parB.m_segment.Start();
|
|
||||||
const auto overlap(getOverlap(parDeltaT, parA.m_segment, parB.m_segment, offsetA, offsetB));
|
|
||||||
|
|
||||||
if (overlap.first) {
|
if (overlap.first) {
|
||||||
parOut = overlap.second;
|
parOut = overlap.second;
|
||||||
|
|
|
@ -35,18 +35,24 @@ namespace cloonel {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
HorzCollisionBar ( const float2& parFrom, float parLength );
|
HorzCollisionBar ( const float2& parFrom, float parLength );
|
||||||
~HorzCollisionBar ( void ) noexcept = default;
|
virtual ~HorzCollisionBar ( void ) noexcept = default;
|
||||||
|
|
||||||
float2 From ( void ) const { return this->GetPos(); }
|
float2 From ( void ) const { return this->GetPos(); }
|
||||||
float2 To ( void ) const;
|
float2 To ( void ) const;
|
||||||
|
|
||||||
void SetCallback ( CallbackType parCallback );
|
void SetCallback ( CallbackType parCallback );
|
||||||
void InvokeCallback ( const Line2D& parOverlap, const float2& parDirection ) const;
|
void InvokeCallback ( const Line2D& parOverlap, const float2& parDirection ) const;
|
||||||
|
const float2& GetOffset ( void ) const noexcept { return m_offset; }
|
||||||
|
|
||||||
|
//Overrides
|
||||||
|
virtual void AddOffset ( const float2& parOffset ) noexcept;
|
||||||
|
virtual void BeginMovement ( void );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend bool Collide ( float parDeltaT, const HorzCollisionBar& parA, const HorzCollisionBar& parB, Line2D& parOut );
|
friend bool Collide ( float parDeltaT, const HorzCollisionBar& parA, const HorzCollisionBar& parB, Line2D& parOut );
|
||||||
|
|
||||||
Line2D m_segment;
|
Line2D m_segment;
|
||||||
|
float2 m_offset;
|
||||||
CallbackType m_callback;
|
CallbackType m_callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -45,4 +45,10 @@ namespace cloonel {
|
||||||
parPlaceable->OnRegister(*this, currTicket);
|
parPlaceable->OnRegister(*this, currTicket);
|
||||||
return currTicket;
|
return currTicket;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
void Mover::CopyPlaceables (std::unordered_set<Placeable*>& parOut) {
|
||||||
|
m_placeables.CopyObservers(parOut);
|
||||||
|
}
|
||||||
} //namespace cloonel
|
} //namespace cloonel
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
|
|
||||||
#include "vector.hpp"
|
#include "vector.hpp"
|
||||||
#include "observersmanager.hpp"
|
#include "observersmanager.hpp"
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
namespace cloonel {
|
namespace cloonel {
|
||||||
class Placeable;
|
class Placeable;
|
||||||
|
@ -40,6 +41,7 @@ namespace cloonel {
|
||||||
virtual void Update ( float parDelta );
|
virtual void Update ( float parDelta );
|
||||||
PlaceableTicketType RegisterPlaceable ( Placeable* parPlaceable, PlaceableTicketType parParent=ObserversManager<Placeable*>::Ticket_Null );
|
PlaceableTicketType RegisterPlaceable ( Placeable* parPlaceable, PlaceableTicketType parParent=ObserversManager<Placeable*>::Ticket_Null );
|
||||||
void UnregisterPlaceable ( PlaceableTicketType parID ) noexcept { m_placeables.Remove(parID); }
|
void UnregisterPlaceable ( PlaceableTicketType parID ) noexcept { m_placeables.Remove(parID); }
|
||||||
|
void CopyPlaceables ( std::unordered_set<Placeable*>& parOut );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::size_t PlaceableCount ( void ) const { return m_placeables.size(); }
|
std::size_t PlaceableCount ( void ) const { return m_placeables.size(); }
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <ciso646>
|
#include <ciso646>
|
||||||
#include <tree.hh>
|
#include <tree.hh>
|
||||||
#include <boost/iterator/transform_iterator.hpp>
|
#include <boost/iterator/transform_iterator.hpp>
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
#if defined (WITH_VERBOSE_OBS_MANAGER) && defined(__GNUC__) && __GNUC__ >= 2 && !defined(NDEBUG)
|
#if defined (WITH_VERBOSE_OBS_MANAGER) && defined(__GNUC__) && __GNUC__ >= 2 && !defined(NDEBUG)
|
||||||
# define OBS_MANAGER_LOG
|
# define OBS_MANAGER_LOG
|
||||||
|
@ -78,6 +79,7 @@ namespace cloonel {
|
||||||
std::size_t size ( void ) const { return m_tree.size(); }
|
std::size_t size ( void ) const { return m_tree.size(); }
|
||||||
iterator begin ( void ) { return iterator(m_tree.begin(), &TicketedWrapperToItm); }
|
iterator begin ( void ) { return iterator(m_tree.begin(), &TicketedWrapperToItm); }
|
||||||
iterator end ( void ) { return iterator(m_tree.end(), &TicketedWrapperToItm); }
|
iterator end ( void ) { return iterator(m_tree.end(), &TicketedWrapperToItm); }
|
||||||
|
void CopyObservers ( std::unordered_set<T>& parOut );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TreeIteratorType GetByTicket_AssertPresent ( TicketType parTicket );
|
TreeIteratorType GetByTicket_AssertPresent ( TicketType parTicket );
|
||||||
|
@ -161,6 +163,15 @@ namespace cloonel {
|
||||||
assert(m_tree.end() != ret);
|
assert(m_tree.end() != ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
template <typename T>
|
||||||
|
void ObserversManager<T>::CopyObservers (std::unordered_set<T>& parOut) {
|
||||||
|
for (const auto& itm : m_tree) {
|
||||||
|
parOut.insert(itm.itm);
|
||||||
|
}
|
||||||
|
}
|
||||||
} //namespace cloonel
|
} //namespace cloonel
|
||||||
|
|
||||||
#if defined(OBS_MANAGER_LOG)
|
#if defined(OBS_MANAGER_LOG)
|
||||||
|
|
|
@ -34,4 +34,9 @@ namespace cloonel {
|
||||||
void Placeable::OnRegister (Mover&, Mover::PlaceableTicketType) {
|
void Placeable::OnRegister (Mover&, Mover::PlaceableTicketType) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
///--------------------------------------------------------------------------
|
||||||
|
void Placeable::BeginMovement() {
|
||||||
|
}
|
||||||
} //namespace cloonel
|
} //namespace cloonel
|
||||||
|
|
|
@ -27,12 +27,13 @@ namespace cloonel {
|
||||||
class Placeable {
|
class Placeable {
|
||||||
public:
|
public:
|
||||||
float2 GetPos ( void ) const noexcept;
|
float2 GetPos ( void ) const noexcept;
|
||||||
void AddOffset ( const float2& parOffset ) noexcept;
|
virtual void AddOffset ( const float2& parOffset ) noexcept;
|
||||||
virtual void OnRegister ( Mover& parMover, Mover::PlaceableTicketType parParentTicket );
|
virtual void OnRegister ( Mover& parMover, Mover::PlaceableTicketType parParentTicket );
|
||||||
|
virtual void BeginMovement ( void );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
explicit Placeable ( float2 parPos );
|
explicit Placeable ( float2 parPos );
|
||||||
~Placeable ( void ) noexcept = default;
|
virtual ~Placeable ( void ) noexcept = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float2 m_pos;
|
float2 m_pos;
|
||||||
|
|
Loading…
Reference in a new issue