From b450c1b2aed138df48a1fc0aa40e3fa679a7db08 Mon Sep 17 00:00:00 2001 From: w-mj Date: Mon, 25 Dec 2017 11:43:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=A6=E7=A6=BB=E5=BC=80=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E6=AD=A3=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- car.cpp | 7 +++++++ parkingLotManager.cpp | 25 ++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/car.cpp b/car.cpp index 9d9bfaf..cd03b72 100644 --- a/car.cpp +++ b/car.cpp @@ -1,5 +1,6 @@ #include "car.h" #include "logwindow.h" +#include Car::Car(ParkingLotManager * manager, QGraphicsItem *parent, int dir, Car::Color color) : @@ -35,6 +36,12 @@ Car::Car(ParkingLotManager * manager, QGraphicsItem *parent, int dir, Car::Color connect(this, &Car::queueHead, manager, &ParkingLotManager::requestIn); connect(this, &Car::exit, manager, &ParkingLotManager::leave); connect(this, &Car::stair, manager, &ParkingLotManager::requestStair); + + // 测试:创建10s后离开 + QTimer *timer = new QTimer(this); + connect(timer, &QTimer::timeout, [this, manager](){emit manager->requestOut(this);}); + timer->setSingleShot(true); + timer->start(10000); } void Car::Forward(qreal vel) diff --git a/parkingLotManager.cpp b/parkingLotManager.cpp index 1d52d5e..8ab97fc 100644 --- a/parkingLotManager.cpp +++ b/parkingLotManager.cpp @@ -136,8 +136,17 @@ void ParkingLotManager::drawPath(int n1, int n2) void ParkingLotManager::requestOut(Car *car, int exit) { if (exit != -1) - exit = rand() % m_num_of_entry; - Path *p; // TODO:请求出口 + exit = rand() % m_num_of_entry + 1; + Path *p; + if (car->getCurrentFloor() == 1) + p = m_graph[1]->findPath(NODE_TYPE::space, car->getNum(), NODE_TYPE::exit, exit); + else + p = m_graph[car->getCurrentFloor()]-> + findPath(NODE_TYPE::space, car->getNum(), NODE_TYPE::stair, exit); + car->setNum(-exit); // 负数代表出口 + car->setPath(p); + car->setTargetFloor(1); + car->followPath(); } void ParkingLotManager::requestStair(Car *car) @@ -145,9 +154,17 @@ void ParkingLotManager::requestStair(Car *car) int l = car->getTargetFloor(); int n = car->getNum(); int e = car->getEntryNum(); - Path *p = m_graph[l]->findPath(NODE_TYPE::stair, e, NODE_TYPE::space, n); + Path *p; + if (n > 0) + p = m_graph[l]->findPath(NODE_TYPE::stair, e, NODE_TYPE::space, n); + else + p = m_graph[l]->findPath(NODE_TYPE::stair, e, NODE_TYPE::exit, -n); car->setPath(p); car->setCurrentFloor(l); + if (l == static_cast(m_current_floor)) + car->show(); + else + car->hide(); car->followPath(); } @@ -184,6 +201,8 @@ void ParkingLotManager::leave(Car* car) Log::i(QString("有车离开,当前共有%1个空车位").arg(m_pool.size())); emit carLeave(); emit setLoad(QString::number(m_capacity.at(l) - m_num_of_cars[l])); // 更新剩余车位 + car->hide(); + delete car; } void ParkingLotManager::addCar(int entry)