CGameObject* CFactory::InstantiatePrototype(const string &AProtoName, const string &AName /*= ""*/) { CXMLNode *xml = GetPrototypeXML(AProtoName); if (!xml) { Log("ERROR", "Can't create prototype instance: no such prototype: '%s'", AProtoName.c_str()); return NULL; } CGameObject *result = New<CGameObject>(AName); if (AName.empty()) result->SetName(AProtoName + itos(result->GetID())); result->Prototype = true; result->Deserialize(xml); SetRecursionLimit(AProtoName, from_string<int>(xml->SafeGetAttribute("RecursionLimit", "-1"))); TraversePrototypeNode(xml, result, result); result->FinalizeCreation(); Log("INFO", "Prototype INSTANTIATED: '%s', instance name: '%s'", AProtoName.c_str(), result->GetName().c_str()); return result; }
void CBullet_ScubaSolider::OnCollision(float deltaTime, std::vector<CGameObject*>* listObjectCollision) { float normalX = 0; float normalY = 0; float moveX = 0.0f; float moveY = 0.0f; float timeCollision; std::vector<CGameObject*>::iterator it; // kiem tra co phai la vien dan dau tien hay k if (!this->m_isFirstBullet) { for (it = listObjectCollision->begin(); it != listObjectCollision->end(); ++it) { CGameObject* obj = *it; // Neu doi tuong la ground if (obj->GetIDType() == 15 && (obj->GetID() == 1 || obj->GetID() == 8)) { timeCollision = CCollision::GetInstance()->Collision(this, obj, normalX, normalY, moveX, moveY, deltaTime); if ((timeCollision > 0.0f && timeCollision < 1.0f) || timeCollision == 2.0f) { if (normalY > 0) { if (this->m_vy <= 0) { // Gan trang thai die cho doi tuong CGameObject* effect = CPoolingObject::GetInstance()->GetEnemyEffect(); effect->SetAlive(true); effect->SetPos(this->m_pos); this->SetAlive(false); } } } } } } }
// Control void CGameControllerRemote::Control(void* _data) { CGameObject *obj = static_cast<CGameObject*>(_data); float x, y; std::string message = CConnectionManager::getInstance()->GetData(obj->GetID()); if (message != "none") { x = atof(message.substr(0, message.find(';')).c_str()); message = message.substr(message.find(';') + 1, message.length()); y = atof(message.substr(0, message.length()).c_str()); obj->SetX(x); obj->SetY(y); } }
void CSoldier::OnCollision(float deltaTime, std::vector<CGameObject*>* listObjectCollision) { float normalX = 0; float normalY = 0; float moveX = 0.0f; float moveY = 0.0f; float timeCollision; for (std::vector<CBullet*>::iterator it = CPoolingObject::GetInstance()->m_listBulletOfObject.begin(); it != CPoolingObject::GetInstance()->m_listBulletOfObject.end();) { CBullet* obj = *it; timeCollision = CCollision::GetInstance()->Collision(obj, this, normalX, normalY, moveX, moveY, deltaTime); if((timeCollision > 0.0f && timeCollision < 1.0f) || timeCollision == 2.0f) { if(obj->IsAlive() && obj->GetLayer() == LAYER::PLAYER) { // Gan trang thai die cho doi tuong this->m_stateCurrent = SOLDIER_STATE::S_IS_DIE; // Xoa vien dan ra khoi d.s it = CPoolingObject::GetInstance()->m_listBulletOfObject.erase(it); //Load sound die ManageAudio::GetInstance()->playSound(TypeAudio::ENEMY_DEAD_SFX); // Tang diem cua contra len CContra::GetInstance()->IncreateScore(500); } else ++it; } else { ++it; } } if (this->m_stateCurrent != SOLDIER_STATE::S_IS_DIE) { //Kiem tra va cham voi ground bool checkColWithGround = false; // xet va cham vs ground for (std::vector<CGameObject*>::iterator it = listObjectCollision->begin(); it != listObjectCollision->end(); it++) { CGameObject* obj = *it; //Lay thoi gian va cham //Neu doi tuong la ground va dang va cham if(((obj->GetIDType() == 15 && obj->GetID() == 1) || (obj->GetIDType() == 15 && obj->GetID() == 8) || (obj->GetIDType() == 16 && obj->GetID() == 1)) && !checkColWithGround) { timeCollision = CCollision::GetInstance()->Collision(this, obj, normalX, normalY, moveX, moveY, deltaTime); if((timeCollision > 0.0f && timeCollision < 1.0f) || timeCollision == 2.0f) { if(normalY > 0) { checkColWithGround = true; if (this->m_stateCurrent == SOLDIER_STATE::S_IS_JUMP) { if (this->m_vy < -200.0f) { this->m_stateCurrent = SOLDIER_STATE::S_IS_JOGGING; if( timeCollision == 2.0f) { //this->m_isJumping = false; this->m_pos.y += moveY; this->m_vy = 0; this->m_a = 0; } } } else { this->m_stateCurrent = SOLDIER_STATE::S_IS_JOGGING; if( timeCollision == 2.0f) { //this->m_isJumping = false; this->m_pos.y += moveY; this->m_vy = 0; this->m_a = 0; } } } } } } if(!checkColWithGround) { this->m_a = -700.0f; if (this->m_jump) { if(this->m_vy == 0.0f) this->m_vy = this->m_vyDefault; this->m_stateCurrent = SOLDIER_STATE::S_IS_JUMP; } else { // Soldier quay dau nguoc lai. this->m_left = !this->m_left; this->m_countRepeat ++; if (m_countRepeat > 2) { this->m_countRepeat = 0; this->m_jump = true; } // Xet gia tri tiep theo la nhay. //this->m_jump = true; } } } }