动态像素绘画——StarDust

动态像素绘画——StarDust

对绘画的思考:

  最早的绘画起源远古人类对于事物的记录,在漫长的发展过程中,绘画由最初的注重外在,而向事物内在进行探寻。从单纯的记录到表达情感,传递思考。因此我选择了用星尘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()

星星1

  继承星星父类,初始化三张图片,并根据程序帧数变换更新图片,让图片动起来。

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]

Painter类

  初始化,窗口大小,帧数计数

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()

猜你喜欢

转载自blog.csdn.net/MarsYYP/article/details/85392073