CScene::~CScene(void) { // Clean up DirectX stuff SafeRelease(g_pD3D); SafeRelease(g_pD3DDevice); // Clean up game objects removeObjects(); }
void CWorld::SpawnObject(CObject* obj, bool addSpawn) { if (obj->m_type != OT_MOVER && obj->m_type != OT_ITEM && obj->m_type != OT_CTRL) return; CSpawnObject* owner = (CSpawnObject*)obj; const QRect normalizedRect = owner->m_rect.normalized(); CSpawnObject* spawn; int i; if (addSpawn) { for (i = 0; i < owner->m_count - 1; i++) { spawn = (CSpawnObject*)CObject::CreateObject(owner->m_type); spawn->m_modelID = owner->m_modelID; spawn->m_scale = owner->m_scale; if (!spawn->Init()) { Delete(spawn); return; } D3DXVECTOR3 randomPos; randomPos.z = (float)normalizedRect.left() + (float)(rand() % ((normalizedRect.width() - MPU) * 20)) / 20.0f; randomPos.x = (float)normalizedRect.top() + (float)(rand() % ((normalizedRect.height() - MPU) * 20)) / 20.0f; if (spawn->m_type == OT_MOVER && ((CMover*)spawn)->m_moverProp->fly) randomPos.y = (float)((int)(owner->m_pos.y) - 20 + (rand() % 40)); else randomPos.y = GetHeight(randomPos.x, randomPos.z); spawn->SetRot(D3DXVECTOR3(0, (float)(rand() % 36000) / 100.0f, 0)); spawn->SetPos(randomPos); spawn->m_isReal = false; spawn->m_owner = owner; AddObject(spawn); } } else { CPtrArray<CObject> removeObjects(owner->m_count - 1); for (i = 0; i < m_objects[owner->m_type].GetSize(); i++) { if (((CSpawnObject*)m_objects[owner->m_type].GetAt(i))->m_owner == owner) removeObjects.Append(m_objects[owner->m_type].GetAt(i)); } for (i = 0; i < removeObjects.GetSize(); i++) DeleteObject(removeObjects[i]); } }
void ObjectTracker::matchObjects(CvPoint *newCenters, int size) { if (currObjs_.empty()) { for (int i=0; i<size; i++) { createNewObject(newCenters[i]); } return; } if (size == 0) { removeObjects(); } int parameter = imgSize_.width + imgSize_.height; int rows = currObjs_.size(); int cols = size; objsM_ = new double*[rows]; for (int i=0; i<rows; i++) { objsM_[i] = new double[cols]; } CvPoint *predictedPnts = new CvPoint[rows]; for (int i=0; i<rows; i++) { predictedPnts[i] = currObjs_[i].predictNextPosition(); } for (int i=0; i<rows; i++) { for (int j=0; j<cols; j++) { CvPoint distance = subVectors(predictedPnts[i], newCenters[j]); objsM_[i][j] = getMagnitude(distance) / parameter; } } vector<int> list; // Check columns for (int j=0; j<cols; j++) { list.clear(); for (int i=0; i<rows; i++) { if (objsM_[i][j] < matchThreshold_) { list.push_back(i); } } switch (list.size()) { case 0: // New object createNewObject(newCenters[j]); break; case 1: break; default: break; } } // Check rows vector<int> removedObjectsv; removedObjectsv.clear(); for (int i=0; i<rows; i++) { list.clear(); for (int j=0; j<cols; j++) { if (objsM_[i][j] < matchThreshold_) { list.push_back(j); } } switch(list.size()) { case 0: // No more match removedObjectsv.push_back(i); break; case 1: currObjs_[i].correctPosition(newCenters[list[0]]); break; default: break; } } removeObjects(&removedObjectsv); //printMatrix(objsM_, rows, cols); for (int i=0; i<rows; i++) { delete[] objsM_[i]; } delete[] objsM_; }