forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Обработка клика (http://forum.boolean.name/showthread.php?t=4971)

Trilliput 08.11.2007 20:48

Обработка клика
 
Проблема в том, что обработка клика (в часности выбор объекта) работает неправильно.
Вот этот код:
Код:

If KeyHit(1) and obj.x > x and obj.x < x + width and obj.y > y and obj.y < y + height then
...
...
endif

Если нажать сначало не на объекте, а потом навести на него курсор то условие выполняется.
Вобщем то я догадываюсь, что проблема в том что KeyHit возвращает кол-во кликов с предыдущего вызова этой ф-ии.
Ну и как можно правильно все это переписать чтоб работало...

dimanche13 08.11.2007 21:05

Re: Обработка клика
 
flushkeys() ?

moka 08.11.2007 21:38

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

И да будет вам счастье, не встречать подобных проблем больше. В начале цикла достаточно разик так вот назначить и всё :)

Trilliput 08.11.2007 21:56

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


moka 08.11.2007 22:15

Re: Обработка клика
 
Trilliput, дык так же назнач как и я показал.

Trilliput 08.11.2007 22:17

Re: Обработка клика
 
ок, попробую..

Trilliput 08.11.2007 22:40

Re: Обработка клика
 
Вбщем то же самое. В итоге MouseHit() возвращает ко-во нажатий кнопки мыши с предыдущего вызова. Как бы глюка тут нет, просто логика исполнения задуманого неверна.
Вобще конешно можно использовать MouseDown() и например переменную IsClick отвеающюю за то что бы код выполнялся всего один раз за нажатие или что то в этом роде.
Но ище одна переменная - это опять переписывать код, дополнять типы и тп. Хотелось бы увидеть пример кода где меняется только алгаритм проверки пересечения и нажатия клавиши.

Trilliput 08.11.2007 23:34

Re: Обработка клика
 
Соображалка досоображала:
Если изменить так:
Код:

If MouseHit(1)=1 And MouseDown(1) and RectOverlap (x1,x2,y1,y2) and ... then
<Свой Код>
endif

Те:
MouseHit() - возвращает кол-во нажатий (одинарный или даблклик и тд)
MouseDown() - возвращает true если в данный момент кнопка мыши зажата.
Витоге условие выполняется только при нажатии на объекте.

moka 09.11.2007 19:16

Re: Обработка клика
 
Trilliput, и куууча лишних выховов.
Я написал кусочек кода, и он рабочий.
В начале главного цикла привязываешь весь инпут к переменным и всё, дальше юзаешь переменные, и всё работает на ура.

Trilliput 10.11.2007 10:45

Re: Обработка клика
 
Все работает точно так же. Разницы в работе кода с привязкой и без нее нет.

moka 13.11.2007 16:02

Re: Обработка клика
 
Trilliput, Значит сделал не так как я сказал, Всё ИДЕАЛЬНО работает у меня. Код давай, будем смотреть.

oxid 28.11.2007 02:20

Re: Обработка клика
 
Мока ты не понял в чем проблема. МоусХит возвращает тру если кликнули не на объекте, драгом перетащили на него курсор и отпустили.
Лечится просто:
Либо для объекта, либо для группы вводим переменную или поле маусдаун.
В цикле проверки проверяем переменную маусдаун, если она не тру, то тестим состояние реальной мыши по MouseDown (а не Hit или еще чего) и положение мыша. Если мы доволны проверкой, то маусдаун делаем тру.
Если маусдаун у нас тру - т.е. мыша была уже нажата на нужном объекте, тогда тестим положение кнопки мыши опять по MouseDown. Если MouseDown не тру (т.е. кнопку отпустили) проверяем положение мыши и если она над нашим объектом - то радуемся этому и делаем задуманное, а если нет - то просто переменную маусдаун сбрасываем в фалс. И все заработает (если правильно напишешь)

moka 28.11.2007 13:28

Re: Обработка клика
 
oxid, у тебя тоже самое, только через мега уОпу ;)
Если заранее инпут выносить в переменные, то не будет проблем, и для нажатия на кнопку, нужно вообще юзать MouseRelease только такой функции нету, и нужно вычислять исходя из MouseDown и MouseHit, совместно с MouseHit

oxid 28.11.2007 14:35

Re: Обработка клика
 
Мока это называется не через жопу а правильное решение поставленной задачи (а через что оно - это фигня), как и у Триллипута с его комбинацией с MouseHit + MouseDown, а ты говоришь только о границах объекта, а не о том, как правильно мышь обработать, что к этому вопросу имеет частичное отношение, поэтому твой код у Триллипута и не заработал.
Плюс отличие моего способа от способа Триллипута в том, что у меня надо нажать и отпустить кнопку на объекте, а у него только нажать.
А твой не через жопусделанный код будет работать только если тестить MouseDown а не MouseHit и срабатывать при нажатии как и у Триллипута, а не при нажатии-отпускании, как у меня. И при этом будет косячить (попробуй потаскать мышей и с MouseHit и с MouseDown и посмотри что будет)
А ты даже не вьехал паччиму твой код не работает у него, в чем отличие приведенного мной способа. Так что имхо размышлять что и у кого и чез что сделано тебе пока рановато.

зы: хотя нет, я прогнал - твой код и с MouseHit работать будет. А не работает у Триллипута он скорее из-за того что он не выносит тестирование MouseHit на начало цикла обработки ВСЕХ объектов (о чем ты не указал), а делает это на каждом объекте. А тут надо понимать особенность этой команды, которая возвращает количество нажатий с момента своего последнего вызова.
т.е. если мы напишем два раза MouseHit, MouseHit после одного нажания кнопки, то первый раз вернется тру, а второй - фалс. Поэтому тестирование MouseHit надо запоминать в переменной перед началом обработки объектов.
Или тестит MouseHit не в каждом цикле обработки :dontknow:

ззы: @Trilliput
Цитата:

MouseHit() - возвращает кол-во нажатий (одинарный или даблклик и тд)
Нет просто через MouseHit ты не отследишь даблклик - почему - см выше.


Часовой пояс GMT +4, время: 16:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot