This commit is contained in:
aozhiwei 2019-03-22 17:40:23 +08:00
parent a88bf63b7c
commit 62373e21b4
9 changed files with 34 additions and 19 deletions

View File

@ -61,9 +61,8 @@ void AndroidAI::ChangeToState(AndroidState_e to_state)
case AS_moving: case AS_moving:
{ {
Human* hum = (Human*)owner; Human* hum = (Human*)owner;
float angle = ((float)rand() / RAND_MAX) * 2.0f;
hum->move_dir = Vector2D(1.0f, 0); hum->move_dir = Vector2D(1.0f, 0);
hum->move_dir = hum->move_dir.Rotate(angle); hum->move_dir.Rotate(a8::RandAngle());
hum->move_dir.Normalize(); hum->move_dir.Normalize();
hum->attack_dir = hum->move_dir; hum->attack_dir = hum->move_dir;
} }

View File

@ -63,7 +63,7 @@ void App::Init(int argc, char* argv[])
#if 0 #if 0
{ {
Vector2D v1(1, 1); Vector2D v1(1, 1);
Vector2D v2 = v1.Rotate(-0.25); v1.Rotate(-0.25);
TestGlm(); TestGlm();
int i = 0; int i = 0;
} }

View File

@ -222,3 +222,8 @@ void Human::FindPath()
} }
} }
} }
float Human::GetRadius()
{
return meta->i->radius();
}

View File

@ -60,6 +60,7 @@ class Human : public Entity
void RecalcSelfCollider(); void RecalcSelfCollider();
bool IsCollision(); bool IsCollision();
void FindPath(); void FindPath();
float GetRadius();
private: private:
CircleCollider* self_collider_ = nullptr; CircleCollider* self_collider_ = nullptr;

View File

@ -11,12 +11,17 @@ void MovementComponent::Update(int delta_time)
++path_index_; ++path_index_;
return; return;
} }
Vector2D path = target_point.pos - owner->pos; #if 1
assert(false);
#else
Vector2D dir = target_point.pos - owner->pos;
dir.Normalize();
float distance = path.Norm(); float distance = path.Norm();
owner->pos = owner->pos + path.Normalize() * std::min(move_speed_, distance); owner->pos = owner->pos + dir * std::min(move_speed_, distance);
if (owner->pos == target_point.pos) { if (owner->pos == target_point.pos) {
++path_index_; ++path_index_;
} }
#endif
} }
} }

View File

@ -72,8 +72,7 @@ void Room::AddPlayer(Player* hum)
hum->pos.y = 2000 + rand() % 200; hum->pos.y = 2000 + rand() % 200;
hum->attack_dir = hum->pos; hum->attack_dir = hum->pos;
hum->attack_dir.Normalize(); hum->attack_dir.Normalize();
float angle = ((float)rand() / RAND_MAX) * 2.0f; hum->attack_dir.Rotate(a8::RandAngle());
hum->attack_dir.Rotate(angle);
} }
hum->room = this; hum->room = this;
uniid_hash_[hum->entity_uniid] = hum; uniid_hash_[hum->entity_uniid] = hum;
@ -118,8 +117,7 @@ void Room::ShuaAndroid()
hum->pos.y = 200 + rand() % 500; hum->pos.y = 200 + rand() % 500;
hum->attack_dir = hum->pos; hum->attack_dir = hum->pos;
hum->attack_dir.Normalize(); hum->attack_dir.Normalize();
float angle = ((float)rand() / RAND_MAX) * 2.0f; hum->attack_dir.Rotate(a8::RandAngle());
hum->attack_dir.Rotate(angle);
} }
hum->room = this; hum->room = this;
hum->Initialize(); hum->Initialize();
@ -147,6 +145,12 @@ void Room::ShuaObstacle(Human* hum)
entity->room = this; entity->room = this;
entity->meta = thing; entity->meta = thing;
entity->entity_uniid = AllocUniid(); entity->entity_uniid = AllocUniid();
#if 1
{
Vector2D dir = hum->pos;
dir.Normalize();
}
#endif
entity->Initialize(); entity->Initialize();
uniid_hash_[entity->entity_uniid] = entity; uniid_hash_[entity->entity_uniid] = entity;
for (auto& pair : human_hash_) { for (auto& pair : human_hash_) {
@ -158,10 +162,12 @@ void Room::ShuaObstacle(Human* hum)
bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos) bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos)
{ {
float angle = ((float)rand() / RAND_MAX) * 2.0f; Vector2D dir = hum->pos;
dir.Rotate(a8::RandAngle());
dir.Normalize();
CircleCollider collider; CircleCollider collider;
collider.owner = hum; collider.owner = hum;
collider.pos = hum->pos.Rotate(angle).Normalize() * distance; collider.pos = dir * distance;
collider.rad = hum->meta->i->radius(); collider.rad = hum->meta->i->radius();
for (auto& pair : uniid_hash_) { for (auto& pair : uniid_hash_) {

View File

@ -28,7 +28,7 @@ void Vector2D::FromPB(const cs::MFVector2D* pb_obj)
y = pb_obj->y(); y = pb_obj->y();
} }
Vector2D& Vector2D::Normalize() void Vector2D::Normalize()
{ {
#if 1 #if 1
glm::vec2 v = glm::normalize(glm::vec2(x, y)); glm::vec2 v = glm::normalize(glm::vec2(x, y));
@ -40,7 +40,6 @@ Vector2D& Vector2D::Normalize()
x = v[0]; x = v[0];
y = v[1]; y = v[1];
#endif #endif
return *this;
} }
bool Vector2D::operator == (const Vector2D& b) const bool Vector2D::operator == (const Vector2D& b) const
@ -97,11 +96,12 @@ Vector2D Vector2D::operator / (float scale) const
#include <Eigen/Dense> #include <Eigen/Dense>
#endif #endif
Vector2D Vector2D::Rotate(float angle) void Vector2D::Rotate(float angle)
{ {
Eigen::Vector3f v(x, y, 0); Eigen::Vector3f v(x, y, 0);
v = Eigen::AngleAxisf(angle * 3.1415926f, Eigen::Vector3f::UnitZ()) * v; v = Eigen::AngleAxisf(angle * 3.1415926f, Eigen::Vector3f::UnitZ()) * v;
return Vector2D(v[0], v[1]); x = v[0];
y = v[1];
} }
Vector2D Vector2D::Perp() Vector2D Vector2D::Perp()
@ -213,4 +213,3 @@ static Polygon newPolygon(std::vector<Vector2D>& vertices)
return shape; return shape;
} }
#endif #endif

View File

@ -23,14 +23,14 @@ struct Vector2D
void ToPB(cs::MFVector2D* pb_obj); void ToPB(cs::MFVector2D* pb_obj);
void FromPB(const cs::MFVector2D* pb_obj); void FromPB(const cs::MFVector2D* pb_obj);
Vector2D& Normalize(); void Normalize();
void Rotate(float angle);
bool operator == (const Vector2D& b) const; bool operator == (const Vector2D& b) const;
Vector2D operator + (const Vector2D& b) const; Vector2D operator + (const Vector2D& b) const;
Vector2D operator - (const Vector2D& b) const; Vector2D operator - (const Vector2D& b) const;
Vector2D operator * (float scale) const; Vector2D operator * (float scale) const;
Vector2D operator / (float scale) const; Vector2D operator / (float scale) const;
Vector2D Rotate(float angle);
Vector2D Perp(); Vector2D Perp();
float Dot(const Vector2D& v) const; float Dot(const Vector2D& v) const;
float Norm(); float Norm();

@ -1 +1 @@
Subproject commit e7ff93f844ce7b7356f6d743be27618d7539c885 Subproject commit 923b076d57a0ee4bdf0e15624e7f4595c8b2fb42