足球战术->中场发动机之mediator篇

接上回:
http://www.youkuaiyun.com/develop/read_article.asp?id=10848

上次忘了最古老的足球战术->中场发动机战术,也就是mediator模式,
在这个模式中,所有的中场组织都由中场发动机(mediator)来完成。
对其他队员(colleague)的要求降低,而对中场发动机的要求大大提高。
传球方式分两种,第一种由普通的observer模式得来:将中场发动机
作为observer,其他队员作为subject,由中场发动机将其他队员的传球
再传给其他人;第二种由其他队员把自己作为参数传给中场发动机,
跑动后中场发动机再把球传给他,做踢墙式二过一。代码如下:
class 中场发动机{
public:
     virtual ~中场发动机();

     virtual void 中转();
     virtual void 其他队员的传递(其他队员*)=0;

protected
     中场发动机();
     virtual void 带球,寻找可传球人()=0;
};

class 其他队员{
public:
     其他队员(中场发动机*);
     virtual void 进攻变化();

     virtual void 传球(传球事件& 事件);

private:
     中场发动机* _发动机;
};

void 其他队员::进攻变化(){
    _发动机->其他队员的传递(this);
}

void GeneralGraphicsScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { //没有按住Ctrl键时,拖动框时保存框的位置 auto isPressCtrl = event->modifiers() & Qt::Modifier::CTRL; if (this->mIsPressLeftButton && this->mMoveMementroModel && this->mMoveGrphicsItemPos && !isPressCtrl) { this->PushUnDoCmd(this->mMoveMementroModel); } this->mMoveMementroModel = nullptr; this->mIsPressLeftButton = false; this->SetGraphicsItemPosChange(false); this->mCoordinator->GetActionHandler().MouseReleaseEvent(event); QGraphicsScene::mouseReleaseEvent(event); //由于大框、中框、小框的pos不一定为0,需要都转化成基于scene(图片)原点的坐标存储, if (!this->mDrawingModel.isDrawingMode()) { if (this->mChangedItemsMap.count() > 0) { QList<QSharedPointer<GeneralGraphicsBaseModel>> updateItemsModelList; for (auto& key : this->mChangedItemsMap.keys()) { auto changedItem = this->mChangedItemsMap[key]; if (changedItem) { if (changedItem->GetModel()->regionType == GeneralGraphicsRegionType::ElementOutRegion) { for (auto& citem : changedItem->childItems()) { auto childItem = static_cast<GeneralGraphicsBaseItem *>(citem); if (childItem) { childItem->TransToSceneVertexs(); updateItemsModelList.append(childItem->GetModel()); } } } else if (changedItem->GetModel()->regionType == GeneralGraphicsRegionType::BoardRegion) { for (auto& elementOutItem : changedItem->childItems()) { for (auto& citem : elementOutItem->childItems()) { auto childItem = static_cast<GeneralGraphicsBaseItem *>(citem); if (childItem) { childItem->TransToSceneVertexs(); updateItemsModelList.append(childItem->GetModel()); } } auto eGItem = static_cast<GeneralGraphicsBaseItem *>(elementOutItem); if (eGItem) { eGItem->TransToSceneVertexs(); updateItemsModelList.append(eGItem->GetModel()); } } } changedItem->TransToSceneVertexs(); updateItemsModelList.append(changedItem->GetModel()); } } //发送更新的图元信息信号 auto mediator = this->mCoordinator->GetMediator(); if (mediator) { GG_SDK_LOG_TRACE("SigGGMediatorUpdateGraphicsItem %d", updateItemsModelList.count()); emit mediator->SigGGMediatorUpdateGraphicsItem(updateItemsModelList); } } this->mChangedItemsMap.clear(); } //发送选中的图元信息信号 auto mediator = this->mCoordinator->GetMediator(); if (mediator && this->selectedItems().count() < 10) { auto resList = GeneralGraphicsUtils::GetSelectedGraphicsItemIndexFromScene(this->selectedItems()); if (!resList.isEmpty()) { emit mediator->SigGGMediatorSelectItems(resList); } } GG_SDK_LOG_TRACE("graphics item count: %d", this->mGrpahicsItemsMap.count()); qDebug(u8"graphics item count: %d", this->mGrpahicsItemsMap.count()); }讲解一下这个代码,是做什么的逐行讲一下
10-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值