예제 #1
0
BallMovement BallMovementCalculator::CalculateBallMovement(TimedDetectedBall timedDetectedBall)
{
	Mat image(480,640, CV_8UC3, Scalar(0,0,0));

	if (!timedDetectedBall.IsDetected)
	{
		return BallMovement::BallNotDetected();
	}

	if(timedDetectedBall.DetectionTime - m_SamplesArray[0].DetectionTime > 2)
	{
		ResetSamples();
	}

	if (IsNewSampleRelevant(timedDetectedBall))
	{
		PushDetectedBallToQueue(timedDetectedBall);
	}

//	if (!IsEnoughSamples())
//	{
//		return BallMovement::NotEnoughSamples();
//	}

	vector<TimedDetectedBall> relevantSamples = GetRelevantSamples();

	if(relevantSamples.size() < MIN_NUM_OF_SAMPLES_TO_APPROX)
	{
		return BallMovement::NotEnoughSamples();
	}

//	if (!IsTimeDiffValid())
//	{
//		return BallMovement::InvalidTimeDiff();
//	}
//
//	if (!IsLocationDiffValid())
//	{
//		return BallMovement::InvalidLocationDiff();
//	}

	LeastSquareApprox* ballMovementApprox = LineApprox::Approx(GetYValues(relevantSamples), GetXValues(relevantSamples));
	JumpDirection jumpDirection = CalculateDirection(ballMovementApprox);

	LeastSquareApprox* timingApprox = ParabolaApprox::Approx(GetYValues(relevantSamples), GetTimes(relevantSamples));
	float msToJump = CalculateJumpingTime(timingApprox);

	BallMovement ballMovement(jumpDirection, msToJump);

	if(DEBUG_MODE)
	{
		PrintCalculationData(image, relevantSamples);
		ballMovement.PrintDetailsOnImage(image, Point(0, (NUM_OF_SAMPLES + 1)*20));
	}
	imshow("Ball movement calc", image);

	return ballMovement;
}
예제 #2
0
파일: Snake.cpp 프로젝트: zaped212/LED_Cube
void Snake::Begin()
{
	size = 0;
	Body = (Voxel**)malloc(sizeof(Voxel*)*MaxLength);
	Cube->CreateCubeOff();
	
	Cur_x = random()%8;
	Cur_y = random()%8;
	Cur_z = random()%8;
	
	AddBody(Cur_x,Cur_y,Cur_z);
	
	Reset = !CalculateDirection();
	StartTime = millis();
}
예제 #3
0
파일: Snake.cpp 프로젝트: zaped212/LED_Cube
void Snake::Update()
{
	if(!Reset && millis() > StartTime + Delay)
	{
		StartTime = millis();
		// while not in range, and selected voxel is not currently turned on
		if(Length <= 0 || !Cube->InRange(Cur_x + Dir_x,Cur_y + Dir_y,Cur_z + Dir_z) ||Cube->GetVoxel(Cur_x + Dir_x,Cur_y + Dir_y,Cur_z + Dir_z) == 1)
		{
			Reset = !CalculateDirection();
		}
		Cur_x += Dir_x;
		Cur_y += Dir_y;
		Cur_z += Dir_z;

		Length--;
		AddBody(Cur_x,Cur_y,Cur_z);
	}
	else if(Reset && millis()-(Delay+2000) > StartTime)
	{
		DeleteArray();
		Begin();
	}
}
void Player::UpdateMe()
{
	float angle = atan2(m_dashDirection.z, m_dashDirection.x);
	DirectX::XMFLOAT3 position = DirectX::XMFLOAT3(m_position.x, 2.0f, m_position.z);
	m_trail->Update(position, angle);

	//Required for ambient 3D sounds
	if (m_sound != nullptr){
		m_sound->UpdateAmbientSound(m_position.x, m_position.y, m_position.z);
	}

	if (m_updateVisibility)
	{
		m_updateVisibility = false;
		GraphicsEngine::UpdateVisibilityPolygon(Point(m_position.x, m_position.z), (float)GLOBAL::GetInstance().GetDeltaTime());
	}

	// Check values from server
	if (Network::GetInstance()->IsConnected())
	{
		SetHealth(Network::GetInstance()->GetMyPlayer().currentHP);
		SetMaxHealth(Network::GetInstance()->GetMyPlayer().maxHP);
		SetIsAlive(Network::GetInstance()->GetMyPlayer().isAlive);
		SetTeam(Network::GetInstance()->GetMyPlayer().team);
		SetGuID(Network::GetInstance()->GetMyPlayer().guid);
		//SetPosition(DirectX::XMFLOAT3(Network::GetInstance()->GetMyPlayer().x, Network::GetInstance()->GetMyPlayer().y, Network::GetInstance()->GetMyPlayer().z));
	}

	float directionAngle = DirectX::XMVector3AngleBetweenVectors(DirectX::XMLoadFloat3(&m_attackDir), DirectX::XMLoadFloat3(&m_direction)).m128_f32[0];

	if (directionAngle > (3.14f * 0.625f))
	{
		m_speed = m_originalSpeed * 0.85f;
	}
	else
	{
		SetSpeed(m_originalSpeed);
	}
	
	for (unsigned int i = 0; i < m_stickyTrapList.size(); i++)
	{		
		if (Collisions::SphereSphereCollision(m_playerSphere, m_stickyTrapList[i]->GetStickyTrapSphere()))
		{
			SetSpeed(m_speed * STICKY_TRAP_SLOW_PRECENTAGE);
			break;
		}
	}


	UpdateBlood();

	// Don't update player if he is dead
	if (!m_isAlive || Network::GetInstance()->GetMatchOver())
	{
		m_ability = m_noAbility;
		// Animation None ?
		UpdateAbilities();
		UpdateAbilityBar();
		AnimatedObject::ChangeAnimationState(AnimationState::None);
		if (m_sound != nullptr && m_soundEmitter != nullptr){
			m_sound->StopAmbientSound(m_soundEmitter);
		}

		return;
	}

	// Check for dash
	if (Network::GetInstance()->HaveDashed())
	{		
		// Calc distance
		float dx = Network::GetInstance()->GetDashLocation().x - m_position.x;
		float dz = Network::GetInstance()->GetDashLocation().z - m_position.z;
		m_dashDistanceLeft = sqrt(dx * dx + dz * dz);

		// Calc dir
		DirectX::XMVECTOR tempVector = DirectX::XMLoadFloat3(&DirectX::XMFLOAT3(dx, 0, dz));
		tempVector = DirectX::XMVector3Normalize(tempVector);
		DirectX::XMStoreFloat3(&m_dashDirection, tempVector);

		m_isDashing = true;

		m_trail->StartEmiting();
	}

	// Dash movement
	if (m_isDashing)
	{
		float distance = DASH_SPEED * m_speed * (float)GLOBAL::GetInstance().GetDeltaTime();

		Sphere playerSphere = m_playerSphere;
		playerSphere.m_position.x += m_dashDistanceLeft * m_dashDirection.x;
		playerSphere.m_position.z += m_dashDistanceLeft * m_dashDirection.z;		

		if (!CollisionManager::GetInstance()->CheckCollisionWithAllStaticObjects(playerSphere))
		{
			if (distance >= m_dashDistanceLeft)
			{
				m_position.x += m_dashDistanceLeft * m_dashDirection.x;
				m_position.z += m_dashDistanceLeft * m_dashDirection.z;
				m_dashDistanceLeft = 0.0f;
				m_isDashing = false;

				Network::GetInstance()->SendAnimationState(AnimationState::None);

				m_trail->StopEmiting();
			}
			else
			{
				m_position.x += (DASH_SPEED * m_speed * (float)GLOBAL::GetInstance().GetDeltaTime()) * m_dashDirection.x;
				m_position.z += (DASH_SPEED * m_speed * (float)GLOBAL::GetInstance().GetDeltaTime()) * m_dashDirection.z;
				m_dashDistanceLeft -= distance;
			}

			// If we dashed, update shadow shapes.
			GraphicsEngine::UpdateVisibilityPolygon(Point(m_position.x, m_position.z), (float)GLOBAL::GetInstance().GetDeltaTime());
			// Force network to send pos
			Network::GetInstance()->SendLatestPos();
		}

		else
		{
			m_isDashing = false;

			Network::GetInstance()->SendAnimationState(AnimationState::None);

			m_trail->StopEmiting();
		}

		SendPosition(m_position);
	}

	// Move.
	if ((CalculateDirection() || Network::GetInstance()->ConnectedNow()) && !m_isDashing)
	{
		SetCalculatePlayerPosition();

		// If we moved, update shadow shapes.

		GraphicsEngine::UpdateVisibilityPolygon(Point(m_position.x, m_position.z), (float)GLOBAL::GetInstance().GetDeltaTime());

		//Update sound (walking)
	
		m_sound->StartAmbientSound(m_soundEmitter);
		m_soundEmitter->m_pos.x = position.x;
		m_soundEmitter->m_pos.y = position.y;
		m_soundEmitter->m_pos.z = position.z;
	}
	else{
		m_sound->StopAmbientSound(m_soundEmitter);
	}
	m_playerSphere.m_position = m_position;
	
	// Check if the player have made an invalid move
	if (Network::GetInstance()->MadeInvalidMove())
	{
		PlayerNet myPlayer = Network::GetInstance()->GetMyPlayer();
		SendPosition(DirectX::XMFLOAT3(myPlayer.x, myPlayer.y, myPlayer.z));
		Network::GetInstance()->UpdatedMoveFromInvalidMove();

		m_updateVisibility = true;
	}

	// Check if the player need to respawn
	if (Network::GetInstance()->HasRespawned())
	{
		PlayerNet myPlayer = Network::GetInstance()->GetMyPlayer();
		SendPosition(DirectX::XMFLOAT3(myPlayer.x, myPlayer.y, myPlayer.z));
		Network::GetInstance()->SetHaveRespawned();

		m_updateVisibility = true;
	}

	if (Settings::GetInstance()->m_apeToggle)
	{
		if (InputManager::GetInstance()->IsKeyClicked(VkKeyScan(VK_SPACE)))
		{
			m_onPressed = !m_onPressed;
			GLOBAL::GetInstance().APE_ON = !m_onPressed;
		}
	}
	else
	{
		if (InputManager::GetInstance()->IsKeyPressed(VkKeyScan(VK_SPACE)))
		{
			if (Settings::GetInstance()->m_apeEnabled)
			{
				m_onPressed = false;
				GLOBAL::GetInstance().APE_ON = true;
			}
			else
			{
				m_onPressed = true;
				GLOBAL::GetInstance().APE_ON = false;
			}
		}
		else
		{
			if (Settings::GetInstance()->m_apeEnabled)
			{
				m_onPressed = true;
				GLOBAL::GetInstance().APE_ON = false;
			}
			else
			{
				m_onPressed = false;
				GLOBAL::GetInstance().APE_ON = true;
			}
		}
	}

	m_ability = m_noAbility;
	CheckForSpecialAttack();
	if (m_onPressed)
	{
		// Range attack
		if (InputManager::GetInstance()->IsRightMousePressed())
		{
			// Check cd so m_ability does not get set if u have cooldown preventing other abilities to be casted.
			if (m_rangeAttack->GetStacks() > 0 || m_rangeAttack->GetStacks() == -1)
			{
				m_ability = m_rangeAttack;
			}
			else
			{
				StillCDText();
			}
		}
		// Melee attack
		if (InputManager::GetInstance()->IsLeftMousePressed())
		{
			if ((float)m_meleeAttack->GetCooldown() <= 0.0f)
			{
				m_ability = m_meleeAttack;
			}
			else
			{
				StillCDText();
			}
		}
	}
	else
	{		
		// Range attack
		if (InputManager::GetInstance()->IsRightMouseClicked())
		{
			// Check cd so m_ability does not get set if u have cooldown preventing other abilities to be casted.
			if (m_rangeAttack->GetStacks() > 0 || m_rangeAttack->GetStacks() == -1)
			{
				m_ability = m_rangeAttack;
			}
			else
			{
				StillCDText();
			}
		}
		// Melee attack
		if (InputManager::GetInstance()->IsLeftMouseClicked())
		{
			if ((float)m_meleeAttack->GetCooldown() <= 0.0f)
			{
				m_ability = m_meleeAttack;
			}
			else
			{
				StillCDText();
			}
		}
	}

	// Count down cooldowns
	UpdateAbilities();
	throwDistance = CollisionManager::GetInstance()->CalculateMouseDistanceFromPlayer(m_position);
	if (m_ability != m_noAbility && m_globalCooldown <= 0.0f)
	{
		if (m_ability->Execute(throwDistance))
		{
			// Play ability animation if we did any
			DoAnimation();

			// Set global cooldown
			m_globalCooldown = m_maxGlobalCooldown;
		}
	}

	DealtDamageStruct temp = Network::GetInstance()->GetDealtDamage();
	m_floatingText->SetDealtDamageText(temp.m_position ,temp.m_damage);
	UpdateAbilityBar();

}
예제 #5
0
void Camera::RotateY(float angle)
{
	m_horizontalAngle += angle;
	CalculateDirection();
	m_viewMatrix = glm::lookAt(m_position, m_position + m_direction, m_up);
}