프로그래밍 공부
작성일
2024. 5. 12. 17:18
작성자
WDmil
728x90

 

void Pacman::SetItem()
{
	std::random_device rd;  // 랜덤 디바이스
	std::mt19937 generator(rd());  // 머클 트위스터 엔진을 사용
	std::uniform_int_distribution<int> distribution(1, 100);  // 원하는 범위의 분포

	// 난수 생성
	int random_value;
	int item_Count = 20;
	int terX = terrain->GetWidth() / item_Count;
	int terY = terrain->GetHeight() / item_Count;

	// 맵에 아이템 뿌리는 함수
	for (int i = 0; i < item_Count; i++)
	{
		for (int j = 0; j < item_Count; j++)
		{
			random_value = distribution(generator);
			Vector3 onpos = terrain->GetOnGrondPosition(Vector3(i * terX, 0, j * terY)) + Vector3(0, 0.5, 0);
			if (onpos.y < 2)
			{
				Item* insert = new Coin(onpos);;
				if (random_value < 10)
					insert = new Bullet(onpos);
				else {
					insert = new Coin(onpos);
					MaxCoinCount++;
				}

				itemFild.push_back(insert);
			}
		}
	}
}
 

아이템 배치코드.

 

맵에 배열로 아이템을 뿌리는데, 조건하. Map상의 높이값이 일정값 이상 나오면 배치를 취소하고 다음으로 넘어갑니다.

맵에 배치되는 아이템은 10%확률로 코인이 아니라 Bullet으로 배치됩니다.

void Pacman::CollisionChack()
{
	vector<Item*> outlist;
	// 아이템과 플레이어 충돌검사.
	for (Item*& item : itemFild)
	{
		// 충돌시
		if (item->IsCollision(player))
		{
			// 아이템 타입에 따라 갯수 더해주고 렌더중지.
			switch (item->GetItemType())
			{
			case 1:

				item->GetItem(CountBullet);
				break;
			case 2:

				item->GetItem(CountCoin);
				player->GetLightBat() += 10;
				break;
			}
			outlist.emplace_back(item);
		}
	}

	for (Item*& item : outlist)
	{
		itemFild.remove(item);
	}
}
 

충돌검사 후 충돌시, 아이템을 삭제함. 배터리 아이템 흭득시 플레이어의 배터리에 10이 추가됩니다.

 

배터리는 초당 1씩 깎입니다.

 

void ShootingPlayer::UpdateLightBat()
{
	Vector3 cameraFront = Environment::Get()->GetMainCamera()->GetForward();
	cameraFront.Normalized();
	light->position = Environment::Get()->GetMainCamera()->GetLocalPosition();
	light->direction = cameraFront + Vector3(0, 0.001, 0);
	float Lightouter = 29;
	float Lightinner = 83;

	if (LightBat > 30) {
		light->outer = Lightouter * Sigmoid(LightBat, 0.2f, 10.0);
		light->inner = Lightinner * Sigmoid(LightBat, 0.2f, 10.0);
	}
	else
	{
		if (lightBatdelta < 360)
			lightBatdelta += DELTA * 20;
		else
			lightBatdelta = 0;

		light->outer = Lightouter * Sigmoid(LightBat, 0.2f, 10.0) * (sin(lightBatdelta));
		light->inner = Lightinner * Sigmoid(LightBat, 0.2f, 10.0);
	}
	lightBar->SetLocalScale(Vector3(LightBat * 0.01, 1, 1));
	lightBar->UpdateWorld();

	if (LightBat > 0) {
		LightBat -= DELTA * 10 ;
	}
	else
	{
		light->isActive = false;
	}
}

float ShootingPlayer::Sigmoid(float x, float k, float x0)
{
	return 1.0 / (1.0 + exp(-k * (x - x0)));
}
 

플레이어의 LightSet코드

시간이 지날때마다 일정값씩 라이트가 빠져나가는 코드입니다.

 

라이트의 배율문제상 직선형 감쇠일시 일정값 밑에서 너무 어두워지는 현상이 발생해서.

시그모이드 함수를 사용해 감쇠를 어느정도 보정해주었습니다.

 

라이트가 30밑으로 떨어졌을 시, 깜빡이는 효과를 추가했습니다..

간단하게 sin에 lightBatdelta를 넣어서 반지름값만큼 곱해버렸습니다.

대강 위와같이 생긴 함수로 0으로 수렴하는데,

지정위치까지 오기전에는 감쇠값이 낮다가 지정된 위치부터 감쇠가 커지는 함수입니다.

 

움직일때, 카메라의 위빙도 넣으려고 했으나 마무리했던 시간이 2시30분이라 시간상 카메라 위빙은 포기했습니다.

 

 

작업중 ObjectCollision의 오류가 발생해서 왜그런가 했더니.

 

Player에서 UpdateWorld를 선언해주어야 오류없이 Collision객체가 월드상에 배치됩니다.

그걸 못찾아서 시간좀 썻습니다.

 

Bullet::Bullet(Vector3 Pos)
{
	ItemType = Item::Ammo;
	SetLocalPosition(Pos);
	Object = new Cube();
	Object->GetMaterial()->SetDiffuseMap(L"Textures/Landscape/Ammo.png");

	Object->SetLocalPosition(Pos);

	light = Environment::Get()->SetLight();
	Lightsetting();

}

void Bullet::Lightsetting()
{
	LightBuffer::Light* lightset = Environment::Get()->GetLight(light-1);

	lightset->isActive = true;

	lightset->position = GetLocalPosition() + Vector3(0, 2, 0);
	Vector3 direct = GetLocalPosition() - lightset->position;
	direct.Normalized();
	lightset->direction = direct;
	lightset->type = 2;
	lightset->range = 20;
	lightset->color = { 0, 0.3, 0.7, 1 };
	lightset->attentionIntensity = 0.5;
	lightset->outer = 33;
	lightset->inner = 74;
}



 

총알에 수직으로 비추어주는 라이트를 생성했습니다.

 

라이팅이 시작시 자동으로 세팅됩니다.

 

전역변수로 있는 light의 변수값에 참조하여 1씩 증가시켜서 넣었습니다.

 

Bullet의 생성확률은 10%임으로, 전채객체가 약 200개 일경우, 많아야 15개에서 20개 나타나기에, 최대 라이팅 개수를 100개로 늘려놓고 작업하였습니다.

 

미니맵은 넣을까 하다가 목표한 이중카메라에 실패해서 넣지 않았습니다.

 

728x90

'작업사항 정리 > DIrectX3D' 카테고리의 다른 글

Animation  (0) 2024.05.13
DirectX3D 작업물 몰아넣은 Git  (0) 2024.05.13
Collision & 회전  (0) 2024.05.12
인스턴싱 & 무한  (0) 2024.05.12
상점기능 구현  (0) 2024.05.12