Воскресенье, 26 Мая 2024, 15:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Правильное передвижение объектов в 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 можете не смотреть. Остальное вбейте в переводчик, поймёте smile
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
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг