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; }
// 方向の取得 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; }
// コンストラクタ 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 ); }
// コンストラクタ 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; } }
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; } }