예제 #1
0
	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);
	}
}
예제 #4
0
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;
			}
		}
	}
	
}