Правильное передвижение объектов в 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 |
|
| |