Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2015, 02:16   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию Как узнать угол для движения обьекта по координатам мышки

Добрый день, Уважаемые эксперты. Возникла необходимость создать игру, наподобие agar.io. Задача игры состоит в том. Что у нас есть круг (шар). Мы ним удолжны управлять в пространстве мышкой. В зависимости от тго где стоит мышь относительно шара, туда шар и движется. Я пробовал сделать чтобы шар просто сдвигался по координатам икс и игрек пока не достигнет координат мыши. Но в таком случае шар может двигаться только по вертикали, горизонтали или диагоналям.

А мне нужно чтобы шар двигался именно по траэктории с наклоном на любой угол. Проблема в общем-то и заключается в том как найти угол наклона для движения?

Последнее к чему я пришел было следующим:

Код:
Angle:=Arctan ( ((Ball.X-MX) - (Mouse.CursorPos.X-Form1.Left)) div ((Ball.Y-MY) - (Mouse.CursorPos.Y-Form1.Top-25)) );

  Ball.Y:=round(Ball.Y+Sin(DegToRad(Angle ))*5);
  Ball.X:=round(Ball.X-Cos(DegToRad(Angle ))*5);
То есть сначала мы должны узнать угол. Но делфи выдает ошибку на Arctan, мол ем должны передаваться данные типа Extended. У меня же целые числа. Хотя я пробовал сделать переменные типа Real. В этом случае ошиба уже была из за перевода градусов DegToRad.

Ball.X, Ball.Y - координаты шара
MX, MY - это скроллинг карты (на него можно не обращать внимание).

Помогите советом, как найти угол? Или как по другому может можно реализовать подобное управление? Заранее спасибо всем откливнушимся.

Последний раз редактировалось Stilet; 04.12.2015 в 09:50.
Armageddets вне форума Ответить с цитированием
Старый 04.12.2015, 03:20   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Цитата:
Сообщение от Armageddets Посмотреть сообщение
... Но делфи выдает ошибку на Arctan, мол ем должны передаваться данные типа Extended. ..
Ничего подобного
PS : Height, Width - высота и ширина формы Form1. Тоже целые.
Изображения
Тип файла: jpg arct.JPG (55.7 Кб, 128 просмотров)
type_Oleg вне форума Ответить с цитированием
Старый 04.12.2015, 09:43   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

пройти из т. (x0,y0) в т.(x1,y1) по диагонали за N шагов.
положение на шаге k (x,y) при k<N
Код:
x:=x0 +trunc((x1-x0)/N*k);
y:=y0 +trunc((y1-y0)/N*k);
при k=N x:=x1; y:=y1;// чтобы не промахнуться на всякий случай

число шагов (время) требуемое для прохождения пути (расстояние между двумя точками) с заданной скоростью L (расстояние проходимое за один шаг).
Код:
N :=trunc(SQRT((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))/L)+ 1{на всякий случай будем идти чуть-чуть медленней} ;
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 04.12.2015, 21:34   #4
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

Не совсем разобрался как это реализовать в моем случае. Я попробовал подствить свои координаты, но у меня шар движется только после движения мыши. А мне нужно чтобы шар двигался постоянно. Под ним только карта смещаться должна и шар не должен доходить до мышки - он постоянно должен гнаться за ней. Догнать мышку он может только по краям игровой карты (когда карта уже не прокручивается по какой-то из оси коодинат - достигнут ее край)

В таймере код у меня получился такой:

Цитата:
N :=trunc(SQRT(((Mouse.CursorPos.X-Form1.Left)-Ball.X)*((Mouse.CursorPos.X-Form1.Left)-Ball.X)+((Mouse.CursorPos.Y-Form1.Top-25)-Ball.Y)*((Mouse.CursorPos.Y-Form1.Top-25)-Ball.Y))/5)+ 1;
Ball.X:=(Ball.X) +trunc( ((Mouse.CursorPos.X-Form1.Left) - (Ball.X)) /N*5) -MX;
Ball.Y:=(Ball.Y) +trunc( ((Mouse.CursorPos.Y-Form1.Top-25) - (Ball.Y)) /N*5) -MY;
А вот весь проект:
Заготовка для игры

Последний раз редактировалось Armageddets; 04.12.2015 в 22:02.
Armageddets вне форума Ответить с цитированием
Старый 05.12.2015, 00:47   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Виталий Armageddets, я гляжу предусмотрительно запоролили архив, чтобы посекурнее было ))
Вообще, стоит прочитать и понять статью http://habrahabr.ru/post/131931/
да и научиться уже получше код писать, даже если это тестовый проект, почему области все жёсткие (меджики) и привязаны к форм1 ? Где декомпозиция ?
phomm вне форума Ответить с цитированием
Старый 05.12.2015, 16:48   #6
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

Ой извиняюсь. Пароль 1. Просто без пароля на архив фалообменик считал мою программу вирусов из за екзе файла. Уровень программирования у меня не высок в плане классов, декомпозиций и так далее. Все стараюсь по простому делать.
Armageddets вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение обьекта на заданный угол Armageddets Общие вопросы Delphi 5 16.06.2014 18:34
как узнать позицию мышки SERG1980 Мультимедиа в Delphi 3 03.12.2012 15:15
Создание иммитации движения обьекта grebljmax Фриланс 5 10.01.2011 00:25
Поворот обьекта на угол Lemo Помощь студентам 4 06.04.2009 19:46
Скорость движения обьекта shepelin Общие вопросы Delphi 9 23.01.2008 11:51