forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Проблема с быстрым перемещением Изображения (http://forum.boolean.name/showthread.php?t=14075)

Sora_Musoka 17.01.2011 23:56

Проблема с быстрым перемещением Изображения
 
Вложений: 1
Задача: цепляем изображение Курсором и перетаскиваем.
Проблема: Image отстает при "быстром" перемещении курсора, а если сказать точнее - нужно передвигать оооочень аккуратно.

Кто знает как решить проблему?

Вот простой пример:

Код:

Graphics 800, 600

SetBuffer BackBuffer()
HidePointer

Global cursor=LoadImage("cursor.png")
Global image=LoadImage("image.jpg")
Global x = 400
Global y = 300

Repeat

If ImagesOverlap (cursor , MouseX(), MouseY(), image, x, y) And MouseDown(1) Then
        x = MouseX()
        y = MouseY()
EndIf

Cls
DrawImage image, x, y
DrawImage cursor, MouseX(), MouseY()

Flip       
Until KeyHit(1)
End


.Squid 18.01.2011 00:17

Ответ: Проблема с быстрым перемещением Изображения
 
Никак. Указатель мыши обновляется и рисуется отдельно от остальной графики и ГУИ в Винде. Он рисутеся чуть не прямо в видеопамять.

Reizel 18.01.2011 01:49

Ответ: Проблема с быстрым перемещением Изображения
 
Врет. Попросту запоминаем, если MouseHit() и мышь пересекает картинку, запоминаем координаты (относительные) щелчка+Переменную Var в true, потом в цикле
if(MouseDown() and Var)
координаты картинки=кординаты мыши-относительные координаты

RBK 18.01.2011 01:57

Ответ: Проблема с быстрым перемещением Изображения
 
Используй фантазию, на блице многое сделать можно.
Код:

Graphics3D 800, 600, 32, 0
SetBuffer BackBuffer()
HidePointer

Global cursor=LoadImage("cursor.png")
Global image=LoadImage("image.jpg")
Global x = 400
Global y = 300

action = 0

Repeat

If action
  If Not MouseDown( 1 )
    action=0
  Else
    x = x + MouseXSpeed()
    y = y + MouseYSpeed()
  End If
Else
  If ImagesOverlap (cursor , MouseX(), MouseY(), image, x, y) And MouseDown(1)
    action=1
    MouseXSpeed()
    MouseYSpeed()
  End If
EndIf

Cls
DrawImage image, x, y
DrawImage cursor, MouseX(), MouseY()

Flip       
Until KeyHit(1)
End


pax 18.01.2011 02:25

Ответ: Проблема с быстрым перемещением Изображения
 
Цитата:

Сообщение от RBK (Сообщение 176047)
Используй фантазию, на блице так многое сделать можно.
Код:

Repeat
...
RenderWorld

Cls
...
Flip       
Until KeyHit(1)


Можно ржать? Или так правда нормально работает? Что-то я запамятовал... хотя кажется что ржать можно :-D

SBJoker 18.01.2011 02:28

Ответ: Проблема с быстрым перемещением Изображения
 
Да тут над всеми кроме сквида можно ржать, за хардварным курсором никогда неуспеть.

RBK 18.01.2011 02:38

Ответ: Проблема с быстрым перемещением Изображения
 
Цитата:

Сообщение от SBJoker (Сообщение 176049)
Да тут над всеми кроме сквида можно ржать, за хардварным курсором никогда неуспеть.

А код я так, для красоты написал.

pax да, что-то пропустил пару лишних команд, когда правил код. Сейчас исправлю.

Sora_Musoka 18.01.2011 08:14

Ответ: Проблема с быстрым перемещением Изображения
 
RBK спасибо, код то что надо.

Фантазии нет, потому и обращаюсь к "фантазерам".

RBK 18.01.2011 12:27

Ответ: Проблема с быстрым перемещением Изображения
 
Обращайся конечно, здесь всегда есть люди способные ответить на сложный (или не очень сложный) вопрос.

Фантазию надо развивать, она важный элемент творчества.

ABTOMAT 18.01.2011 12:57

Ответ: Проблема с быстрым перемещением Изображения
 
Как вариант - отключить виндовый курсор и нарисовать свой собственный.

RBK 18.01.2011 13:45

Ответ: Проблема с быстрым перемещением Изображения
 
Цитата:

Сообщение от ABTOMAT (Сообщение 176076)
Как вариант - отключить виндовый курсор и нарисовать свой собственный.

Ответил не глядя? Молодец!... телепатом будешь.

(см. код в первом посте, курсор уже отключен и нарисован собственный)

SBJoker 18.01.2011 16:10

Ответ: Проблема с быстрым перемещением Изображения
 
Цитата:

Сообщение от RBK (Сообщение 176050)
А код я так, для красоты написал.

если ты такой умный то что сам неразберешся?

А если по делу то как ты считаешь, вычисление скоростей мышки по X и Y происходит в тоже самое время как ты желаешь узнать координаты мышки, или всёже немного раньше?

Правильным будет по зажатию мышки выставлять флаг указывающий что начан процес Drag&Drop запоминать начальное положение картинки и курсора.

Далее рисовать курсор по координатам, а картинку по координатам расчитываемым по формуле:
new_image_x = last_image_x + (current_cursor_x - last_cursor_x)
и аналогично для y.
По отпускании мыши мы можем провреить допустимость такого перемещения и если надо отменить его (просто востановив положение картинки по предварително сохраненым координатам), или скорректировать и утвердить полученные координаты по выше приведенной формуле в качестве текущих.

Касаемо твоего кода, можно попробывать тупо вычислять новое положение картинки после рисования курсора по координатам. Хотя асинхронность изменения координат мыши непозволит достигнуть требуемой синхронизации без фиксации координат в переменных и вычисления скоростей перемещения на их основе).

RBK 18.01.2011 17:09

Ответ: Проблема с быстрым перемещением Изображения
 
Цитата:

А код я так, для красоты написал.
SBJoker это был сарказм, а не вопрос.

Давай разберем код вместе, если запустить и посмотреть не хочешь:
Цитата:

Правильным будет по зажатию мышки выставлять флаг указывающий что начан процес Drag&Drop запоминать начальное положение картинки и курсора.
см. перем. action

Цитата:

А если по делу то как ты считаешь, вычисление скоростей мышки по X и Y происходит в тоже самое время как ты желаешь узнать координаты мышки, или всёже немного раньше?

...
Далее рисовать курсор по координатам, а картинку по координатам расчитываемым по формуле:
new_image_x = last_image_x + (current_cursor_x - last_cursor_x)
и аналогично для y.
Да, в тоже самое время как я желаю узнать
speed_cursor_x=speed_cursor_x+(current_cursor_x - last_cursor_x) вот както так работает MouseXSpeed()

Цитата:

По отпускании мыши мы можем провреить допустимость такого перемещения
Эта проверка уже реализована в самом блитце.

P.S. SBJoker ты сообщай кому пишешь ответ, а то возможны такие недоразумения.(в ответе ничего менять не буду, пусть будет комментарием к коду, пост№4)

SBJoker 18.01.2011 17:55

Ответ: Проблема с быстрым перемещением Изображения
 

RBK 18.01.2011 18:13

Ответ: Проблема с быстрым перемещением Изображения
 
:)

Ладно, на вопрос темы мы все ответили, новых вопросов не было: тему можно закрывать


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

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