| 
				
				Правильное передвижение объектов в Pascal ABC
				 | 
 | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 15:03 | Сообщение # 1 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Приветствую формучан ! Необходимо узнать способ передвижения объектов по прямой до точки . Дело в том , что используя модуль ABCobjects , передвижение происходит не кратчайшим путем , а каким-то левым... Например , есть точка , шар , вместо того чтобы напрямую прийти к этой точке , идет к ней сначала по углу 45 градусов , а затем по координате х . То же самое при использовании способа "передвижения" путем закрашивания и перерисовывания ... Как реализовать нормальное перемещение ?
 |  
| 
 | 
 |    | 
| Gudleifr | Дата: Суббота, 30 Января 2016, 15:13 | Сообщение # 2 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | Я использую тирьямпапатор Минковского и почему-то получаю 2+2=5. Как реализовать нормальное перемещение ?
  Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 |  
| 
 | 
 |    | 
| Saitei | Дата: Суббота, 30 Января 2016, 15:29 | Сообщение # 3 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Nikstoun, если не ошибаюсь, то:
 Код double angle = std::atan2(position.x - destination.x, position.y - destination.y); double dx = std::cos(angle) * speed; double dy = std::sin(angle) * speed; player.x += dx; player.y += dy; 
  atan2(a, b) == atan(a/b) если что
 |  
| 
 | 
 |    | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 15:37 | Сообщение # 4 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Saitei, Спасибо , но не могли бы вы пояснить значение переменных ? position.x и y - предполагаемая позиция (или настоящая) . Что означает destination ? Что такое std ?
 |  
| 
 | 
 |    | 
| Saitei | Дата: Суббота, 30 Января 2016, 15:48 | Сообщение # 5 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Цитата Nikstoun (  )  Saitei, Спасибо , но не могли бы вы пояснить значение переменных ? position.x и y - предполагаемая позиция (или настоящая) . Что означает destination ? Что такое std   На std можете не смотреть. Остальное вбейте в переводчик, поймёте  
 |  
| 
 | 
 |    | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 16:44 | Сообщение # 6 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Saitei, что значит += ?
 
 Сообщение отредактировал Nikstoun - Суббота, 30 Января 2016, 16:47  |  
| 
 | 
 |    | 
| Gudleifr | Дата: Суббота, 30 Января 2016, 16:55 | Сообщение # 7 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | Nikstoun, насколько, я понимаю, у коллеги всего две ошибки (кроме того, что он привел текст для C++, а не для Вашей PASCAL-библиотеки): он перепутал местами параметры atan и зачем-то ввел третью точку. Но это все очевидно: школьный курс тригонометрии.
  И тут мы подходим к самому важному: компьютер не может посчитать ничего, что не может посчитать программист! Нет, конечно, есть библиотеки, которые делают что-то совсем заумное, но если программист не имеет понятия о том, как они примерно устроены, он все равно не может быть уверен, что использует их правильно.
  В Вашем случае: пока Вы не научитесь "перемещать" точку на листочке в клеточку, рассчитывая тут же ее координаты руками, Вы не сможете нарисовать это на компьютере. Причем, это цветочки, т.к. Вам придется не только выяснить "что" втюхивать в программу, но и то "каким образом ожидает этого компьютер".
  Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 |  
| 
 | 
 |    | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 17:03 | Сообщение # 8 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Gudleifr, для чего вы это написали ? Чтобы в очередной раз доказать мне что я новичек ? Я знаю это и без вас ... И есть вопрос , "копируя" его код в свой , я заметил ошибку . Нужно перевести integer в double , как это сделать ? И зачем double , разве не достаточно real ?
 
 Сообщение отредактировал Nikstoun - Суббота, 30 Января 2016, 17:08  |  
| 
 | 
 |    | 
| Gudleifr | Дата: Суббота, 30 Января 2016, 17:07 | Сообщение # 9 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | Цитата Nikstoun (  )   для чего вы это написали ? Чтобы в очередной раз доказать мне что я новичек ?   Наоборот. В этом вопросе Ваш уровень знания программирования вообще не важен! Здесь важно то, что Вы попытались заставить компьютер думать за себя! Сначала сами решите задачу, и только потом ее программируйте.
  Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 |  
| 
 | 
 |    | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 17:10 | Сообщение # 10 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Gudleifr, хорошо , если честно , это первая хорошая мысль от вас в мою сторону ) Все-таки real не подойдет , так как он хранит от -39 до 38 , как преобразовать интеджер в дабл ?
 |  
| 
 | 
 |    | 
| Lertmind | Дата: Суббота, 30 Января 2016, 17:12 | Сообщение # 11 |  
 
заслуженный участник 
Сейчас нет на сайте 
 
 | На всякий случай запишу в векторном виде:
 Код Vector2 pos;  // Позиция объекта Vector2 dest; // Позиция места назначения
  Vector2 direction = dest - pos;     // Направление движения direction = direction.normalized(); // Делаем вектор единичным
  pos += direction * speed; // Если в игровом цикле есть время, то ещё умножить на дельту времени 
  Чтобы остановиться, можно либо считать пройденное расстояние и сравнивать с расстоянием до места назначения, либо каждый раз высчитывать вектор движения и проверять не поменял ли знак какой-нибудь компонент вектора direction (т. е. x или y).
 
 Сообщение отредактировал Lertmind - Суббота, 30 Января 2016, 17:14  |  
| 
 | 
 |    | 
| Gudleifr | Дата: Суббота, 30 Января 2016, 17:12 | Сообщение # 12 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | Nikstoun, Вы неправильно прочитали про real.
  Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 |  
| 
 | 
 |    | 
| Saitei | Дата: Суббота, 30 Января 2016, 17:13 | Сообщение # 13 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Цитата Nikstoun (  )  Saitei, что значит += ?   some += a; //some = some + a;
 |  
| 
 | 
 |    | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 17:15 | Сообщение # 14 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Gudleifr, http://www.pascal.helpov.net/index/numerical_data_types_pascal_programming
 |  
| 
 | 
 |    | 
| Gudleifr | Дата: Суббота, 30 Января 2016, 17:18 | Сообщение # 15 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 |  Добавлено (30 января 2016, 17:18) ---------------------------------------------
  Цитата Nikstoun (  )  http://www.pascal.helpov.net/index/numerical_data_types_pascal_programming  Там правильно, у Вас - нет.
  Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 |  
| 
 | 
 |    | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 17:24 | Сообщение # 16 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Gudleifr, 6	Real	11..12	-39..+38 ................. так как он хранит от -39 до 38 ? Хранит в смысле используется в промежутке ... Добавлено (30 января 2016, 17:24) --------------------------------------------- Lertmind, Пишет ошибку недопустимый параметр в последнем действии . Однако я не преобразовал вектор , из-за этого ? Как его преобразовать в pascal`e? 
 |  
| 
 | 
 |    | 
| Lertmind | Дата: Суббота, 30 Января 2016, 17:26 | Сообщение # 17 |  
 
заслуженный участник 
Сейчас нет на сайте 
 
 | Цитата Nikstoun (  )  Lertmind, Пишет ошибку недопустимый параметр в последнем действии . Однако я не преобразовал вектор , из-за этого ? Как его преобразовать в pascal`e?   Это псевдокод, нужно реализовать класс вектор. Сейчас попробую на паскаль перенести.
 |  
| 
 | 
 |    | 
| Gudleifr | Дата: Суббота, 30 Января 2016, 17:32 | Сообщение # 18 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | Цитата Nikstoun (  )  так как он хранит от -39 до 38 ? Хранит в смысле используется в промежутке ...  Читайте внимательнее.  Lertmind, может, сразу к перемножению матриц перейдем?
  Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.
 |  
| 
 | 
 |    | 
| Nikstoun | Дата: Суббота, 30 Января 2016, 17:34 | Сообщение # 19 |  
 
почетный гость 
Сейчас нет на сайте 
 
 | Gudleifr, почему вы такой злой ? Вас кто-то обидел ? ( Я догадываюсь что услышу в ответ :"Да , кто-то обидел , а именно вы - своим присутствием на форуме"...
 |  
| 
 | 
 |    | 
| Lertmind | Дата: Суббота, 30 Января 2016, 17:44 | Сообщение # 20 |  
 
заслуженный участник 
Сейчас нет на сайте 
 
 | Вот код без структуры векторов, получается не очень красиво... Проверил в Lazarus, он был под рукой. В остальном разбирайтесь сами, в гугле легко найти информацию и о векторах, и о другом.
 Код procedure TForm1.FormCreate(Sender: TObject); var posx, posy, destx, desty: Real; dirx, diry: Real; d: Real; speed: Real; begin posx := 1; posy := 2; // Позиция объекта destx := 4; desty := 3; // Позиция места назначения speed := 3;
  dirx := destx - posx; diry := desty - posy; // Направление движения d := Sqrt(dirx*dirx + diry*diry); dirx := dirx / d; diry := diry / d; // Делаем вектор единичным
  posx := posx + dirx * speed; posy := posy + diry * speed; end;  
 
 Сообщение отредактировал Lertmind - Суббота, 30 Января 2016, 17:46  |  
| 
 | 
 |    |