Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Мне надо реализовать передвижение объекта pygame

help please Ученик (80), на голосовании 2 месяца назад
вот код, можете улучшить так, чтобы rect двигался а не стоял на месте

class DraggableObject:
def __init__(self, image_path, x, y, sc_width, sc_height):
self.image = pygame.image.load(image_path)
self.rect = self.image.get_rect(topleft=(x, y))
self.sc_width = sc_width
self.sc_height = sc_height
self.moving = False

def handle_event(self, event):
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
if self.rect.collidepoint(event.pos):
self.moving = True
# Сохраняем смещение между позицией мыши и углом rect
self.offset_x = self.rect.x - event.pos[0]
self.offset_y = self.rect.y - event.pos[1]
elif event.type == pygame.MOUSEMOTION:
if self.moving:
# Обновляем позицию rect с учетом смещения
mouse_x, mouse_y = event.pos
self.rect.x = mouse_x + self.offset_x
self.rect.y = mouse_y + self.offset_y
elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
self.moving = False

def draw(self, sc):
sc.blit(self.image, self.rect)
Голосование за лучший ответ
Леха Миронов Мастер (2253) 3 месяца назад
Вот улучшенный код, который обеспечивает перемещение объекта rect при нажатии и удерживании левой кнопки мыши:
 import pygame 

class DraggableObject:
def __init__(self, image_path, x, y, sc_width, sc_height):
self.image = pygame.image.load(image_path)
self.rect = self.image.get_rect(topleft=(x, y))
self.sc_width = sc_width
self.sc_height = sc_height
self.moving = False

def handle_event(self, event):
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
if self.rect.collidepoint(event.pos):
self.moving = True
# Сохраняем смещение между позицией мыши и углом rect
self.offset_x = self.rect.x - event.pos[0]
self.offset_y = self.rect.y - event.pos[1]
elif event.type == pygame.MOUSEMOTION:
if self.moving:
# Обновляем позицию rect с учетом смещения
mouse_x, mouse_y = event.pos
self.rect.x = min(max(mouse_x + self.offset_x, 0), self.sc_width - self.rect.width)
self.rect.y = min(max(mouse_y + self.offset_y, 0), self.sc_height - self.rect.height)
elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
self.moving = False

def draw(self, sc):
sc.blit(self.image, self.rect)
В обновленном коде:

В обработчике событий handle_event добавлены проверки, чтобы объект мог двигаться только внутри экрана (в пределах sc_width и sc_height).
Добавлены проверки min и max к позициям x и y, чтобы rect не выходил за пределы экрана.
Похожие вопросы