下面是我尝试用python (使用pygame,但这可能无关紧要)所做的事情的一个简化示例。
我有一个8x8像素的jpgs列表,每个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的flash左右交替,而f向西南移动:
bbnf nnbb bbnn nnbb
bbnn nnfb bbnn nnbb
bbnn nnbb bfnn nnbb
bbnn nnbb bbnn fnbb我想要控制每一帧中每个方块的字母值来制作任何动画,所以我猜基本上有64个独立的变量(对于像上面所示的4帧动画)。每个正方形也有一个x,y列表位置变量和rbg颜色。
我的问题是如何通过类来组织这一切(我正在尝试学习OOP)。从逻辑上讲,似乎每个框架都包含正方形,每个正方形包含位置、字母和颜色等变量。但我想你甚至可以把它想象成每个正方形包含4帧……我的猜测是创建一个frame类,并将它的4个实例放在一个列表中(如果有4个frame ),并以某种方式使每个frame实例包含一个16个正方形实例的列表。也许可以像frames[2].squares[5].letter = f一样使用(只是一个模糊的想法;我在OOP方面太新了,不知道这是不是一个好主意)。但看看知道自己在做什么的人是如何组织这一切的,这将是有帮助的。谢谢!
发布于 2011-02-07 01:42:12
由于帧的大小是固定的,而帧的数量不是固定的,因此制作class Frame似乎是一个很好的首选。每个Frame将包含一个成员grid,它可以是包含四个字母的四个列表的列表。四个字符串的列表不能很好地工作,因为字符串是不可变的,尽管它是一个16个字符的字符串可能性能更好。你得先做个侧写才能确定。对于这个答案,我将假设您将使用一个字符列表。
然后创建一个具有frames成员的class Animation,该成员是一个框架列表。然后,您将编写如下代码:
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 []希望这篇文章能帮你入门。
发布于 2011-02-07 03:09:32
另一种方法是提出一个合适的通用数据结构,完全由字典、列表、集合等组成,然后编写库方法来操作这些数据。这听起来并不是非常经典的OOP,它也不是,但我发现这种方式更容易处理,更容易“正确”。您可以清楚地将构建数据容器和定义适当的数据操作代码这两个问题分开。
正如早先的海报所建议的那样,动画可以建模为帧的列表;然后每个帧包含32个列表,每个列表包含32个元素,或者包含8个列表,每个列表中的每个元素都是上面所示的4x4网格。当然,您是否真的预先计算(或简单地定义)每一帧,或者您是否在动画过程中操纵单个帧的数据,这取决于进一步的考虑。
发布于 2011-02-07 04:29:34
@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].colorGridhttps://stackoverflow.com/questions/4914939
复制相似问题