Я подумал, ребята, возможно, вы поможете мне осмыслить это. Я хочу иметь возможность создавать прямоугольники и назначать изображения этим прямоугольникам. Я делаю это на протяжении всего проекта, и это не слишком сложно. Сложность здесь в том, что я хочу, чтобы эта конкретная функция могла генерировать столько различных прямоугольников, сколько я хочу. Проект представляет собой игру, действие которой происходит как на шахматной доске. Я полагаю, что могу написать как ... if операторы для каждого отдельного пробела, а затем иметь примерно миллиард параметров в функции, которые определяют, какие прямоугольники генерируются и где, но я надеялся, что кто-то сможет придумать более элегантное решение.
Сгенерировать любое количество прямоугольников в pygame
Ответы (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]
.
Вы не сможете явно назвать каждый прямоугольник, но, опять же, вам действительно не нужно.
Примечание: я предполагаю, что вы хотели создать какой-то узор прямоугольников в виде шахматной доски. Я могу отредактировать свой вопрос, если вы конкретно укажете, что пытаетесь сделать.
chessboard[y][x]
. Если вы поменяете местами порядок циклов for, так что вы добавляете по одному столбцу за раз, а не по одной строке за раз, вы можете ссылаться на него, выполнив chessboard[x][y]
.
- person Michael0x2a; 17.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))
затем просто нарисуйте объект плитки, как вы обычно делаете это в каком-нибудь методе рендеринга!
надеюсь, это поможет!!!
Rects
. Но поскольку вы используете Rect и Surface, вы также можете использовать списокSprite
s, который имеет .rect и .image - person ninMonkey   schedule 18.09.2013