Сгенерировать любое количество прямоугольников в pygame

Я подумал, ребята, возможно, вы поможете мне осмыслить это. Я хочу иметь возможность создавать прямоугольники и назначать изображения этим прямоугольникам. Я делаю это на протяжении всего проекта, и это не слишком сложно. Сложность здесь в том, что я хочу, чтобы эта конкретная функция могла генерировать столько различных прямоугольников, сколько я хочу. Проект представляет собой игру, действие которой происходит как на шахматной доске. Я полагаю, что могу написать как ... if операторы для каждого отдельного пробела, а затем иметь примерно миллиард параметров в функции, которые определяют, какие прямоугольники генерируются и где, но я надеялся, что кто-то сможет придумать более элегантное решение.


person red_always_mafia    schedule 17.09.2013    source источник
comment
Я просто подумал о возможном решении, используя цикл for с параметром, сообщив ему, сколько прямоугольников я хочу сгенерировать, но я все еще застрял в том, как я назову эти прямоугольники? есть ли способ называть переменные переменными? Как ... Прямоугольник (+ x), а затем как X + 1 в цикле. Таким образом, это будет Rect1, rect2 и т. Д.   -  person red_always_mafia    schedule 17.09.2013
comment
Вы бы составили обычный список, содержащий Rects. Но поскольку вы используете Rect и Surface, вы также можете использовать список Sprites, который имеет .rect и .image   -  person ninMonkey    schedule 18.09.2013


Ответы (2)


Вы можете использовать два вложенных цикла «for» -

def make_chessboard(upper_x=0, upper_y=0, size=30):
    chessboard = []

    for y in range(8):
        row = []
        for x in range(8):
            coords = (upper_x + x * size, upper_y + y * size)
            row.append(pygame.Rect(coords, (size, size)))
        chessboard.append(row)
    return chessboard

Затем, чтобы получить прямоугольник в верхнем левом углу, вы можете сделать chessboard[0][0]. Чтобы получить прямоугольник в правом верхнем углу, вы можете сделать chessboard[0][7].

Вы не сможете явно назвать каждый прямоугольник, но, опять же, вам действительно не нужно.

Примечание: я предполагаю, что вы хотели создать какой-то узор прямоугольников в виде шахматной доски. Я могу отредактировать свой вопрос, если вы конкретно укажете, что пытаетесь сделать.

person Michael0x2a    schedule 17.09.2013
comment
Таким образом создается список из 64 прямоугольников, на которые я могу ссылаться с помощью Chessboard [x] [y]? - person red_always_mafia; 17.09.2013
comment
@ user2765554 - закрыть, на него можно ссылаться, выполнив chessboard[y][x]. Если вы поменяете местами порядок циклов for, так что вы добавляете по одному столбцу за раз, а не по одной строке за раз, вы можете ссылаться на него, выполнив chessboard[x][y]. - person Michael0x2a; 17.09.2013
comment
Надеюсь, ты все еще здесь. Когда я только что попробовал copypasta, он дал мне неверный синтаксис на chessboard.append, выделив шахматную доску. - person red_always_mafia; 18.09.2013
comment
@ user2765554 - ах, извините. Я забыл закрыть скобку в строке выше. Это должно быть исправлено сейчас. - person Michael0x2a; 18.09.2013

class ChessTile(pygame.sprite.Sprite):

    def __init__(self, image, location):
        pygame.sprite.Sprite.__init__(self)

        self.image = image.convert()
        self.mask = pygame.mask.from_surface(self.image)
        self.rect = pygame.Rect(location, self.image.get_size())

Затем создайте другой метод с названием «MakeBoard». Вызовите MakeBoad и установите цикл с размером платы. поэтому псевдокод будет:

(предположим, что img - это белый или черный квадрат 32x32)

for y in range(0,7):
    for x in range(0,7):
        # alternate the tile image from black/white before calling ChessTile with it
        # the location parameter is going to be x*32,y*32.. something like that
        # so you'd have a tile at (0,0) then at (32,0), then (64,0), etc...
        # after the first "j" run is done, "i" increments so now we have
        # (0, 32), (32, 32), etc etc.
        # 
        tile = ChessTile(img, (x,y))

затем просто нарисуйте объект плитки, как вы обычно делаете это в каком-нибудь методе рендеринга!

надеюсь, это поможет!!!

person Daniel    schedule 17.09.2013