我有一条垂直线的图像,想要创建其中两条。我希望它们随机分开并缩小间隙(同时保持最小和最大距离 - 我等待先修复它),同时沿x轴移动。 y coords不动。
有许多使用pygame创建更复杂的精灵和游戏的例子,但是我找不到一个足够简单来确定我应该做的事情,所以任何帮助都会受到赞赏。此代码基于找到here.
的简单示例这是我到目前为止的最基本的代码。
class Squeeze(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.img_load()
def update(self):
self.rect.x += random.randint(-1, 1)
if self.rect.x >= 1920:
self.rect.x += -1
if self.rect.x <= 0:
self.rect.x += 1
def img_load(self):
self.image = pygame.Surface([SCREEN_WIDTH, SCREEN_HEIGHT])
self.image.fill(BLACK)
self.rect = self.image.get_rect()
pygame.init()
SCREEN_WIDTH = 1920
SCREEN_HEIGHT = 1080
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
FPS = 60
wall = pygame.image.load('wall.png')
wall_list = pygame.sprite.Group()
BLACK = (0, 0, 0)
for i in range(2):
wall = Squeeze()
wall.rect.x = random.randrange(SCREEN_WIDTH)
wall.rect.y = random.randrange(SCREEN_HEIGHT)
wall_list.add(wall)
done = False
clock = pygame.time.Clock()
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill(BLACK)
wall_list.update()
wall_list.draw(screen)
clock.tick(60)
pygame.display.flip()
pygame.quit()
我对pygame.sprite.Group()交易感到困惑。如何分别加载和操作这两个图像?任何其他建议也值得赞赏。
答案 0 :(得分:1)
基本上“精灵”是游戏中的可见游戏对象。 Pygames pygame.sprite.Sprite
类被称为所有这些对象的“基类”。
每次创建Squeeze
类时,派生形式的Pygames内置精灵基类:
class Squeeze(pygame.sprite.Sprite):
def __init__(self):
...
pygame.sprite.Sprite
类的每个对象(或实例)都包含
.update()
方法和.image
和.rect
属性。正如documentation所述,“* ...派生类将要覆盖Sprite.update()
并指定Sprite.image
和Sprite.rect
属性。*”
您是通过在img_load()
课程的__init__()
方法中调用Squeeze
方法来完成此操作的。
问题是,您的.rect
被指定为与屏幕相同的尺寸(self.image = pygame.Surface([SCREEN_WIDTH, SCREEN_HEIGHT])
),而.image
属性与您的显示屏幕颜色相同,所以您可以看到了。
尝试将img_load()
方法修改为
def img_load(self, img):
self.image = img
self.rect = self.image.get_rect()
如您所见,修改后的img_load()
方法需要一个图像对象 - 它将传递给img
参数。因此,您还需要更改__init__()
方法:
def __init__(self, img):
pygame.sprite.Sprite.__init__(self)
self.img_load(img)
当现在实例化(例如创建类的对象)Squeeze
对象时,需要将图像(在我们的例子中为wall_img
)传递给构造函数:
#... main programm
wall_img = pygame.image.load('wall.png') #load an image
wall_list = pygame.sprite.Group() #create a sprite group
BLACK = (0, 0, 0)
for i in range(2):
wall = Squeeze(wall_img) #create a sprite
wall.rect.x = random.randrange(SCREEN_WIDTH)
wall.rect.y = random.randrange(SCREEN_HEIGHT)
wall_list.add(wall) #add the sprite to the sprite group
您使用的第二个内置类是pygame.sprite.Group
类 - 一个容器,可以容纳和管理(修改)它包含的精灵。
调用精灵组实例的.update()
方法,Pygame 会自动调用此组中所有精灵的update()
方法。这意味着您可以通过实现其update()
方法来控制精灵行为,如下所示:
#update method of the Squeeze class
def update(self):
#any logic which changes sprite
self.rect.x += random.randint(-1, 1)
if self.rect.x >= 1920:
self.rect.x += -1
if self.rect.x <= 0:
self.rect.x += 1
致电
wall_list.draw(screen)
使用源表面的screen
属性以及位置.image
,您的spites将被置于.rect
曲面上。
如果您现在不想拥有不同的图像,只需将其他图像(或曲面)传递给Squeeze
构造函数:
#... main programm
wall_imgs = [pygame.image.load('wall.png'),
pygame.image.load('other_wall.png')] #load images in list
wall_list = pygame.sprite.Group() #create a sprite group
BLACK = (0, 0, 0)
for i in range(2):
wall = Squeeze(wall_imgs[i]) #create a sprite
wall.rect.x = random.randrange(SCREEN_WIDTH)
wall.rect.y = random.randrange(SCREEN_HEIGHT)
wall_list.add(wall) #add the sprite to the sprite group
我希望这会对你有所帮助:)。