Часть 4. ДВИЖЕНИЕ ОБЪЕКТОВ МЫШКОЙ

Рабочие файлы этого урока в (Архиве .zip), и на Github: Перемещение объектов мышкой
Изменения в файлах:
models.py → Класс объектов GameObject изменен и доработан
roguelike.py → Добавлена функция захвата и перемещения объектов мышкой.
Более подробное описание урока Далее...

В этом уроке добавлена возможность перемещения объектов мышкой. Для этого доработан класс GameObject(ранее он назывался gameObj) и вывод названия объекта теперь срабатывает на правую кнопку мыши.

Для захвата объектов, в класс GameObject в скрипте models.py файле добавлен флаг self.followMouse, если он установлен в True, объект должен двигаться вместе с указателем мыши.

В файле roguelike.py внутри кода определения объекта при клике мышкой, добавлены строки:
if pygame.mouse.get_pressed()[2]: ### Если нажата правая кнопка мыши
    textObjectList.append(new_text_obj) # Добавляем новую надпись(текстовый объект) в список всех надписей

curObj.followMouse = True ### устанавливаем флаг следования за мышкой(захватываем объект мышкой)
curObj.followMouseOffset = [mouse_pos[0] - curObj.pos[0], mouse_pos[1] - curObj.pos[1]] ### смещение мышки относительно нулевых координат области объекта
Для удобства, вывод названия объекта срабатывает теперь на правую кнопку мыши. Проверка состояния правой кнопки мыши делается функцией pygame.mouse.get_pressed[2].
Далее устанавливается флаг followMouse и вычисляется смещение мыши относительно левого верхнего угла рамки объекта(координаты 0,0). Смещение нужно, чтобы указатель не слетал на нулевую позицию рамки объекта во время движения.


Далее в цикле отрисовки объектов, для каждого из них проверяется флаг следования на мышкой followMouse:
if curObj.followMouse: ### Если установлен флаг следования за мышкой (объект взят) 
     ### получение состояния нажатия всех кнопок мыши
    if pygame.mouse.get_pressed()[0]: ### проверяем, нажата ли левая кнопка мыши
        newPosX = mouse_pos[0] - curObj.followMouseOffset[0] ### высчитываем новую позицию с учетом смещения X-координату
        newPosY = mouse_pos[1] - curObj.followMouseOffset[1] ### Y-координату
        curObj.setPosition([newPosX,newPosY]) ### при зажатой кнопке мыши, переносим объект на текущую позицию мыши
    else: ### если левая кнопка мыши не нажата 
        curObj.followMouse = False ### отключаем следование за мышью(бросаем объект)
        gameObjectList.sort(key=lambda x: x.pos[1]+x.lowestY) ### снова сортируем объекты в правильном порядке по самому нижнему пикселю
Если он установлен, позиция объекта двигается на позицию указателя мыши с учетом смещения followMouseOffset. Далее идет проверка, отпущена ли левая кнопка мыши, чтобы положить объект и больше не двигать вместе с курсором. В конце делается повторная сортировка объектов по самой нижней точке lowestY, чтобы объекты перекрывали друг друга после смены позиции.

Теперь мы можем двигать объекты мышкой:


Вопросы, замечания и обсуждение в Discord: https://discord.gg/hqx6Kg9

Комментарии

  1. А как отцепить от того или иного объекта курсор?

    ОтветитьУдалить

Отправить комментарий