1
This commit is contained in:
parent
b94ed56e88
commit
e8db19c214
@ -1,5 +1,7 @@
|
|||||||
#include "precompile.h"
|
#include "precompile.h"
|
||||||
|
|
||||||
|
#include <float.h>
|
||||||
|
|
||||||
#include <a8/mutable_xobject.h>
|
#include <a8/mutable_xobject.h>
|
||||||
#include <a8/collision.h>
|
#include <a8/collision.h>
|
||||||
|
|
||||||
@ -409,7 +411,8 @@ bool Human::IsCollisionInMapService()
|
|||||||
std::set<ColliderComponent*> colliders;
|
std::set<ColliderComponent*> colliders;
|
||||||
room->map_service.GetColliders(pos.x, pos.y, colliders);
|
room->map_service.GetColliders(pos.x, pos.y, colliders);
|
||||||
|
|
||||||
for (const ColliderComponent* collider : colliders) {
|
Global::last_collider = nullptr;
|
||||||
|
for (ColliderComponent* collider : colliders) {
|
||||||
switch (collider->owner->entity_type) {
|
switch (collider->owner->entity_type) {
|
||||||
case ET_Obstacle:
|
case ET_Obstacle:
|
||||||
{
|
{
|
||||||
@ -437,6 +440,7 @@ bool Human::IsCollisionInMapService()
|
|||||||
}
|
}
|
||||||
obstacle->BroadcastFullState();
|
obstacle->BroadcastFullState();
|
||||||
} else {
|
} else {
|
||||||
|
Global::last_collider = collider;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -447,6 +451,7 @@ bool Human::IsCollisionInMapService()
|
|||||||
{
|
{
|
||||||
if (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) {
|
if (!collider->owner->dead && TestCollision((ColliderComponent*)collider)) {
|
||||||
if (last_collision_door != collider->owner) {
|
if (last_collision_door != collider->owner) {
|
||||||
|
Global::last_collider = collider;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -462,6 +467,44 @@ bool Human::IsCollisionInMapService()
|
|||||||
void Human::FindPathInMapService()
|
void Human::FindPathInMapService()
|
||||||
{
|
{
|
||||||
a8::Vec2 old_pos = pos;
|
a8::Vec2 old_pos = pos;
|
||||||
|
ColliderComponent* last_collider = Global::last_collider;
|
||||||
|
if (last_collider) {
|
||||||
|
switch (last_collider->type) {
|
||||||
|
case CT_Aabb:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case CT_Circle:
|
||||||
|
{
|
||||||
|
a8::Vec2 extend_dir = pos - last_collider->owner->pos;
|
||||||
|
if (std::abs(extend_dir.x) > FLT_EPSILON ||
|
||||||
|
std::abs(extend_dir.y) > FLT_EPSILON) {
|
||||||
|
extend_dir.Normalize();
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
a8::Vec2 extend_dir_inverse(extend_dir.y, extend_dir.x);
|
||||||
|
float angle = extend_dir_inverse.CalcAngle(move_dir);
|
||||||
|
if (angle > 0.001f) {
|
||||||
|
extend_dir.Rotate(-1/180.0f);
|
||||||
|
} else {
|
||||||
|
extend_dir.Rotate(1/180.0f);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
extend_dir.Rotate(1/180.0f);
|
||||||
|
}
|
||||||
|
float distance = ((CircleCollider*)last_collider)->rad + meta->i->radius();
|
||||||
|
pos = last_collider->owner->pos + extend_dir * (distance + 1);
|
||||||
|
if (IsCollisionInMapService()) {
|
||||||
|
pos = old_pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
{
|
{
|
||||||
float up_dot = a8::Vec2::UP.Dot(move_dir);
|
float up_dot = a8::Vec2::UP.Dot(move_dir);
|
||||||
bool at_left_side = a8::Vec2::LEFT.Dot(move_dir) > 0.0001f;
|
bool at_left_side = a8::Vec2::LEFT.Dot(move_dir) > 0.0001f;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user