示例#1
0
/*virtual*/ void Bullet::Update(float dt) /*override*/
{
	SGD::Rectangle rect;
	rect.top = m_ptPosition.y;
	rect.left = m_ptPosition.x;
	rect.Resize(bulletSize*dist);
	TileLayer *layer0 = World::GetInstance()->GetTileLayers()[0];
	if (rect.top < 0.0f
		|| rect.left < 0.0f
		|| rect.bottom >= layer0->layerRows * layer0->GetTileSize().width
		|| rect.right >= layer0->layerColumns * layer0->GetTileSize().height
		)
	{
		return;
	}

	// if this bullet goes outside bullet dropoff range...
	if (owner->GetOwner() && (m_ptPosition - startPoint).ComputeLength() > bulletDropOff)
	{
		// create a message to destroy this bullet
		DestroyEntityMsg* msg = new DestroyEntityMsg(this);

		// dispatch the destroy message
		SGD::MessageManager::GetInstance()->GetInstance()->QueueMessage(msg);
	}

	if (gunActive)
	{
		dist += 0.075f;
		if (dist > 1.75f)
			dist = 1.75f;
	}

	// if bullet collides with tile, play collision sound
	//if (owner->GetGunType() != Weapon::GunType::meleeWeapon)
		
	// if not, update bullet
	Entity::Update(dt);

	TileLayer* collisionLayer = GameplayState::GetInstance()->GetWorld()->GetTileLayers()[1];
	const SGD::Point ref_position = { m_ptPosition.x + m_szSize.width*0.5f, m_ptPosition.y + m_szSize.height*0.5f };
	const int tileSize_width = (int)collisionLayer->GetTileSize().width;
	const int tileSize_height = (int)collisionLayer->GetTileSize().height;
	const int tilesWide = collisionLayer->layerColumns - 1;
	const int tilesHigh = collisionLayer->layerRows - 1;
	SGD::Point index = { Math::Clamp((ref_position.x / (float)tileSize_width), 0.f, (float)tilesWide), Math::Clamp(ref_position.y / (float)tileSize_height, 0.f, (float)tilesHigh) };

	Tile* tile_at = collisionLayer->GetTileAt(int(index.x), int(index.y));

	if (tile_at && !tile_at->isPassable)
	{
		if (tile_at->event != "bp" && owner->GetGunType() != Weapon::GunType::meleeWeapon && owner->GetGunType() != Weapon::GunType::MutantAtk)
		{
			SGD::AudioManager::GetInstance()->PlayAudio(GameplayState::GetInstance()->bulletImpact);
			DestroyEntityMsg* msg = new DestroyEntityMsg(this);
			msg->QueueMessage();
		}
	}
}
void EntityManager::RenderMinimap(void)
{
	// store default values for this function
	const SGD::Point scr_offset = SGD::Point(Game::GetInstance()->GetScreenWidth() - 200.0f, Game::GetInstance()->GetScreenHeight() - 160.f);
	const SGD::Size map_size = { 0.14f, 0.14f };

	// get a pointer to the camera
	Camera* camera = World::GetInstance()->GetCamera();

	// create matricies to translate from world space to screen space
	D3DXMATRIX scale;
	D3DXMatrixScaling(&scale, map_size.width, map_size.height, 0.f);
	D3DXMATRIX offset;
	D3DXMatrixTranslation(&offset, scr_offset.x, scr_offset.y, 0.f);
	D3DXMATRIX transform = World::GetInstance()->GetCamera()->GetMatrix() * scale * offset;

	// send the transform to the graphics manager
	SGD::GraphicsManager::GetInstance()->SetTransform(transform);

	// get the clipping rectangle for the mini map
	SGD::Rectangle rect = camera->GetRect();
	rect.Inflate(SGD::Size(200.f, 200.f));

	// draw the background of the mini map
	SGD::GraphicsManager::GetInstance()->DrawRectangle(rect, SGD::Color::Black);

	// store the collision layer
	TileLayer* collisionLayer = World::GetInstance()->GetTileLayers()[1];
	// store the visual layer
	TileLayer* visualLayer = World::GetInstance()->GetTileLayers()[0];

	// store tile width and height values
	float tile_width = collisionLayer->GetTileSize().width;
	float tile_height = collisionLayer->GetTileSize().height;

	// iterate y
	for (unsigned int y = (unsigned int)fabs(rect.top / tile_height); y < rect.bottom / tile_height; y++)
	{
		// iterate x
		for (unsigned int x = (unsigned int)fabs(rect.left / tile_width); x < rect.right / tile_width; x++)
		{

			// store the tile we're on now
			Tile* tile = collisionLayer->GetTileAt(x, y);

			if (!tile || !tile->isPassable)
				continue;

			// find the boundind rect of this tile
			SGD::Rectangle tile_rect = { x * tile_width, y * tile_height, x * tile_width + tile_width, y * tile_height + tile_height };

			// store alpha values for the edges of the screen
			float alpha_left = Math::Ceiling(Math::distance(tile_rect.left, rect.left), 100.f) / 10.f;
			float alpha_right = Math::Ceiling(Math::distance(tile_rect.right, rect.right), 100.f) / 10.f;
			float alpha_top = Math::Ceiling(Math::distance(tile_rect.top, rect.top), 100.f) / 10.f;
			float alpha_down = Math::Ceiling(Math::distance(tile_rect.bottom, rect.bottom), 100.f) / 10.f;
			float alpha_road = 1.f;

			// check to see if this is a road on the visual layer
			if (visualLayer->GetTileAt(x, y)->tileNumber == 6)
				alpha_road = 0.8f;

			// alpha_left = Math::lerp(1.f, 0.f, alpha_left);
			// alpha_right = Math::lerp(1.f, 0.f, alpha_right);
			// alpha_top = Math::lerp(1.f, 0.f, alpha_top);
			// alpha_down = Math::lerp(1.f, 0.f, alpha_down);

			float alpha_total = alpha_left + alpha_right + alpha_top + alpha_down;
			alpha_total /= 40.f;

			alpha_total *= alpha_road;

			SGD::Color blend_color = SGD::Color::White;
			blend_color.alpha = char(255.f * alpha_total);

			// if the tile is passible, and visible on the minimap and not clipping 
			// the clipping rectangle, draw the visible tile
			if (tile->isPassable && tile_rect.IsIntersecting(rect) && !tile_rect.IsClipping(rect))
				SGD::GraphicsManager::GetInstance()->DrawTexture(passableTileTex, SGD::Point(x * collisionLayer->GetTileSize().width, y * collisionLayer->GetTileSize().height), 0.f, { 0.f, 0.f }, blend_color);
		}
	}


	// for all buckets of entities
	for (unsigned int i = 0; i < m_tEntities.size(); i++)
	{
		// get the current bucket we're on
		std::vector<IEntity*>& bucket = m_tEntities[i];
		for (unsigned int ii = 0; ii < bucket.size(); ii++)
		{
			// store what object we're on right now
			IEntity* at = bucket[ii];
			// try to cast the entity to an IMinimapvisible
			IMinimapVisible* ent = dynamic_cast<IMinimapVisible*>(at);

			// if the current entity is intersecting the camera rect
			if (ent && at->GetRect().IsIntersecting(rect) && !at->GetRect().IsClipping(rect))
			{
				// render the entity on the minimap
				ent->RenderMiniMap();
			}
		}
	}

	// reset camera matrix
	D3DXMATRIX identity;
	D3DXMatrixIdentity(&identity);
	SGD::GraphicsManager::GetInstance()->SetTransform(identity);
}