以下是我在python中尝试做的事情的简化示例(使用pygame,但这可能无关紧要)。
我有一个8x8像素的jpg列表,每个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颜色。
我的问题是如何用课程组织这一切(我正在努力学习OOP)。从逻辑上讲,似乎每个框架都包含正方形,每个正方形包含位置,字母和颜色等变量。但我想你甚至可以把它想象成每个方格'包含'4帧......
我的猜测是制作一个帧类,并将它的4个实例放在一个列表中(如果有4个帧),并以某种方式使每个帧实例包含16个平方实例的列表。可能像frames[2].squares[5].letter = f
一样有用(只是一个模糊的想法;我在OOP上太新了,不知道这是远程正确还是好主意)。但是,看看知道自己正在做什么的人如何组织所有这些将会很有帮助。
谢谢!
答案 0 :(得分:1)
由于帧的大小是固定的,而帧的数量不是,因此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 []
希望这能让你开始。
答案 1 :(得分:0)
替代方法是提出一个合适的通用数据结构,仅由字典,列表,集等组成,然后编写库方法来操作该数据。这听起来并不是非常经典的OOP,但事实并非如此,但我发现这种方式更容易处理,更容易“正确”#。你可以清楚地分开构建数据容器的两个问题,另一方面定义合适的数据操作代码。
正如早先的海报所建议的那样,动画可以被建模为帧列表;然后每个帧包含32个列表,每个列表包含32个元素,或者8个列表,每个元素包含8个元素,其中每个元素再次模拟上面显示的4x4网格。当然,你是否事先预先计算(或简单地定义)每一帧,或者你是否操纵单帧的数据“活着”。在动画期间取决于进一步的考虑。答案 2 :(得分:0)
@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