|
08.11.2007, 20:48
|
#1
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Обработка клика
Проблема в том, что обработка клика (в часности выбор объекта) работает неправильно.
Вот этот код:
If KeyHit(1) and obj.x > x and obj.x < x + width and obj.y > y and obj.y < y + height then
...
...
endif
Если нажать сначало не на объекте, а потом навести на него курсор то условие выполняется.
Вобщем то я догадываюсь, что проблема в том что KeyHit возвращает кол-во кликов с предыдущего вызова этой ф-ии.
Ну и как можно правильно все это переписать чтоб работало...
|
(Offline)
|
|
08.11.2007, 21:05
|
#2
|
Мастер
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений (для 252 пользователей)
|
Re: Обработка клика
flushkeys() ?
|
(Offline)
|
|
08.11.2007, 21:38
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Обработка клика
Ура! Наконецто пример реального столкновения с проблеммой, о которой я так долго всем твердил:
Привязывайте инпут к переменным!
IKhEsc=KeyHit(1)
If IKhEsc and obj.x > x and obj.x < x + width and obj.y > y and obj.y < y + height then
...
...
endif
И да будет вам счастье, не встречать подобных проблем больше. В начале цикла достаточно разик так вот назначить и всё
|
(Offline)
|
|
08.11.2007, 21:56
|
#4
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Обработка клика
Блин не то написал извеняюсь, не KeyHit(), а MouseHit()! Те должно быть:
If MouseDown() and obj.x > x and obj.x < x + width and obj.y > y and obj.y < y + height then
...
...
endif
|
(Offline)
|
|
08.11.2007, 22:15
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Обработка клика
Trilliput, дык так же назнач как и я показал.
|
(Offline)
|
|
08.11.2007, 22:17
|
#6
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Обработка клика
ок, попробую..
|
(Offline)
|
|
08.11.2007, 22:40
|
#7
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Обработка клика
Вбщем то же самое. В итоге MouseHit() возвращает ко-во нажатий кнопки мыши с предыдущего вызова. Как бы глюка тут нет, просто логика исполнения задуманого неверна.
Вобще конешно можно использовать MouseDown() и например переменную IsClick отвеающюю за то что бы код выполнялся всего один раз за нажатие или что то в этом роде.
Но ище одна переменная - это опять переписывать код, дополнять типы и тп. Хотелось бы увидеть пример кода где меняется только алгаритм проверки пересечения и нажатия клавиши.
|
(Offline)
|
|
08.11.2007, 23:34
|
#8
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Обработка клика
Соображалка досоображала:
Если изменить так:
If MouseHit(1)=1 And MouseDown(1) and RectOverlap (x1,x2,y1,y2) and ... then
<Свой Код>
endif
Те:
MouseHit() - возвращает кол-во нажатий (одинарный или даблклик и тд)
MouseDown() - возвращает true если в данный момент кнопка мыши зажата.
Витоге условие выполняется только при нажатии на объекте.
|
(Offline)
|
|
09.11.2007, 19:16
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Обработка клика
Trilliput, и куууча лишних выховов.
Я написал кусочек кода, и он рабочий.
В начале главного цикла привязываешь весь инпут к переменным и всё, дальше юзаешь переменные, и всё работает на ура.
|
(Offline)
|
|
10.11.2007, 10:45
|
#10
|
Знающий
Регистрация: 27.07.2006
Сообщений: 250
Написано 6 полезных сообщений (для 7 пользователей)
|
Re: Обработка клика
Все работает точно так же. Разницы в работе кода с привязкой и без нее нет.
|
(Offline)
|
|
13.11.2007, 16:02
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Обработка клика
Trilliput, Значит сделал не так как я сказал, Всё ИДЕАЛЬНО работает у меня. Код давай, будем смотреть.
|
(Offline)
|
|
28.11.2007, 02:20
|
#12
|
Нуждающийся
Регистрация: 20.08.2006
Сообщений: 54
Написано 3 полезных сообщений (для 4 пользователей)
|
Re: Обработка клика
Мока ты не понял в чем проблема. МоусХит возвращает тру если кликнули не на объекте, драгом перетащили на него курсор и отпустили.
Лечится просто:
Либо для объекта, либо для группы вводим переменную или поле маусдаун.
В цикле проверки проверяем переменную маусдаун, если она не тру, то тестим состояние реальной мыши по MouseDown (а не Hit или еще чего) и положение мыша. Если мы доволны проверкой, то маусдаун делаем тру.
Если маусдаун у нас тру - т.е. мыша была уже нажата на нужном объекте, тогда тестим положение кнопки мыши опять по MouseDown. Если MouseDown не тру (т.е. кнопку отпустили) проверяем положение мыши и если она над нашим объектом - то радуемся этому и делаем задуманное, а если нет - то просто переменную маусдаун сбрасываем в фалс. И все заработает (если правильно напишешь)
|
(Offline)
|
|
28.11.2007, 13:28
|
#13
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Обработка клика
oxid, у тебя тоже самое, только через мега уОпу
Если заранее инпут выносить в переменные, то не будет проблем, и для нажатия на кнопку, нужно вообще юзать MouseRelease только такой функции нету, и нужно вычислять исходя из MouseDown и MouseHit, совместно с MouseHit
|
(Offline)
|
|
28.11.2007, 14:35
|
#14
|
Нуждающийся
Регистрация: 20.08.2006
Сообщений: 54
Написано 3 полезных сообщений (для 4 пользователей)
|
Re: Обработка клика
Мока это называется не через жопу а правильное решение поставленной задачи (а через что оно - это фигня), как и у Триллипута с его комбинацией с MouseHit + MouseDown, а ты говоришь только о границах объекта, а не о том, как правильно мышь обработать, что к этому вопросу имеет частичное отношение, поэтому твой код у Триллипута и не заработал.
Плюс отличие моего способа от способа Триллипута в том, что у меня надо нажать и отпустить кнопку на объекте, а у него только нажать.
А твой не через жопусделанный код будет работать только если тестить MouseDown а не MouseHit и срабатывать при нажатии как и у Триллипута, а не при нажатии-отпускании, как у меня. И при этом будет косячить (попробуй потаскать мышей и с MouseHit и с MouseDown и посмотри что будет)
А ты даже не вьехал паччиму твой код не работает у него, в чем отличие приведенного мной способа. Так что имхо размышлять что и у кого и чез что сделано тебе пока рановато.
зы: хотя нет, я прогнал - твой код и с MouseHit работать будет. А не работает у Триллипута он скорее из-за того что он не выносит тестирование MouseHit на начало цикла обработки ВСЕХ объектов (о чем ты не указал), а делает это на каждом объекте. А тут надо понимать особенность этой команды, которая возвращает количество нажатий с момента своего последнего вызова.
т.е. если мы напишем два раза MouseHit, MouseHit после одного нажания кнопки, то первый раз вернется тру, а второй - фалс. Поэтому тестирование MouseHit надо запоминать в переменной перед началом обработки объектов.
Или тестит MouseHit не в каждом цикле обработки
ззы: @ Trilliput
MouseHit() - возвращает кол-во нажатий (одинарный или даблклик и тд)
|
Нет просто через MouseHit ты не отследишь даблклик - почему - см выше.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:10.
|