Я нахожусь на ранних этапах разработки основной программы для двух тел (для тех из вас, кто не знает, «проблема двух тел» — это когда у вас в космосе два тела притягиваются друг к другу под действием гравитации). Я настроил его так, чтобы при каждом отметке таймера объекты (которые являются картинками) перемещались в соответствии с направлением (в градусах), введенным в текстовое поле.
Как только пара операторов IF удостоверится, что значения в текстовом поле являются действительными, они делают это внутри события Button_Press (кнопка запустит симуляцию):
this->SimTick->Enabled=true; //Master timer for simulation
radians1=(int::Parse(DirectionBox1->Text))*(3.14/180); //Converts the degrees entered for the first object into radians for use in trig functions
radians2=(int::Parse(DirectionBox2->Text))*(3.14/180); //Converts the degrees entered for the second object into radians for use in trig functions
Внутри события timer_tick:
this->Object1->Location.X+=(int::Parse(VelocityBox1->Text)*cos(radians1));
this->Object1->Location.Y+=(int::Parse(VelocityBox1->Text)*sin(radians1));
this->StartStop->Text=(radians1.ToString()); //This is just here to check that the math was correct, which it is
Я давно не кодировал C ++, так что это может быть очень простой ошибкой, но есть ли у кого-нибудь идеи или нужно вставить больше кода?
Помимо правильного обновления свойства Location, чтобы оно приняло новые значения, вы, вероятно, захотите сохранить временный x & y как число с плавающей точкой, чтобы вы могли добавлять к нему дробные значения.
typedef struct { float x, y ; } floatcoord ;
floatcoord tmpLocation ;
tmpLocation.x += int::Parse(VelocityBox1->Text)*cos(radians1) ;
tmpLocation.y += int::Parse(VelocityBox1->Text)*sin(radians1) ;
this->Object1->Location.set( (int) floorf( tmpLocation.x), (int) floorf( tmpLocation.y) ; // or however you update Location
Других решений пока нет …