示例#1
0
	bool CoreShape_Imp::GetIsCollidedWithCircleAndRect(CoreCircleShape* circle, CoreRectangleShape* rectangle)
	{
		auto untransformedVertexes = rectangle->GetDrawingArea().GetVertexes();

		Vector2DF untransformedOrigin = (untransformedVertexes[0] + untransformedVertexes[1] + untransformedVertexes[2] + untransformedVertexes[3]) / 4;

		Vector2DF vec = (untransformedOrigin - (untransformedVertexes[0] + rectangle->GetCenterPosition()));
		vec.SetDegree(vec.GetDegree() + rectangle->GetAngle());

		Vector2DF rectGlobalCenter = untransformedVertexes[0] + rectangle->GetCenterPosition() + vec;

		Vector2DF c;

		c.X = std::cos(rectangle->GetAngle()) * (circle->GetPosition().X - rectGlobalCenter.X) -
			std::sin(rectangle->GetAngle()) * (circle->GetPosition().Y - rectGlobalCenter.Y) + rectGlobalCenter.X;
		c.Y = std::sin(rectangle->GetAngle()) * (circle->GetPosition().X - rectGlobalCenter.X) +
			std::cos(rectangle->GetAngle()) * (circle->GetPosition().Y - rectGlobalCenter.Y) + rectGlobalCenter.Y;

		Vector2DF nearestPos;

		Vector2DF rectGlobalPos = rectangle->GetDrawingArea().GetPosition();
		Vector2DF rectSize = rectangle->GetDrawingArea().GetSize();

		if (c.X < rectGlobalPos.X)
		{
			nearestPos.X = rectGlobalPos.X;
		}
		else if (c.X > rectGlobalPos.X + rectSize.X)
		{
			nearestPos.X = rectGlobalPos.X + rectSize.X;
		}
		else
		{
			nearestPos.X = c.X;
		}

		if (c.Y < rectGlobalPos.Y)
		{
			nearestPos.Y = rectGlobalPos.Y;
		}
		else if (c.Y > rectGlobalPos.Y + rectSize.Y)
		{
			nearestPos.Y = rectGlobalPos.Y + rectSize.Y;
		}
		else
		{
			nearestPos.Y = c.Y;
		}

		float radius2 = pow(circle->GetOuterDiameter() / 2, 2);

		float dist = (c - nearestPos).GetSquaredLength();

		return dist < radius2;
	}
示例#2
0
// 方向の取得
Vector2DF Controller::GetDirection() const
{
	Vector2DF direction;

	direction.y = -mpController->GetPower( Engine::Input::CONTROLLER_AXIS_01_MINUIS );
	direction.y = direction.y + mpController->GetPower( Engine::Input::CONTROLLER_AXIS_01_PLUS );
	direction.x = -mpController->GetPower( Engine::Input::CONTROLLER_AXIS_02_MINUIS );
	direction.x = direction.x + mpController->GetPower( Engine::Input::CONTROLLER_AXIS_02_PLUS );

	if( direction.GetAbs() > 1.0f )
	{
		direction.Normalize();
	}

	return direction;
}
示例#3
0
// コンストラクタ
SpAttack::SpAttack( const Vector2DF &pos, float angle )
: Base( pos, angle )
, mDrawParam()
, mEffectCallback()
{
	mDrawParam.SetTexture( 
		py::extract<Game::Util::Sprite::PTexture>( 
		mAuxs.GetCommonResource().attr( "get" )( "itemSpAttack" ) ) );
	mDrawParam.SetSrc( RectF( 0, 0, 32.0f, 32.0f ) );
	mDrawParam.SetDst( pos.MakeRect( 32.0f, 32.0f ) );
	mDrawParam.SetPriority( Game::View::STG::PRI_ITEM );
}
示例#4
0
// コンストラクタ
Base::Base( const Vector2DF &pos, int radius )
: Actor::Base( Hit::RectI( pos, radius * 2, radius * 2 ) )
, mHitCircle( pos, radius )
, mHitRect( pos, radius * 2, radius * 2 )
, mHP( INIT_HP )
{
	mDamagedDrawParam.SetTexture( 
		py::extract<Game::Util::Sprite::PTexture>( 
		mAuxs.GetCommonResource().attr( "get" )( "bulletDamagedEffect" ) ) );
	mDamagedDrawParam.SetSrc( RectF( 0, 0, 64.0f, 64.0f ) );
	mDamagedDrawParam.SetDst( pos.MakeRect( GetHitRadius()*4, GetHitRadius()*4 ) );
	mDamagedDrawParam.SetPriority( Game::View::STG::PRI_ENEMYBULLET_DAMAGED );
	mDamagedDrawParam.SetColor( ColorF( 1.0f, 1.0f, 1.0f, 0 ) );
	mDamagedDrawParam.SetAlphaBlend( Game::Util::Sprite::AB_ADD );
}
	void CoreCircleShape_Imp::DivideToTriangles()
	{
		if (numberOfCorners < 3) return;

		const float radInc = 360.0 / numberOfCorners;

		const float outerRadius = outerDiameter / 2;
		const float innerRadius = innerDiameter / 2;

		float currentPosDeg = angle - 90;
		float currentUVDeg = -90;

		Vector2DF baseVector(0, -1);
		baseVector.SetDegree(currentPosDeg);

		Vector2DF uvCenter = { 0.5, 0.5 };

		Vector2DF uvVector = { 0, -0.5 };

		float ratio = innerDiameter / outerDiameter;

		for (int i = 0; i < numberOfCorners; ++i)
		{
			Vector2DF currentPosVector = baseVector;
			currentPosVector.SetDegree(currentPosDeg);

			Vector2DF nextPosVector = currentPosVector;
			auto nextPosDeg = nextPosVector.GetDegree();
			nextPosDeg += radInc;
			nextPosVector.SetDegree(nextPosDeg);

			Vector2DF currentUVVector = uvVector;
			currentUVVector.SetDegree(currentUVDeg);

			Vector2DF nextUVVector = currentUVVector;
			auto nextUVDeg = nextUVVector.GetDegree();
			nextUVDeg += radInc;
			nextUVVector.SetDegree(nextUVDeg);


			std::array<Vector2DF, 4> vertexes = { position + currentPosVector*outerRadius, position + nextPosVector*outerRadius, position + nextPosVector*innerRadius, position + currentPosVector*innerRadius };
			std::array<Vector2DF, 4> uvs = { uvCenter + currentUVVector, uvCenter + nextUVVector, uvCenter + nextUVVector*ratio, uvCenter + currentUVVector*ratio };

			auto triangle1 = new CoreTriangleShape_Imp();
			auto triangle2 = new CoreTriangleShape_Imp();

			for (int j = 0; j < 3; ++j)
			{
				triangle1->SetPointByIndex(vertexes[j], j);
				triangle1->SetUVByIndex(uvs[j], j);

				triangle2->SetPointByIndex(vertexes[(j + 2) % 4], j);
				triangle2->SetUVByIndex(uvs[(j + 2) % 4], j);
			}

			triangles.push_back(triangle1);
			triangles.push_back(triangle2);

			currentPosDeg += radInc;
			currentUVDeg += radInc;
		}
		
	}
示例#6
0
	void CoreLayer2D_Imp::DrawArcAdditionally(asd::Vector2DF center, float outerDiameter, float innerDiameter, Color color, int numberOfCorners, int startingCorner, int endingCorner, float angle, Texture2D* texture, AlphaBlendMode alphaBlend, int32_t priority)
	{
		if (numberOfCorners < 3) return;

		const float radInc = 360.0 / numberOfCorners;

		const float outerRadius = outerDiameter / 2;
		const float innerRadius = innerDiameter / 2;

		float currentPosDeg = angle - 90 + startingCorner*radInc;
		float currentUVDeg = -90 + startingCorner*radInc;

		Vector2DF baseVector(0, -1);
		baseVector.SetDegree(currentPosDeg);

		Vector2DF uvCenter = { 0.5, 0.5 };

		Vector2DF uvVector = { 0, -0.5 };

		float ratio = innerDiameter / outerDiameter;

		int endcorner = endingCorner;
		while (endcorner < startingCorner) endcorner += numberOfCorners;

		for (int i = 0; i < endcorner - startingCorner; ++i)
		{
			Vector2DF currentPosVector = baseVector;
			currentPosVector.SetDegree(currentPosDeg);

			Vector2DF nextPosVector = currentPosVector;
			auto nextPosDeg = nextPosVector.GetDegree();
			nextPosDeg += radInc;
			nextPosVector.SetDegree(nextPosDeg);

			Vector2DF currentUVVector = uvVector;
			currentUVVector.SetDegree(currentUVDeg);

			Vector2DF nextUVVector = currentUVVector;
			auto nextUVDeg = nextUVVector.GetDegree();
			nextUVDeg += radInc;
			nextUVVector.SetDegree(nextUVDeg);


			std::array<Vector2DF, 4> vertexes = { center + currentPosVector*outerRadius, center + nextPosVector*outerRadius, center + nextPosVector*innerRadius, center + currentPosVector*innerRadius };
			std::array<Vector2DF, 4> uvs = { uvCenter + currentUVVector, uvCenter + nextUVVector, uvCenter + nextUVVector*ratio, uvCenter + currentUVVector*ratio };
			std::array<Color, 4> colors = { color, color, color, color };

			SafeAddRef(texture);

			{
				Sprite sprite;

				sprite.pos = vertexes;
				sprite.col = colors;
				sprite.uv = uvs;
				sprite.Texture_ = CreateSharedPtrWithReleaseDLL(texture);
				sprite.AlphaBlend_ = alphaBlend;
				sprite.Priority = priority;

				sprites.push_back(sprite);
			}

			currentPosDeg += radInc;
			currentUVDeg += radInc;
		}
	}