Esempio n. 1
0
void InClassProj::UpdateScene(float dt)
{
	ID3D11RasterizerState* rs;
	D3D11_RASTERIZER_DESC rsd;
	rsd.CullMode = D3D11_CULL_NONE;
	rsd.AntialiasedLineEnable = false;
	rsd.DepthBias = 0.0f;
	rsd.DepthBiasClamp = 0.0f;
	rsd.DepthClipEnable = true;
	rsd.FillMode = D3D11_FILL_SOLID;
	rsd.FrontCounterClockwise = true;
	rsd.MultisampleEnable = true;
	rsd.ScissorEnable = false;
	rsd.SlopeScaledDepthBias = 0.0f;
	md3dDevice->CreateRasterizerState(&rsd, &rs);
	md3dImmediateContext->RSSetState(rs);

	if (recoverTime > 0.0f)
	{
		recoverTime = recoverTime - dt;
	}
	else
	{
		recoverTime = 0.0f;
	}

	playerBB.pos.x = mPlayer->GetPos().m128_f32[0];
	playerBB.pos.y = mPlayer->GetPos().m128_f32[1];

	UpdateKeyboardInput(dt);
	
	m2DCam->Update();

	//update particles
	/*for (int i = 0; i < mParticles.size(); ++i)
	{
		XMVECTOR vel = XMLoadFloat3(&mParticles[i].vel);
		XMVECTOR pos = XMLoadFloat3(&mParticles[i].pos);
		pos = pos + vel;
		XMStoreFloat3(&mParticles[i].pos, pos);
	}
	UpdateParticleVB();*/

	//update player
	mPlayer->Update(dt);
	mPlayer->AddForce(XMVectorSet(0.0f, -9.8f, 0.0f, 0.0f));   //adds gravity
	//update enemy damage done to player
	for (int i = 0; i < enemies.size(); ++i)
	{
		if (PlayerEnemyCollision(mPlayer, enemies[i]) && recoverTime == 0.0f)
		{
			enemies[i]->ApplyDamage(mPlayer);
			recoverTime = 3.0f;   //player has 3 seconds before damage can be done to him again
		}
	}
	if (mPlayer->GetHealth() == 0)
	{ 
		//switch to game over state to display game over screen
	}

	//update enemies
	for (int i = 0; i < enemies.size(); ++i)
	{
		enemies[i]->Update(dt);
		enemies[i]->Chase(enemies, mPlayer, dt);

		//set health bars to above enemies' heads and red bar to adjust accordingly
		redXPos = enemies[i]->GetPos().m128_f32[0];
		currHealth = enemies[i]->GetHealth();
		maxHealth = 5.0f;
		ratio = 1.0f - (currHealth / maxHealth);
		redXPos += ((1.0f - ratio) / 2.0f) * 32.0f;
		redXScale = ratio/* * 32.0f*/;
		greenBarVec[i]->SetPos(XMVectorSet(enemies[i]->GetPos().m128_f32[0], enemies[i]->GetPos().m128_f32[1] + 32, 0.0f, 0.0f));
		redBarVec[i]->SetPos(XMVectorSet(redXPos, enemies[i]->GetPos().m128_f32[1] + 32, 0.0f, 0.0f));
		redBarVec[i]->SetScale(XMVectorSet(redXScale, 1.0f, 0.0f, 0.0f));

		//collision checks between enemies and playerBB		
		SpriteRectCollision(enemies[i], playerBB);

		//collision checks between enemies and environmentBBs
		for (int j = 0; j < boxes.size(); ++j)
		{
			SpriteRectCollision(enemies[i], boxes[j]);
		}

		//delete enemy upon death
		if (enemies[i]->GetHealth() == 0)
		{
			delete enemies[i];
			enemies.erase(enemies.begin() + i);
			i--;
			break;
		}
	}
	//when all enemies eliminated:
	if (enemies.size() == 0)
	{
  		EOLobjActive = true;
	}

	//collision between playerBB and environmentBBs
	for (int i = 0; i < boxes.size(); ++i)
	{
		RectRectCollision(playerBB, boxes[i], mPlayer);

		//update mGrounded bool for player jump
		if (RectRectCollision(playerBB, boxes[i], mPlayer) == CollisionSide::bot)
		{
			mPlayer->HitGround();
		}
	}

	//update projectiles
	for (int i = 0; i < mProjectiles.size(); ++i)
	{
 		mProjectiles[i]->Update(dt);
		for (int j = 0; j < enemies.size(); ++j)
		{
			if (mProjectiles[i]->GetDistanceTravelled() > mProjectiles[i]->MAX_DISTANCE ||
				mProjectiles[i]->GetDistanceTravelled() < mProjectiles[i]->MIN_DISTANCE)
			{
				delete mProjectiles[i];
				mProjectiles.erase(mProjectiles.begin() + i);
				i--;
				break;
			}
			//collision checks between enemies and projectiles	
			if (EnemyProjCollision(enemies[j], mProjectiles[i]))
			{
				mProjectiles[i]->ApplyDamage(enemies[j]);
				/*std::wstringstream ss;
				ss << enemies[j]->GetHealth();
				OutputDebugString(ss.str().c_str());
				OutputDebugString(L"\n");*/
				delete mProjectiles[i];
				mProjectiles.erase(mProjectiles.begin() + i);
				i--;
				break;
			}
		}
	}

	EOLobj->Update(dt);
		
	//update sounds
	sys->update();
}