完善updatemsg

This commit is contained in:
aozhiwei 2019-03-18 14:41:55 +08:00
parent 645ae32cf9
commit 02e39e1cc0
9 changed files with 136 additions and 36 deletions

View File

@ -3,6 +3,7 @@
#include "android.ai.h"
#include "android.h"
#include "movement.h"
#include "room.h"
void AndroidAI::Update(int delta_time)
{
@ -82,17 +83,42 @@ void AndroidAI::DoMove()
{
if (owner->movement) {
if (owner->movement->Arrived()) {
float distance = 8.0f + rand() % 10;
Vector2D out_pos;
if (owner->room->RandomPos((Human*)owner, distance, out_pos)) {
owner->movement->ClearPath();
owner->movement->AddPathPoint(out_pos, distance, owner->GetSpeed());
}
}
}
}
void AndroidAI::DoAttack()
{
if (owner->updated_times % 2 == 0) {
Human* enemy = owner->room->SearchEnemy((Human*)owner);
if (enemy) {
}
}
}
void AndroidAI::DoMoveAndAttack()
{
if (owner->movement) {
if (owner->movement->Arrived()) {
float distance = 8.0f + rand() % 10;
Vector2D out_pos;
if (owner->room->RandomPos((Human*)owner, distance, out_pos)) {
owner->movement->ClearPath();
owner->movement->AddPathPoint(out_pos, distance, owner->GetSpeed());
}
}
if (owner->updated_times % 2 == 0) {
Human* enemy = owner->room->SearchEnemy((Human*)owner);
if (enemy) {
}
}
}
}

View File

@ -49,4 +49,5 @@ class Entity
virtual void Update(int delta_time) {};
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) {};
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) {};
virtual float GetSpeed() { return 1.0f;};
};

View File

@ -3,6 +3,7 @@
#include "human.h"
#include "cs_proto.pb.h"
#include "movement.h"
#include "metamgr.h"
Human::Human()
{
@ -15,6 +16,11 @@ Human::~Human()
movement = nullptr;
}
float Human::GetSpeed()
{
return meta->i->move_speed();
}
void Human::FillMFObjectPart(cs::MFObjectPart* part_data)
{
part_data->set_object_type(ET_Player);

View File

@ -1,12 +1,19 @@
#pragma once
#include "entity.h"
#include "cs_proto.pb.h"
namespace MetaData
{
struct Player;
}
struct HumanFrameData
{
::google::protobuf::RepeatedPtrField<::cs::MFBullet> bullets;
::google::protobuf::RepeatedPtrField<::cs::MFShot> shots;
};
class Human : public Entity
{
public:
@ -29,6 +36,8 @@ class Human : public Entity
int vip = 0;
int sdmg = 0;
HumanFrameData frame_data;
bool moving = false;
Vector2D move_dir;
@ -39,6 +48,7 @@ class Human : public Entity
Human();
virtual ~Human() override;
virtual float GetSpeed() override;
virtual void FillMFObjectPart(cs::MFObjectPart* part_data) override;
virtual void FillMFObjectFull(cs::MFObjectFull* full_data) override;

View File

@ -26,6 +26,13 @@ const int F_ack = 24;
Player::Player()
{
entity_subtype = EST_Player;
update_msg = new cs::SMUpdate();
}
Player::~Player()
{
delete update_msg;
update_msg = nullptr;
}
void Player::Initialize()
@ -37,39 +44,8 @@ void Player::Update(int delta_time)
{
movement->Update(delta_time);
if (updated_times % 2 == 0) {
cs::SMUpdate msg;
{
for (auto& itr : new_players) {
itr->FillMFObjectFull(msg.add_full_objects());
}
for (auto& itr : part_players) {
itr->FillMFObjectPart(msg.add_part_objects());
}
if (updated_times == 0) {
msg.set_active_player_id(entity_uniid);
FillMFPlayerData(msg.mutable_active_player_data());
}
msg.set_alive_count(room->AliveCount());
{
int data_flags32 = 0;
if (!new_players.empty()) {
a8::SetBitFlag(data_flags32, F_full_objects);
}
if (!part_players.empty()) {
a8::SetBitFlag(data_flags32, F_part_objects);
}
if (updated_times == 0) {
a8::SetBitFlag(data_flags32, F_active_player_id);
a8::SetBitFlag(data_flags32, F_active_player_data);
}
a8::SetBitFlag(data_flags32, F_alive_count);
msg.set_data_flags32(data_flags32);
}
}
SendNotifyMsg(msg);
MakeUpdateMsg();
SendNotifyMsg(*update_msg);
{
if (!new_players.empty()) {
new_players.clear();
@ -107,3 +83,57 @@ void Player::FillMFPlayerData(cs::MFPlayerData* player_data)
{
player_data->set_has_action(false);
}
void Player::MakeUpdateMsg()
{
update_msg->Clear();
{
for (auto& itr : new_players) {
itr->FillMFObjectFull(update_msg->add_full_objects());
if (itr->frame_data.bullets.size() > 0) {
update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets);
}
if (itr->frame_data.shots.size() > 0) {
update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots);
}
}
for (auto& itr : part_players) {
itr->FillMFObjectPart(update_msg->add_part_objects());
if (itr->frame_data.bullets.size() > 0) {
update_msg->mutable_bullets()->MergeFrom(itr->frame_data.bullets);
}
if (itr->frame_data.shots.size() > 0) {
update_msg->mutable_shots()->MergeFrom(itr->frame_data.shots);
}
}
if (updated_times == 0) {
update_msg->set_active_player_id(entity_uniid);
FillMFPlayerData(update_msg->mutable_active_player_data());
}
update_msg->set_alive_count(room->AliveCount());
{
int data_flags32 = 0;
if (!new_players.empty()) {
a8::SetBitFlag(data_flags32, F_full_objects);
}
if (!part_players.empty()) {
a8::SetBitFlag(data_flags32, F_part_objects);
}
if (update_msg->bullets_size() > 0) {
a8::SetBitFlag(data_flags32, F_bullets);
}
if (update_msg->shots_size() > 0) {
a8::SetBitFlag(data_flags32, F_shots);
}
if (updated_times == 0) {
a8::SetBitFlag(data_flags32, F_active_player_id);
a8::SetBitFlag(data_flags32, F_active_player_data);
}
a8::SetBitFlag(data_flags32, F_alive_count);
update_msg->set_data_flags32(data_flags32);
}
}
}

View File

@ -35,6 +35,7 @@ class Player : public Human
}
Player();
virtual ~Player() override;
virtual void Initialize() override;
virtual void Update(int delta_time) override;
@ -45,4 +46,9 @@ class Player : public Human
void _CMVoice(f8::MsgHdr& hdr, const cs::CMVoice& msg);
void FillMFPlayerData(cs::MFPlayerData* player_data);
private:
cs::SMUpdate* update_msg = nullptr;
void MakeUpdateMsg();
};

View File

@ -86,3 +86,13 @@ void Room::ShuaAndroid()
moveable_hash_[hum->entity_uniid] = hum;
}
}
bool Room::RandomPos(Human* hum, float distance, Vector2D& out_pos)
{
return false;
}
Human* Room::SearchEnemy(Human* hum)
{
return nullptr;
}

View File

@ -1,5 +1,7 @@
#pragma once
#include "cs_proto.pb.h"
enum RoomState_e
{
RS_Inactive = 0,
@ -12,7 +14,14 @@ namespace MetaData
struct Map;
}
struct RoomFrameData
{
::google::protobuf::RepeatedPtrField<::cs::MFExplosion> explosions;
::google::protobuf::RepeatedPtrField<::cs::MFEmote> emotes;
};
class Entity;
class Human;
class Player;
class Room
{
@ -29,6 +38,8 @@ public:
void AddPlayer(Player* hum);
unsigned short AllocUniid();
void ShuaAndroid();
bool RandomPos(Human* hum, float distance, Vector2D& out_pos);
Human* SearchEnemy(Human* hum);
private:
unsigned short current_uniid = 0;

View File

@ -612,8 +612,8 @@ message SMUpdate
repeated MFTeamData teams = 19;
repeated MFBullet bullets = 20; //
repeated MFShot shots = 21; //
repeated MFExplosion explosions = 22;
repeated MFEmote emotes = 23;
repeated MFExplosion explosions = 22; //
repeated MFEmote emotes = 23; //
optional int32 ack = 24;
optional uint32 data_flags32 = 256;