Я пытаюсь создать игру на основе сетки. пока что у меня есть сетка на основе гексагональной плитки с координатной схемой, как показано ниже:
col 0
| col 1
| | col 2
| | |
__ | __ __ __ __
/00\__/02\__/04\__/06\__/08\__
\__/01\__/03\__/05\__/07\__/09\--- row 0
/10\__/12\__/14\__/16\__/18\__/
\__/11\__/13\__/15\__/17\__/19\--- row 1
/20\__/22\__/24\__/26\__/28\__/
\__/21\__/23\__/25\__/27\__/29\--- row 2
/30\__/32\__/34\__/36\__/38\__/
\__/ \__/ \__/ \__/ \__/ --- row 3
И в реальной жизни выглядит так, только со случайными цветами для каждого шестиугольника:
Я изо всех сил пытаюсь понять, когда пользователь нажимает на шестиугольник, как мне определить, на какой шестиугольник он щелкнул?
код, который я пробовал до сих пор, выглядит следующим образом:
private: System::Void MyForm_MouseDown(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e) {
int CloseI=0,CloseJ=0;
CloseJ = FindNearesetX(e->X);
CloseI = FindNearesetY(e->Y);
//Grid[down(y)][along(x)]
P1.X = Grid[CloseI][CloseJ].GetX();
P1.Y = Grid[CloseI][CloseJ].GetY();
} // END MOUSE DOWN EVENT
int FindNearesetX(int ActualX){
int ClosestJPos;
ClosestJPos = ((ActualX-Grid[0][0].GetX())/(1.5*HexSideLength));
return ClosestJPos;
}//END FIND NEAREST X
int FindNearesetY(int ActualY){
int ClosestIPos;
ClosestIPos = ((ActualY-Grid[0][0].getY())/(HexHeight));
return ClosestIPos;
}//END FIND NEAREST Y
private: System::Void MyForm_MouseMove(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e) {
this->Invalidate();
P2.X = e->X;
P2.Y = e->Y;
} // END MOUSE MOVE EVENT
Однако это не сработало так, как я хотел, потому что, когда пользователь щелкает слева от центральной точки шестиугольника, он привязывается к шестиугольнику слева от того, по которому они щелкнули, а также, если они щелкают над центральной точкой на все нечетные столбцы он привязывает к шестиугольнику над тем, на котором они щелкнули.
Я застрял на этом уже 2 дня и очень хочу разобраться. Спасибо