Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > FAQ

FAQ Часто задаваемые вопросы

Ответ
 
Опции темы
Старый 12.11.2012, 14:43   #1
Atqt
AnyKey`щик
 
Регистрация: 06.08.2011
Сообщений: 14
Написано одно полезное сообщение
(для 4 участников)
Джойстик(Сенсорный экран)

Подскажите, как сделать так чтобы изображение джойстика которое следует за пальцем/пером не могло выйти за круглую огранку. Пример прилагается.
Миниатюры
Нажмите на изображение для увеличения
Название: sample.png
Просмотров: 222
Размер:	4.9 Кб
ID:	18025  
(Offline)
 
Ответить с цитированием
Старый 12.11.2012, 15:07   #2
ffinder
Дэвелопер
 
Аватар для ffinder
 
Регистрация: 10.09.2007
Сообщений: 1,442
Написано 793 полезных сообщений
(для 1,460 пользователей)
Ответ: Джойстик(Сенсорный экран)

у тебя есть радиус "пэда" (padRadius), и радиус "кнопки" (buttonRadius)
максимальное отклонение центра кнопки тогда может быть padRadius - buttonRadius

есть координаты центра пэда и координаты центра кнопки, по теореме Пифагора находим расстояние между ними и смотрим, чтобы оно не превышало предельную длину.
(Offline)
 
Ответить с цитированием
Старый 12.11.2012, 15:29   #3
Atqt
AnyKey`щик
 
Регистрация: 06.08.2011
Сообщений: 14
Написано одно полезное сообщение
(для 4 участников)
Ответ: Джойстик(Сенсорный экран)

Допустим нахожу по т. Пифагора значение отклонения и оно превысило норму, то каким образом из этого можно узнать нормальные координаты кнопки?
(Offline)
 
Ответить с цитированием
Старый 12.11.2012, 15:33   #4
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 618 полезных сообщений
(для 2,416 пользователей)
Ответ: Джойстик(Сенсорный экран)

Находишь вектор кнопки: координаты пальца минус координаты центра большого кружка. Нормализуешь его (делишь каждую компоненту на длину). Потом умножаешь на разницу между радиусом большого кружка и маленького. Прибавляешь координаты большого кружка.
(Offline)
 
Ответить с цитированием
Старый 12.11.2012, 16:48   #5
Atqt
AnyKey`щик
 
Регистрация: 06.08.2011
Сообщений: 14
Написано одно полезное сообщение
(для 4 участников)
Ответ: Джойстик(Сенсорный экран)

Вот то что пишу:
Размер пада 240,240
Размер кнопки 80,80
al, bl, c - переменные для вычисления т. Пифагора
size.X, size.Y - перменнаые хранящие размер кнопки
sizeJ.X, sizeJ.Y - перменнаые хранящие размер пада
pos.X, pos.Y - переменные хранящие координаты кнопки
posJ.X, posJ.Y - переменные хранящие координаты пада
tc.X, tc.Y - переменные хранящие координаты нажатия
isHit - переменная для проверки попадания в пад
vB.X, vB.y - переменная нормализованного вектора
al = pos.X - (posJ.X + size.X / 2) - size.X;
if (al < 0) { al *= -1; }
bl = pos.Y - (posJ.Y + size.Y / 2) - size.Y;
if (bl < 0) { bl *= -1; }
c = Sqrt(al^2 + b^2);
if (tc.X > posJ.X && tc.X < posJ.X + sizeJ.X &&
tc.Y > posJ.Y && tc.Y < posJ.Y + sizeJ.Y)
{ isHit = true; }
else { isHit = false; };
if (isHit)
{
if (c > 80)
{
vB.X = (((tc.X - (posJ.X + sizeJ.X / 2)) / 120) * 80) + posJ.X;
vB.Y = (((tc.Y - (posJ.Y + sizeJ.Y / 2)) / 120) * 80) + posJ.Y;
pos.X = vB.X;
pos.Y = vB.Y;
}
else
{
pos.X = tc.X - size.X / 2;
pos.Y = tc.Y - size.Y / 2;
}
}
else
{
pos.X = posJ.X + sizeJ.X / 2 - size.X / 2;
pos.Y = posJ.Y + sizeJ.Y / 2 - size.Y / 2;
}

Когда джойстик превышиает радиус, то начинает выпрыгивать в непонятных направлениях. В чем ошибка?
З.Ы Это конечно не паскаль, но суть не меняется.
(Offline)
 
Ответить с цитированием
Старый 06.12.2012, 16:24   #6
PassCall
Разработчик
 
Аватар для PassCall
 
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений
(для 319 пользователей)
Ответ: Джойстик(Сенсорный экран)

Суть:

dx - расстояние между двумя кругами по x
dy - расстояние между двумя кругами по y

r - радиус ограничительного круга

dist = расстояние между центром "ограничительного круга" и центра "круга джойстика" (геометрию в школе все учили?)

Если dist>r, тогда вычисляем "излишек", то есть насколько линия превысила лимит длинны:
a=r/dist

теперь изменяем координаты на основе "излишка"

x=x*a;
y:=y*a;


так то!
__________________
Мечта программиста: запрограммировать процесс программирования.

Всё гениальное - просто.

http://passcall.ucoz.com
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 13:58.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com