Часть 4. ДВИЖЕНИЕ ОБЪЕКТОВ МЫШКОЙ
Изменения в файлах:
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
А как отцепить от того или иного объекта курсор?
ОтветитьУдалить