最早的绘画起源远古人类对于事物的记录,在漫长的发展过程中,绘画由最初的注重外在,而向事物内在进行探寻。从单纯的记录到表达情感,传递思考。因此我选择了用星尘StarDust这个亘古不变的题材,串联起远古和现在,希望使用者能轻松的创作这样一幅星尘的画作。
(1)精简交互的机制。为了让绘画内容颜色和大小能与整体相匹配,我没有使用调色板和画笔大小调整功能,而是跟随用户鼠标随机生成预制的图案。
(2)亲和的画面。为了让整个画面更加亲和,而且减少程序的运算效率,我选择了像素这样一种形式,而且图案绘制很方便,在以后可以继续绘制更多图案,丰富程序内容,有较好的拓展性。
(3)音乐与绘画过程的融合。在实际的绘画过程中,我加入了音乐播放的功能,宁静的音乐中,使用者的绘画会有更强的沉浸感。
用Drawing判断是否开始绘画,开始绘画时生成随机数,判断此时生成那种图案,并且为了避免行星图案过于密集,因此通过随机数对其出现次数进行限制
#笔刷类
class Brush (object):
def __init__(self,screen):
self.drawing = False
self.screen = screen
self.brush_group =pygame.sprite.Group()
#开始绘图
def start_draw (self,pos):
self.drawing = True
#绘图过程
def draw(self, pos,drawflag):
if drawflag == 0:
if self.drawing:
chose = randint(0,4)
chose2 = randint(0,50)
if chose == 0:
brush = Star_1(pos)
self.brush_group.add(brush)
elif chose ==1:
brush = Star_2(pos)
self.brush_group.add(brush)
elif chose ==2:
brush = Star_3(pos)
self.brush_group.add(brush)
elif chose ==3:
brush = Star_4(pos)
self.brush_group.add(brush)
elif chose ==4:
if chose2 == 0:
brush = Sun_1(pos)
self.brush_group.add(brush)
if chose2 >0 and chose2 <=3:
brush = Sun_2(pos)
self.brush_group.add(brush)
if chose2 >3 and chose2<6:
brush = Sun_3(pos)
self.brush_group.add(brush)
if chose2 >6 and chose2<10:
brush = Sun_4(pos)
self.brush_group.add(brush)
#结束绘图
def end_draw(self):
self.drawing =False
继承了pygame.sprite.sprite类,用于让每个星星进行向上移动,初始化图片,碰撞体积,速度
class Star (pygame.sprite.Sprite):
def __init__(self, initial_position,star_surface):
pygame.sprite.Sprite.__init__(self)
self.image = star_surface
self.rect = self.image.get_rect()
self.rect.topleft = initial_position
self.speed = 1
def update(self):
self.rect.top -= self.speed
if self.rect.top < 0:
self.kill()
继承星星父类,初始化三张图片,并根据程序帧数变换更新图片,让图片动起来。
class Star_1(Star):
def __init__ (self,initial_position):
self.star_surfaces = [pygame.image.load("star2_1.png"),
pygame.image.load("star2_2.png"),
pygame.image.load("star2_3.png")]
self.r = randint(0,2)
self.flag = 0
Star.__init__(self,initial_position,self.star_surfaces[self.r])
def update(self,tick):
Star.update(self)
tick = tick//(ANIMATE_CYCLE//3 )
if self.flag != tick :
self.r +=1
self.flag = tick
if self.r >=3:
self.r = 0
self.image = self.star_surfaces[self.r]
初始化,窗口大小,帧数计数
class Painter(object):
def __init__(self):
self.screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Star Dust")
self.brush = Brush(self.screen)
self.clock = pygame.time.Clock()
self.ticks = 0 #帧数计数
计数器更新,监控鼠标事件,更新图片
def run(self):
mouse =pygame.image.load("rock.png")
self.screen.fill((24, 20, 37))
while True:
self.screen.fill((24, 20, 37))
self.clock.tick(FRAME_RATE)
self.ticks +=1
for event in pygame.event.get():
if event.type == QUIT:
return
elif event.type == KEYDOWN:
if event.key == K_ESCAPE:
self.screen.fill((24, 20, 37))
elif event.type == MOUSEBUTTONDOWN:
self.brush.start_draw(event.pos)
elif event.type == MOUSEMOTION:
r = randint(0,2)
self.brush.draw(event.pos,r)
pass
elif event.type == MOUSEBUTTONUP:
self.brush.end_draw()
if self.ticks >= ANIMATE_CYCLE:
self.ticks = 0
self.brush.brush_group.update(self.ticks)
self.brush.brush_group.draw(self.screen)
pygame.display.update()