可拖动精灵的可拖动屏幕
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()
我正在尝试制作一款可以拖动背景或屏幕的 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()