Python Класс / Экземпляр / Объект Организация Вопрос - PullRequest
1 голос
/ 06 февраля 2011

Ниже приведен упрощенный пример того, что я пытаюсь сделать на python (с pygame, но это, вероятно, не имеет значения).

У меня есть список 8x8 пикселей jpgs, каждый из которых изображает английскую букву:

[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]

Я хочу расположить сетку 4x4 по любому желаемому шаблону как большую картинку 32x32:

gmmg
gppg
gppg
gmmg

Но этот шаблон - только один кадр анимации. Например, мне может понадобиться 4 кадра анимации, в которых поперечные стороны b и n будут попеременно, пока f движется на юго-запад:

bbnf nnbb bbnn nnbb
bbnn nnfb bbnn nnbb
bbnn nnbb bfnn nnbb
bbnn nnbb bbnn fnbb

Я хочу, чтобы контроль над буквенным значением каждого квадрата в каждом кадре создавал любую анимацию, поэтому я предполагаю, что, по сути, существует 64 отдельные переменные (для 4-кадровой анимации, как показано выше). Каждый квадрат также имеет переменную положения списка [x, y] и цвет rbg.

У меня вопрос, как все это организовать с помощью классов (я пытаюсь выучить ООП). Логически кажется, что каждый кадр содержит квадраты, а каждый квадрат содержит переменные, такие как положение, буква и цвет. Но я полагаю, вы могли бы даже подумать об этом, поскольку каждый квадрат "содержит" 4 кадра ... Я предполагаю, что создайте класс фреймов и поместите 4 экземпляра в список (если есть 4 фрейма) и каким-то образом сделайте так, чтобы каждый экземпляр фрейма содержал список из 16 квадратных экземпляров. Может быть пригоден для использования как frames[2].squares[5].letter = f (просто нечеткая идея; я слишком новичок в ООП, чтобы знать, является ли это дистанционно правильным или хорошей идеей). Но было бы полезно посмотреть, как все это организует тот, кто знает, что они делают. Спасибо!

Ответы [ 3 ]

1 голос
/ 06 февраля 2011

Поскольку размер кадра фиксирован, а количество кадров - нет, то выбор class Frame кажется хорошим первым выбором.Каждый Frame будет содержать член grid, который может быть списком из четырех списков из четырех букв.Список из четырех строк не сработает, так как строки являются неизменяемыми, хотя наличие одной строки из 16 символов может работать лучше.Вы должны были бы профиль, чтобы быть уверенным.В этом ответе я предполагаю, что вы идете со списком списков символов.

Затем создайте class Animation с элементом frames, который представляет собой список фреймов.Затем вы напишите код, который выглядит следующим образом:

myAnimation.frames[10].grid[2][3] = 'f'

Я могу предоставить более подробную информацию, если это необходимо.

ПРИМЕР: (еще не проверял, нооно должно быть близко. Надеемся, что комментарии к документу должны работать с doctest.)

import string

class Frame(object):
    """This is a single frame in an animation."""
    def __init__(self, fill=None, color=None):
        """Initializes the frame.

        >>> f = Frame()
        >>> f.print()
        aaaa
        aaaa
        aaaa
        aaaa
        >>> g = Frame(fill='c', color=(0, 255, 0))
        >>> g.print()
        cccc
        cccc
        cccc
        cccc
        """
        if fill is None:
            fill = 'a' # Or whatever default you want
        self.letterGrid = []
        for row in range(4):
            self.letterGrid.append([fill for col in range(4)])

        if color is None:
            color = (0, 0, 0)
        self.colorGrid = []
        for row in range(4):
            self.letterGrid.append([fill for col in range(4)])

    def set_grid(self, row, col, letter=None, color=None):
        """Sets the letter and/or color at the given grid.

        >>> f.set_grid(1, 1, 'b', (255, 0, 0))
        >>> f.print()
        aaaa
        abaa
        aaaa
        aaaa
        >>> f.set_grid(1, 3, letter='x')
        >>> f.print()
        aaaa
        abax
        aaaa
        aaaa
        >>> f.set_grid(3, 3, color=(255, 0, 0))
        """
        if letter is not None:
            self.letterGrid[row][col] = letter
        if color is not None:
            self.colorGrid[row][col] = color

    def position(row, col):
        return (row * 16, col * 16)

    def print(self):
        """Simple routine to print a frame as text."""
        for row in self.letterGrid:
            print(''.join(row))

class Animation(object):
    def __init__(self, frames=None):
        """Initializes an animation."""
        self.frames = frames or []

Надеюсь, это поможет вам начать работу.

0 голосов
/ 06 февраля 2011

@ Mike (количество ответов, указанных выше, ограничено 600 символами, поэтому я думаю, что я покажу свой ответ здесь) Это моя попытка в классе Frame до сих пор. Я не знаю, должен ли я определять один класс внутри другого или нужно ли или как отправлять список экземпляров в класс Animation или что-то в этом роде. У каждого квадрата может быть уникальная буква, позиция и цвет (позиция, потому что я хочу, чтобы столбцы или строки были позиционно смещаемыми). Вот почему я поместил 3 типа сеток (не уверен, что это хорошая идея, или у отдельного квадрата тоже должен быть свой класс или что-то в этом роде).

class Frame(object):
    def __init__(self, letterGrid, positionGrid, colorGrid):
        self.letterGrid = letterGrid
        self.positionGrid = positionGrid
        self.colorGrid = colorGrid

class Animation(object):
    def __init__(self, frames):
        self.frames = frames

frames = []
frames.append(Frame( [
                    ['b','b','n','f'],
                    ['b','b','n','n'],
                    ['b','b','n','n'],
                    ['b','b','n','n'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]],
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]],
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]],
                    [[0,0,255],[0,0,0],[0,0,0],[0,0,0]] ]
                    ))

frames.append(Frame( [
                    ['n','n','b','b'],
                    ['n','n','f','b'],
                    ['n','n','b','b'],
                    ['n','n','b','b'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]],
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]],
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]],
                    [[0,0,0],[0,0,255],[0,0,0],[0,0,0]] ]
                    ))

frames.append(Frame( [
                    ['b','b','n','n'],
                    ['b','b','n','n'],
                    ['b','f','n','n'],
                    ['b','b','n','n'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]],
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]],
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]],
                    [[0,0,0],[0,0,0],[0,0,255],[0,0,0]] ]
                    ))

frames.append(Frame( [
                    ['n','n','b','b'],
                    ['n','n','b','b'],
                    ['n','n','b','b'],
                    ['n','n','b','b'] ],

                    [
                    [[0,0],[16,0],[32,0],[48,0]],
                    [[0,16],[16,16],[32,16],[48,16]],
                    [[0,32],[16,32],[32,32],[48,32]],
                    [[0,48],[16,48],[32,48],[48,48]] ],

                    [
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]],
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]],
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]],
                    [[0,0,0],[0,0,0],[0,0,0],[0,0,255]] ]
                    ))

print "3rd frame's colorGrid:\n", frames[2].colorGrid
0 голосов
/ 06 февраля 2011

альтернативным подходом было бы придумать подходящую общую структуру данных, состоящую исключительно из словарей, списков, наборов и т. Д., А затем написать библиотечные методы для манипулирования этими данными.это не звучит очень классически ООП, и это не так, но я обнаружил, что этот способ проще в обращении и легче «разобраться».Вы можете четко разделить две проблемы создания контейнеров данных, с одной стороны, и определения подходящего кода для манипулирования данными, с другой.

, как предлагали более ранние плакаты, анимация могла быть смоделирована как список кадров;тогда каждый кадр содержит либо 32 списка по 32 элемента в каждом, либо 8 списков по 8 элементов в каждом, где каждый элемент снова моделирует сетку 4x4, показанную выше.Конечно, зависит от того, будете ли вы на самом деле предварительно вычислять (или просто будете определять) каждый кадр заранее или будете ли вы манипулировать данными «живого» кадра одного кадра во время анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...