如何在pygame中制作具有相同尺寸但位置不同的多个块

时间:2017-04-30 16:58:38

标签: python class pygame

我一直在尝试开始一个基本的2d塔防游戏。我想通过在棕色背景上放置几十个35x35绿色块来设计地图。如何使用一个类来制作多个具有相同尺寸和颜色但位置不同的块?感谢

    import pygame
    pygame.init()
    white = (255,255,255)
    black = (0,0,0)
    grass = (51,204,51)
    dirt = (192,151,111)
    gameDisplay = pygame.display.set_mode((1200,800))
    pygame.display.set_caption('Tower Defense')
    pygame.display.update()


    gameExit = False

    while not gameExit:
        class Player(object):
            def __init__(self):
                self.rect = pygame.draw.rect((64, 54, 16, 16))

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
            #print(event)
        gameDisplay.fill(dirt)
        pygame.draw.rect(gameDisplay,green, [600,400,35,35])
        pygame.display.update()
    pygame.quit()
    quit()

1 个答案:

答案 0 :(得分:0)

你需要使用一个精灵组,它可以容纳任意数量的精灵。使用pygame.rect可以将每个sprite设置为不同的坐标。 这是一个例子:

import pygame
pygame.init()
white = 255,255,255
black = 0,0,0
grass = 51,204,51w
dirt = 192,151,111
gameDisplay = pygame.display.set_mode((1200,800))
pygame.display.set_caption('Tower Defense')

class Player(pygame.sprite.Sprite):
        def __init__(self):
            self.image = pygame.Surface((35,35))
            self.image.fill(color)
            self.rect = self.image.get_rect()
Players = pygame.sprite.Group()

for i in range(#How many of them you want):
    player = Player()
    player.rect.x = i*35
    player.rect.y = i*35
    Players.add(player)

while not gameExit:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameExit = True
        #print(event)
    gameDisplay.fill(dirt)
    Players.draw(window)
    pygame.display.update()
pygame.quit()
quit()

这里发生的事情是我们创建了一个名为" Player"的类,在pygame中使用sprite模块,然后在最后我们添加了一行:

self.rect = self.image.get_rect()

允许自由编辑对象的x和y坐标

然后我们创建了一个精灵组,它可以容纳我们刚刚制作的所有这些对象。好的,一切都很好。现在我们使用for循环来创建任意数量的精灵(您可以将hashtag替换为您需要的玩家数量)。这一行:

player.rect.x = i*35

定义对象的x rect,因为i是每次for循环运行时都会更改的变量,所以它将类似于:

#first loop in the for loop:
player.rect.x = 0*35 = 0 #The x axis is 0

#second loop in the for loop
player.rect.x = 1*35 = 35 #The x axis is 35

#third loop in the for loop
player.rect.x = 2*35 = 70#The x axis is 70

依旧...... 同样的事情适用于y轴。我不太明白你的意思是什么?填满整个屏幕"与对象,因为这只会创建一个空背景。如果要为每个对象设置不同的特定坐标,请使用以下内容替换for循环,用x和y坐标替换主题标签:

player = Player()
player.rect.x = #x coordinate
player.rect.y = #y coordinate
Players.add(player)

你必须重复以下代码很多次,所以如果你想要三个不同的对象和你指定的坐标,那么你必须做这样的事情:

player = Player()
player.rect.x = #x coordinate
player.rect.y = #y coordinate
Players.add(player)

player.rect.x = #x coordinate
player.rect.y = #y coordinate
Players.add(player)

player.rect.x = #x coordinate
player.rect.y = #y coordinate
Players.add(player)

这是相当漫无边际的,所以简而言之:

  • 你将self.rect = self.image.get_rect()添加到你做的任何精灵类中,允许它被更改
  • 要更改它,请使用:" player.rect.x =#x"和" player.rect.y =#y"
  • 如果您希望将这些对象放置在屏幕上的某种序列,则可以使用上面第一个示例中显示的for循环,该对象在屏幕上对角设置这些对象
  • 如果关于设置对象的位置没有任何关系,您可以简单地使用第6个代码示例中显示的代码,根据您想要的对象重复次数,重复次数

很抱歉,如果这太难理解,但我希望它有所帮助!

P.S:确保在创建类时使用pygame.sprite.Sprite而不是对象创建它,就像在代码中一样。