可拖动精灵的可拖动屏幕

Draggable screen that drags sprites

我正在尝试制作一款可以拖动背景或屏幕的 2D 游戏。发生这种情况时,我希望所有精灵都随之移动。我该如何实施?

您需要检测 MOUSEMOTION 事件,然后使用 event.buttons 检查是否单击了左按钮。从那里,您可以获得屏幕已被拖动(水平和垂直)的像素数,以找到屏幕应设置到的新位置,从而找到精灵的新位置。下面的工作示例:

import pygame
from pygame.locals import *
from random import randrange

# init global variables
left_btn = 0
cur_x = 0  # current X position
cur_y = 0  # current Y position
go = True
img_pos = pygame.Rect((0, 0), (0, 0))

# Sprite object
class Sprite(pygame.sprite.Sprite):
    def __init__(self, color, width, height):
        super().__init__()
        self.width = width
        self.height = height
        self.image = pygame.Surface([width, height])
        pygame.draw.rect(self.image, color, pygame.Rect(0, 0, width, height))
        self.rect = self.image.get_rect()
  
    def update(self, x, y):
        self.rect = Rect(self.rect.x + x, self.rect.y + y, self.width, self.height)

# init display
pygame.display.init()
screen = pygame.display.set_mode((800, 600))
img = pygame.image.load('my_image.png')

# Create random Sprites
all_sprites_list = pygame.sprite.Group()
for _ in range(10):
    c = (randrange(255), randrange(255), randrange(255))
    s = Sprite(c, 20, 20)
    s.rect.x = randrange(500)
    s.rect.y = randrange(500)
    all_sprites_list.add(s)

while go:    
    for e in pygame.event.get():
        if e.type == pygame.QUIT: go = False
        if e.type == MOUSEMOTION:
            if e.buttons[left_btn]:
                rel = e.rel
                img_pos.x += rel[0]
                img_pos.y += rel[1]

    # calculate diff in X and Y positions
    x = img_pos.x - cur_x
    y = img_pos.y - cur_y
    
    # update Sprites' position
    all_sprites_list.update(x, y)
    
    # update current X and Y positions
    cur_x = img_pos.x
    cur_y = img_pos.y
    
    screen.fill(0)
    screen.blit(img, img_pos) # update screen's position
    all_sprites_list.draw(screen)
    pygame.display.flip()
    pygame.time.delay(30)
  
pygame.quit()